【Socket 通信编程】【TCP双向通信基本模型】

Socket(套接字)是传输层和网络层提供给应用层的标准化编程接口,同时也是两个通信通道上的端节点。

套接字可分为流式套接字、数据报套接字和原始套接字。

 用五元组可以标识一个socket。即<本地ip, 本地端口, 远程ip, 远程端口, 协议类型>

下面是TCP套接字编程的典型模型

下面是UDP套接字编程的典型模型

下面是用socket实现TCP通信的基本模型

/* 测试时应先运行服务器端,再运行客户端 */
/* 服务器端 */
import java.net.*;
import java.io.*;
public class Server {
	static int port = 2019;
	public static void main(String args[]) throws Exception {
		Socket client = null;
		// 定义监听socket,端口号为port
		ServerSocket listenSocket = new ServerSocket(port);
		
		System.out.println("服务器正在监听端口号<" + port + ">");
		// 当监听到有客户端请求连接时,继续执行程序;否则阻塞
		client = listenSocket.accept();
		System.out.println("已连接到客户端...");
		// 服务器套接字上的getInputStream方法得到的输入流是从客户端发来的数据
		InputStream inStream = client.getInputStream();
		// 服务器套接字上的getOutputStream方法得到的输出流是发给客户端的数据
		OutputStream outStream = client.getOutputStream();
		// 将客户端发来的数据放入缓冲区
		BufferedReader in = new BufferedReader(new InputStreamReader(inStream));
		// 定义向客户端发送数据流的对象out
		PrintWriter out = new PrintWriter(outStream);
		
		String line = null;
		line = in.readLine();
		System.out.println("来自客户端的消息: " + line);
		// 向客户端发送确认消息
		out.println(line);
		out.flush();
	
		client.close();
		listenSocket.close();
	}
}
	
/* 客户端 */
import java.net.*;
import java.io.*;
public class Client {
	// 定义端口和IP地址
	static int port = 2019; 
	static String IP = "127.0.0.1"; 
	public static void main(String args[]) throws Exception {
		// 定义客户端输入和服务器响应
		String userInput = null; 
		String echoMessage = null;
		
		// 将键盘输入读入缓冲区stdIn
		BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
		// 定义客户端套接字
		Socket socket = new Socket(IP, port);
		System.out.println("已连接到服务器...");
		
		// 客户端套接字上的getInputStream方法得到的输入流是从服务器端发回的数据
		InputStream inStream = socket.getInputStream();
		// 客户端套接字上的getOutputStream方法得到的输出流是发给服务器端的数据
		OutputStream outStream = socket.getOutputStream();
		
		// 将服务器端发回的数据读入缓冲区in
		BufferedReader in = new BufferedReader(new InputStreamReader(inStream));
		// 定义向服务器发送数据流的对象out
		PrintWriter out = new PrintWriter(outStream);
		
		userInput = stdIn.readLine();
		// 向服务器打印数据
		out.println(userInput);
		// flush方法的作用是刷新缓冲区
		out.flush();
		
		echoMessage = in.readLine();
		System.out.println("服务器已收到消息: " + echoMessage);
		socket.close();
	}
}

测试结果

 

你可能感兴趣的:(【Socket 通信编程】【TCP双向通信基本模型】)