黑马程序员技术交流社区

标题: 黑马程序员—网络编程基础TCP协议学习小结(Java) [打印本页]

作者: tianweidong    时间: 2015-9-21 13:03
标题: 黑马程序员—网络编程基础TCP协议学习小结(Java)
期待完善

黑马程序员—网络编程基础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的应用编程需用通过建立对应的套接字,从套接字获取对应的输入输出流即可完成对其的操作。



作者: 冰霜之卅    时间: 2015-9-21 18:18
正在学这里。
作者: 清明月雨上    时间: 2015-9-21 18:24
楼主貌似快学完基础班的课程了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2