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();
//挥手结束
}
}
}
客户端
- 建立连接
- 通信
- 释放连接
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();
//连接以释放
}
}
测试结果
参考文章
socket实现TCP通信实现socket通信(TCP/IP)实例
因为我还是个小白,文章可能会有很多不足之处,还请见谅,请大家批评指正,谢谢!