socket通信—实现网络间的IO通信

2020-12-16  本文已影响0人  小胖学编程

socket(套接字)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。多个TCP连接或者应用进程可能需要通过同一个TCP协议端口传输数据,为了区分不同的应用程序进程和连接,计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

1. socket通信的流程

socket通信过程.png

图片来源

  1. 服务端先初始化socket,然后和端口绑定(bind),对端口进行监听(listen)。调用accept进行阻塞,等待客户端连接。

  2. 客户端初始化一个socket,然后连接服务器(connect),如果连接成功,客户端可以和服务端建立连接。

  3. 客户端通过outputStream发送数据,服务端收到请求(inputStream去网络中读取数据)并处理请求,然后把回应的数据发送给客户端,客户端读取数据,最后关闭连接。

对应的JAVA代码

上文说到,socket可以实现数据传输的并发服务,我们可以定义多个客户端并发传输数据。

@Slf4j
public class SocketTest {
    private static Socket socket;

    public static void main(String[] args) throws Exception {
        new Thread(() -> {
            sendCommand("AAA");
        }).start();
        new Thread(() -> {
            sendCommand("BBB");
        }).start();
        new Thread(() -> {
            sendCommand("CCC");
        }).start();

    }

    public static void sendCommand(String message) {
        try {
            socket = new Socket("127.0.0.1", 4331);
            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataOutputStream.writeUTF(message);
            dataOutputStream.flush();
            String outMessage = dataInputStream.readUTF();
            System.out.println("发送的信息:" + message + ",接受到的信息:" + outMessage);
        } catch (Exception e) {
            log.error("", e);
        }
    }
}

服务端需要先启动,并且while循环去接受客户端的消息:

public class SocketService {
    private static ServerSocket server;

    public static void main(String[] args) throws Exception {
        server = new ServerSocket(4331);
        System.out.println("等待客户端呼叫");


        while (true) {
            //没有消息时,此处保持阻塞
            Socket socket = server.accept();
            //输出信息到网络中
            DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
            //接受信息到网络中
            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
            String s = dataInputStream.readUTF();
            System.out.println(s);
            dataOutputStream.writeUTF(s + "-CCTV");
        }

    }
}

2. socket通信的原理

TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。

image.png

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

image.png

TCP及socket通信原理

Socket通信原理

上一篇 下一篇

猜你喜欢

热点阅读