Tcp通信協議

瞭解了Udp通信協議以後,咱們再認識一個經常使用的通信協議:Tcpjava

 

Tcp傳輸特色:網絡

--依賴於Socket和ServerSocket對象tcp

--創建客戶端和服務端ide

--創建鏈接後,經過Socket中的 IO 流進行數據的傳輸spa

--關閉Scoket.net

 

下面經過一個簡單的例子認識一下:code

--tcp分客戶端和服務端對象

--客戶端對應的對象是Sockerblog

   服務端對應的對象是ServerSocketip

 

//客戶端:

package com.shindo.java.tcp;
import java.io.*;
import java.net.*;

/**
 * 客戶端:
 * 經過查詢Socket對象,發如今該對象創建時,就能夠去鏈接指定的主機,
 * 由於Tcp是面向鏈接的,因此在創建Socket服務時,就要有服務端存在,並鏈接成功,造成通路後,在該通道進行數據傳輸
 * 
 * 需求:給服務端發送一個文本數據
 */
public class TcpClient {
    public static void main(String[] args)throws Exception{
        //建立客戶端的Socket服務,指定目的主機和端口
        Socket s = new Socket("127.0.0.1",11012);
        
        //爲了發送數據,應獲取Socket流中的輸出流
        OutputStream out = s.getOutputStream();//使用字節流
        
        out.write("This's the first Tcp test Demo".getBytes());
        
        //由於流是經過Socket得到的,全部一旦Socket關閉,流也隨之關閉
        s.close();
    }
}

 

//服務端:

package com.shindo.java.tcp;
import java.io.*;
import java.net.*;
/**
 * 需求:定義端點接收數據,並打印在控制檯上
 * 
 * 一、簡歷ServerSocket服務,並監聽一個端口
 * 二、獲取鏈接過來的客戶端對象
 *    經過ServerSocket的accept()方法,沒有鏈接就會等,因此這個方法是阻塞的。
 * 三、客戶端若是發過來數據,那麼服務端要使用對應的客戶端對象,並獲取到該客戶端對象的讀取流
 *  來讀取客戶端發送過來的數據,並打印控制檯;
 * 四、關閉服務端(可選)
 */
public class TcpServer {
    public static void main(String[] args){
        try {
        //簡歷服務端Socket服務,並監聽一個端口
        ServerSocket ss = new ServerSocket(11012);
        
        //經過accept()方法獲取鏈接過來的客戶端對象
        Socket s = ss.accept();
        
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip + ".........is connected");
        
        //使用客戶端對象的讀取流讀取客戶端發送過來的數據
        InputStream in = s.getInputStream();//其實是一個網絡流
        
        byte[] buf = new byte[1024];
        
        int len = in.read(buf);
        System.out.println(new String(buf,0,len));
        
        s.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

 

============================優雅的分割線============================

上面這兩個例子,實現了客戶端向服務端發送文本信息,服務端收到並將其打印到控制檯。

如今咱們再對上面兩個程序進行一些改造,讓服務端接收到客戶端的信息後,打印到控制檯,並響應信息給客戶端;客戶端也將服務端響應的信息打印到控制檯:

 

//客戶端:

package com.shindo.java.tcp;
import java.io.*;
import java.net.*;

public class TcpClient2 {
    public static void main(String[] args){
        try {
            Socket s = new Socket("127.0.0.1",11012);
            
            //發送文本數據給客戶端
            OutputStream out = s.getOutputStream();
            out.write("This's the better TcpClient test Demo".getBytes());
            
            //讀取客戶端響應信息
            InputStream in = s.getInputStream();
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            System.out.println(new String(buf,0,len));
            
            s.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
View Code

 

//服務端:

package com.shindo.java.tcp;
import java.io.*;
import java.net.*;

public class TcpServer2 {
    public static void main(String[] args){
        try {
            //建立服務端,並監聽一個端口
            ServerSocket ss = new ServerSocket(11012);
            Socket s = ss.accept();
            
            //獲取請求的客戶端ip,並打印控制檯
            String ip = s.getInetAddress().getHostAddress();
            System.out.println(ip + "........... is connected");
            
            //獲取客戶端發送過來的數據,並打印控制檯
            InputStream in = s.getInputStream();
            byte[] buf = new byte[1024];
            int len = in.read(buf);
            System.out.println(new String(buf,0,len));
            
            //發送響應信息給客戶端
            OutputStream out = s.getOutputStream();
            out.write("welcome, client !".getBytes());
            
            s.close();
            ss.close();
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        
    }
}
View Code

 

效果以下:

客戶端接收到服務到響應:

 

服務端接收到客戶端發過來的數據:

相關文章
相關標籤/搜索