socket通信,简单实现案例,以及遇到的问题

之前对socket的理解一直停留在应用层次,即只是在项目中使用,而对其具体通信流程的理解是很模糊的。

现在好好的来归纳归纳这么几个问题:

1.什么是socket?

2.socket是怎样进行通信的?

3.具体到代码中,socket又如何实现?

1、什么是Socket?

socket,网上很多给的定义是“套接字”,对于我这种小白来说...what?什么鬼?更难理解好吗。

后来看到一名网友的理解,感觉颇为形象:插座,对应到服务端与客户端的关系,服务端就是个插座,客户端就是插头。

Socket本质是编程接口(API),是对TCP/IP协议的封装。

2、socket是怎样进行通信的?

Socket通信基于传输层TCP/UDP,而TCP通信需要通过三段报文完成建立连接,俗称三次握手。TCP连接建立后即可进行通信。以上是它的传输实现,而其通信工作是交给I/O的读写操作实现。

这里的I/O又分为几类:

阻塞IO 即 BIO(Blocking I/O)

非阻塞IO 即 NIO(NEW I/O)

同步IO

异步IO

这些类型之间又是可以进行组合的,如同步阻塞I/O、同步非阻塞I/O、异步阻塞I/O、异步非阻塞I/O。

3、Socket实现案例

Socket简单通信

package test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class TestSocket{
	
	class SocketServer extends Thread{
		private ServerSocket serverSocket;
		@Override
		public void run() {
			try {
				serverSocket = new ServerSocket(8888);
				while(true){
					Socket socket = serverSocket.accept();//等待客户端请求
					BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取输入流
					BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//获取输出流
					
					System.out.println("连接成功! 收到客户端消息:"+reader.readLine());
					writer.write("你好");//响应客户端
					writer.newLine();
					writer.flush();
					writer.close();
                                        reader.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public static void main(String[] args) throws Exception {
		SocketServer server = new TestSocket().new SocketServer();//实例化服务端
		server.start();//启动Socket服务端线程
		
		Socket socket = new Socket("127.0.0.1",8888);//建立Socket客户端连接
		
		BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获取输入流
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//获取输出流
		
		writer.write("呼叫总部");//给服务端发送消息
		writer.newLine();
		writer.flush();
		
		String answer = reader.readLine();//接收服务端消息
		System.out.println("服务端响应:"+answer);
		
	}
}

执行main方法,效果如下

以上案例为I/O类型的同步阻塞IO,其它类型的后续再进行补充。

其中需要注意的是:

代码中使用BufferedReader的readLine()方法,它是一行一行的读取。因此写完数据后需要在末尾标识换行符即“\n”,或者像代码中写入完使用newLine()方法。不然线程将一直停留在readLine()。

可以参考https://blog.csdn.net/keketrtr/article/details/47128999

猜你喜欢

转载自blog.csdn.net/x8826054/article/details/81409618