1. 程式人生 > >socket的TCP的三次握手/四次揮手

socket的TCP的三次握手/四次揮手

exce 5.2.1 其他 oca clas message trac input 創建

技術分享

第一次握手:客戶端嘗試連接服務器,向服務器發送syn包(同步序列編號Synchronize Sequence Numbers),syn=j,客戶端進入SYN_SEND狀態等待服務器確認

第二次握手:服務器接收客戶端syn包並確認(ack=j+1),同時向客戶端發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態

第三次握手:第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手

技術分享

某個應用進程首先調用close主動關閉連接,這時TCP發送一個FIN M;

另一端接收到FIN M之後,執行被動關閉,對這個FIN進行確認。它的接收也作為文件結束符傳遞給應用進程,因為FIN的接收意味著應用進程在相應的連接上再也接收不到額外數據;

一段時間之後,接收到文件結束符的應用進程調用close關閉它的socket。這導致它的TCP也發送一個FIN N;

接收到這個FIN的源發送端TCP對它進行確認。

另外服務端和客戶端的簡單實例如下:

服務器端:

 public static void  main(String[] args)  {
        //SendOvertimeMessage sendOvertimeMessage = new SendOvertimeMessage();
        
//sendOvertimeMessage.sendOverTimeMessageReq(); //獲取本機的InetAddress實例 try { //獲取本機的InetAddress實例 InetAddress address =InetAddress.getByName("15.2.19.150"); System.out.println(address.getCanonicalHostName());;//獲取計算機名 System.out.println(address.getHostAddress());//
獲取IP地址 byte[] bytes = address.getAddress();//獲取字節數組形式的IP地址,以點分隔的四部分 //獲取其他主機的InetAddress實例 // InetAddress address2 =InetAddress.getByName("其他主機名"); // InetAddress address3 =InetAddress.getByName("IP地址"); //使用URL讀取網頁內容 //創建一個URL實例 // URL url =new URL("http://www.baidu.com"); // InputStream is = url.openStream();//通過openStream方法獲取資源的字節輸入流 // InputStreamReader isr =new InputStreamReader(is,"UTF-8");//將字節輸入流轉換為字符輸入流,如果不指定編碼,中文可能會出現亂碼 // BufferedReader br =new BufferedReader(isr);//為字符輸入流添加緩沖,提高讀取效率 // String data = br.readLine();//讀取數據 // while(data!=null){ // System.out.println(data);//輸出數據 // data = br.readLine(); // } // // System.out.println(data); // br.close(); // isr.close(); // is.close(); /** * 基於TCP協議的Socket通信,實現用戶登錄,服務端 */ //1、創建一個服務器端Socket,即ServerSocket,指定綁定的端口,並監聽此端口 // ServerSocket serverSocket =new ServerSocket(10062);//1024-65535的某個端口 ////2、調用accept()方法開始監聽,等待客戶端的連接 // Socket socket = serverSocket.accept(); ////3、獲取輸入流,並讀取客戶端信息 // InputStream is = socket.getInputStream(); // InputStreamReader isr =new InputStreamReader(is); // BufferedReader br =new BufferedReader(isr); // String info =null; // while((info=br.readLine())!=null){ // System.out.println("我是服務器,客戶端說:"+info); // } // socket.shutdownInput();//關閉輸入流 ////4、獲取輸出流,響應客戶端的請求 // OutputStream os = socket.getOutputStream(); // PrintWriter pw = new PrintWriter(os); // pw.write("歡迎您!"); // pw.flush(); // // ////5、關閉資源 // pw.close(); // os.close(); // br.close(); // isr.close(); // is.close(); // socket.close(); // serverSocket.close(); }catch (Exception ex){ ex.printStackTrace(); } }

客戶端:

public static void main(String[] args){
        //客戶端
//1、創建客戶端Socket,指定服務器地址和端口
        Socket socket = null;
        try {
            socket = new Socket("localhost",10062);
            //2、獲取輸出流,向服務器端發送信息
            OutputStream os = socket.getOutputStream();//字節輸出流
            PrintWriter pw =new PrintWriter(os);//將輸出流包裝成打印流
            pw.write("用戶名:admin;密碼:123");
            pw.flush();
            socket.shutdownOutput();
//3、獲取輸入流,並讀取服務器端的響應信息
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String info = null;
            while((info=br.readLine())!= null){
                System.out.println("我是客戶端,服務器說:"+info);
            }

//4、關閉資源
            br.close();
            is.close();
            pw.close();
            os.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

socket的TCP的三次握手/四次揮手