首页 > 代码库 > JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层
OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七层:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
TCP/IP协议
TCP/IP是一系列网络通信协议的统称,其中最核心的两个协议是TCP和IP。TCP称为传输控制协议,IP称为互联网络协议。
网络分层除了OSI模型分层,还有TCP/IP模型分层,将网络划分为四层,应用层、传输层、网际层、网络接口层。TCP/IP模型分层是OSI模型分层的浓缩版
OSI模型和TCP/IP网络分层的对应结构及TCP/IP部分协议族,
TCP三次握手
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
三次握手图解
JAVA Socket
Java使用ServerSocket(服务器端)和Socket(客户端)进行基于TCP协议的网络通信,服务器端痛过accetp()方法监听客户端连接。
双方建立连接之后,可以通过socket对象的getInputStream和getOutputStream进行普通IO操作,双方通信就和本地通信差不多。
下面是一个简单的服务器端和客户端通信的例子,
服务器端,
1 package network; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 import java.io.PrintStream; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 12 public class Server { 13 public static void main(String[] args) throws IOException { 14 //创建端口30000的服务器socket 15 ServerSocket ss = new ServerSocket(3500); 16 //在返回客户端socket之前,accept将会一直阻塞 17 Socket s = ss.accept(); 18 BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 19 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 20 int i = 0; 21 while(true) { 22 //发送信息时,需要加上换行符,否则客户端的readline()会阻塞 23 wr.write("你好,您收到服务器的新年祝福["+ i++ +"]\n"); 24 //使用flush方法可以立即清空buffer,让消息马上发出去,否则在buffer满之前消息都不会发出去 25 wr.flush(); 26 27 String line = br.readLine(); 28 System.out.println("来自客户端的数据:"+line); 29 } 30 } 31 }
客户端,
1 package network; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.io.OutputStreamWriter; 8 import java.net.Socket; 9 import java.net.UnknownHostException; 10 11 public class Client { 12 public static void main(String[] args) throws UnknownHostException, 13 IOException, InterruptedException { 14 Socket socket = new Socket("127.0.0.1", 3500); 15 BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 16 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 17 int i = 0; 18 while (true) { 19 //发送信息时,需要加上换行符,否则服务器端的readline()会阻塞 20 wr.write("你好,您收到客户端的新年祝福["+ i++ +"]\n"); 21 //使用flush方法可以立即清空buffer,让消息马上发出去,否则在buffer满之前消息都不会发出去 22 wr.flush(); 23 24 String line = br.readLine(); 25 System.out.println("来自服务器的数据:" + line); 26 Thread.sleep(1000); 27 } 28 } 29 }
在cmd窗口中启动服务器端, 之后打开一个新的cmd窗口,启动客户端,可以看到服务器端和客户端互相发送和接受消息,执行结果如下,
JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo