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窗口,启动客户端,可以看到服务器端和客户端互相发送和接受消息,执行结果如下,

 

posted @ 2016-11-20 02:38  fysola  阅读(3237)  评论(0编辑  收藏  举报