黑马程序员—网络编程基础TCP协议学习小结(Java)
----------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、TCP协议概述
TCP全称TransmissionControl Protocol 即传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议,在如下图所示的TCP/IP体系结构中,位于第三层。应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元(MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。
[tr] [td=155] [/table] 图1
11
[table=98%] [/td] [/tr]file:///C:/Users/ADMINI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
二、Java中的TCP协议
Java的TCP通信采用服务器端和客户端的模型,由于JDK已经帮我们封装好了TCP协议,所以我们完全不必考虑协议的底层是如何实现的,而只需通过ServerSocket和Socket建立服务器和客户端的套接字,然后从Socket获取对应的输入输出流,如有需要可以对获得的输入输出流进行封装,即可实现客户端和服务端之间的通信。例如TCP聊天服务程序,文件传输程序。
三、Java的TCP编程基础
客户端的建立流程
1. 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
2. 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
3. 输入流可以读取服务端输出流写出的数据
4. 输出流可以写出数据到服务端的输入流
服务端的建立流程
1. 创建ServerSocket(需要指定端口号)
2. 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
3.调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
4.输入流可以读取客户端输出流写出的数据
5.输出流可以写出数据到客户端的输入流
四、TCP的聊天程序
服务端程序
public static void main(String[]args) throws IOException {
//创建服务端
ServerSocket server = newServerSocket(20444);
while(true) {
final Socket socket= server.accept();
new Thread() {
public void run(){
try {
//创建服务端输入输出流
BufferedReaderbr = new BufferedReader(newInputStreamReader(socket.getInputStream()));
PrintStream ps= new PrintStream(socket.getOutputStream());
String s =br.readLine();
s = newStringBuilder(s).reverse().toString();
ps.println(s);
socket.close();
}catch (IOExceptione) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}
}.start();
}
}
其中,需要注意的是匿名内部类Thread中的使用的局部变量必须用final修饰。
输入流封装成了BufferedReader,输出流使用PrintStream,它可以直接输出换行,这样在聊天就可以一句句的读,一句句的发。这样也符合我们,聊天的打字习惯。
客户端程序
public static void main(String[]args) throws IOException {
//创建键盘录入对象
Scanner scanner = newScanner(System.in);
String s = scanner.nextLine();
//创建客户端
Socket socket = new Socket("127.0.0.1",20444);
//创建客户端输入输出流
BufferedReader br = newBufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream ps = newPrintStream(socket.getOutputStream());
ps.println(s);
System.out.println(br.readLine());
socket.close();
}
同样客户端的输入输出流也采用了与服务端相同的封装。
五、总结
TCP的应用编程需用通过建立对应的套接字,从套接字获取对应的输入输出流即可完成对其的操作。