Socket

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。可以说,Socket是操作系统暴露在应用层的窗口,应用层通过socket,使用OS提供的TCP服务,进而构建出应用层上的HTTP协议。

举例:

如果将OS看成银行,TCP是银行服务,socket则可以看作是窗口,我们可以通过窗口socket获取银行OS通过的服务TCP。

原理

服务端,创建socket,并绑定端口,进行listen监听,用accept查看等待连接。如果有客户端申请连接,就开始处理连接,查看通信内容;如果没有,就一直等待连接。客户端要连接服务端,也需要建立socket,通过端口号确定服务器,申请连接,连接建立成功后,开始通信,通信结束后,关闭socket释放连接。

就是三次握手、通信、四次挥手的实现。

具体实现

服务端

1.监听端口,等待连接

  • 初始化套接字
  • 创建socket,绑定端口,并监听
  • 服务器确认请求

2.建立连接
3.进行通信
4.释放连接

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
    public static void main(String[] args) throws IOException, InterruptedException {

  //1.监听端口,发起请求
        ServerSocket serverSocket=new ServerSocket(8080);
  //2.监听后等待连接

        while (true) {  //不断处理连接
            //socket向os要已经建立的TCP连接,两种情况:
            //1.已建好,立即返回
            //2.否则,一直等,直到client连接上

            //等待连接
            //3次握手是发生在accept()之中的,调用完成后得到已建立好的连接
            Socket socket = serverSocket.accept();
            //本条指令完成后,握手结束

            System.out.println("1条已建立");
            //已建立连接,应用层,正常通行即可

            // 3.通信
            //读取client发来的应用层数据1
            InputStream inputStream = socket.getInputStream();
            Scanner sc = new Scanner(inputStream, "UTF-8");
            String line = sc.nextLine();
            System.out.println(line);

            //将数据写入output,经过OS的TCP机制,发给client
            OutputStream outputStream = socket.getOutputStream();
            Writer writer = new OutputStreamWriter(outputStream, "UTF-8");
            PrintWriter printWriter = new PrintWriter(writer);
            //发给client
            printWriter.printf("你好!\r\n");
            printWriter.flush();    // 进行刷新(flush)后,才能把数据真正写入
            Thread.sleep(1000000);
            
            // 4.断开连接  触发它关联的四次挥手
            socket.close();
            //挥手结束
        }
    }
}

客户端

  1. 建立连接
  2. 通信
  3. 释放连接
import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        //1.建立连接
        Socket socket=new Socket("127.0.0.1",8080);

        //2.通信
        InputStream inputStream = socket.getInputStream();
        Scanner scanner = new Scanner(inputStream, "UTF-8");
        OutputStream outputStream = socket.getOutputStream();
        Writer writer = new OutputStreamWriter(outputStream, "UTF-8");
        PrintWriter printWriter = new PrintWriter(writer);
        //数据1
        printWriter.printf("你好,世界!\r\n"); // 向服务器发送消息
        printWriter.flush();    // 进行刷新(flush)后,才能把数据真正写入

        //从服务器读取消息
        String message = scanner.nextLine();
        System.out.println(message);

        //3.释放连接
        socket.close();
        //连接以释放
    }
}

测试结果

java socket tcp 发送和接收数据 java发送和接收socket请求_TCP


java socket tcp 发送和接收数据 java发送和接收socket请求_应用层_02


参考文章

socket实现TCP通信实现socket通信(TCP/IP)实例

因为我还是个小白,文章可能会有很多不足之处,还请见谅,请大家批评指正,谢谢!