java网络编程

Socket:套接字,用于java网络编程的接口和一种机制,用套接字中的相关函数来建立连接和完成通信,socket可以看成在两个程序进行通信连接中的一个端点。

将区分不同应用程勋进程的三个参数1.通信的目的地IP地址 2.使用的传输层协议 3.使用的端口号与一个socket绑定。

1.每一个socket用一个半相关描述:(协议,本地地址,本地端口)

2.“套接字”或者“插座”(socket)也是一种软件形式的抽象,用于表达两台机器之间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象他们之间有一条虚拟的“线缆”。线缆的每一端都插入一个“套接字”或“插座”里。

3.套接字,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

  应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需通过同一个TCP协议端口传输数据。为了区别不同的应用程序和连接,许多计算机操作系统为应用程序与TCP/IP协议提供了称为套接字(Socket)的接口。

4.区分不同应用程序进程间的网络通信和连接,主要有三个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是“插座”。通过将这三个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

5.Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。

基于TCP的Scoket编程

利用TCP协议进行通信两个应用程序,有主从之分,一个称为Server,另一个称为Client。

交互过程

  1.服务器程序创建一个ServerSocket,然后调用accept方法等待客户机来连接。

  2.客户端程序创建一个Socket并请求与服务器简历连接。

  3.刚才建立了连接的两个Socket在一个单独的线程上对话。

  4.服务器开始等待新的连接。

 1 public class Server {
 2 private static ServerSocket serverSocket;
 3 
 4     //自己请求本机访问一次。
 5     public static void main(String[] args) {
 6         // TODO Auto-generated method stub
 7         try {
 8             serverSocket = new ServerSocket(8888);
 9             Socket socket = null;
10             int count = 0;
11             // 2.调用accep()方法开始监听,等待客户端请求。
12             System.out.println("**服务器已经启动,等待请求**");
13             while (true) {
14                 socket = serverSocket.accept();
15                 ServerThread serverThread = new ServerThread(socket);
16                 serverThread.start();
17                 count++;
18                 System.out.println("当前客户端的数量是:"+count);
19             }
20         } catch (IOException e) {
21             // TODO Auto-generated catch block
22             e.printStackTrace();
23         }
24 
25     }
26 
27 }
 1 public class Client {
 2 
 3     public static void main(String[] args) {
 4         try {
 5             // 创建客户端socket,指定服务器的地址和端口
 6             Socket socket = new Socket("192.168.74.2", 8888);
 7             // 获取输出流,字节流。
 8             OutputStream outputStream = socket.getOutputStream();
 9             PrintWriter out = new PrintWriter(outputStream);
10             out.write("用户名:admin;密码:135");
11             out.flush();
12             socket.shutdownOutput();
13             // 客户端接收服务器端响应
14             InputStream is = socket.getInputStream();
15             BufferedReader br = new BufferedReader(new InputStreamReader(is));
16             String data = null;
17             while ((data = br.readLine()) != null) {
18                 System.out.println("我是客户端,服务器端说:" + data);
19             }
20             br.close();
21             is.close();
22             out.close();
23             outputStream.close();
24             socket.close();
25         } catch (UnknownHostException e) {
26             e.printStackTrace();
27         } catch (IOException e) {
28             e.printStackTrace();
29         }
30 
31     }
32 
33 }
public class ServerThread extends Thread {
    Socket socket = null;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub

        // 3.获取输入的字节流
        InputStream in = null;
        // 将字节流装换为字符流
        InputStreamReader isr = null;
        // 为字符流设置缓冲区
        BufferedReader br = null;
        // 服务器端响应
        OutputStream os = null;
        PrintWriter out = null;
        try {
            in = socket.getInputStream();
            isr = new InputStreamReader(in);
            br = new BufferedReader(isr);
            String data = null;
            while ((data = br.readLine()) != null) {
                System.out.println("我是服务器,客户端说:" + data);
            }
            socket.shutdownInput();
            os = socket.getOutputStream();
            out = new PrintWriter(os);
            out.write("客户端,你好!");
            out.flush();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 关闭socket输入流
        try {
            out.close();
            os.close();
            br.close();
            isr.close();
            in.close();
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

基于UDP的网络传输

public class UDPServer {

    private static DatagramSocket datagramSocket;

    public static void main(String[] args) throws IOException {
        /**
         * 服务器端接收客户端的信息
         */
        datagramSocket = new DatagramSocket(8800);
        // 2.指定字节数组用来接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
        System.out.println("**服务器端已经启动**");
        // 3.接收客户端发送的数据
        datagramSocket.receive(packet);
        String data = null;
        data = new String(bytes, 0, packet.getLength());
        System.out.println("我是服务端,客户端的数据是:" + data);
        /**
         * 服务器端响应客户端
         */
        InetAddress address = packet.getAddress();
        int port = packet.getPort();
        byte[] bytes2 = "客户端你好!".getBytes();
        DatagramPacket packet2 = new DatagramPacket(bytes2, bytes2.length, address, port);
        DatagramSocket socket = new DatagramSocket();
        socket.send(packet2);
        socket.close();
    }
}
public class UDPClient {

    private static DatagramSocket socket;
    public static void main(String[] args) throws IOException {
        /**
         * 客户端想服务器端发送数据
         */
        InetAddress address = InetAddress.getByName("192.168.74.2");
        int port = 8800;
        byte[] bytes = "用户名:admin,密码:123".getBytes();
        DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
        socket = new DatagramSocket();
        socket.send(packet);
        /**
         * 客户端接收阢器端的数据
         */
//        datagramSocket = new DatagramSocket(8800);
        // 2.指定字节数组用来接收数据
        byte[] bytes2 = new byte[1024];
        DatagramPacket packet2 = new DatagramPacket(bytes2, bytes2.length);
        // 3.接收服务器端发送的数据
        socket.receive(packet2);
        String data = null;
        data = new String(bytes2, 0, packet2.getLength());
        System.out.println("我是客户端,服务器端说:" + data);
    }
}

TCP是较可靠的双向流协议,可以发送任意数量的数据,提供消息确认、错误监测和错误恢复等服务。

UDP不可靠。

原文地址:https://www.cnblogs.com/zhuxiaodong/p/6033063.html