TCP與UCP協議,及socket程式設計
阿新 • • 發佈:2019-02-20
TCP是Tranfer Control Protocol的 簡稱,是一種面向連線的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的資料流。傳送方和接收方的成對的兩個socket之間必須建 立連線,以便在TCP協議的基礎上進行通訊,當一個socket(通常都是server socket)等待建立連線時,另一個socket可以要求進行連線,一旦這兩個socket連線起來,它們就可以進行雙向資料傳輸,雙方都可以進行傳送 或接收操作。
UDP是User Datagram Protocol的簡稱,是一種無連線的協議,每個資料報都是一個獨立的資訊,包括完整的源地址或目的地址,它在網路上以任何可能的路徑傳往目的地
UDP:1,每個資料報中都給出了完整的地址資訊,因此無需要建立傳送方和接收方的連線。
2,UDP傳輸資料時是有大小限制的,每個被傳輸的資料報必須限定在64KB之內。
3,UDP是一個不可靠的協議,傳送方所傳送的資料報並不一定以相同的次序到達接收方
TCP:1,面向連線的協議,在socket之間進行資料傳輸之前必然要建立連線,所以在TCP中需要連線
時間。
2,TCP傳輸資料大小限制,一旦連線建立起來,雙方的socket就可以按統一的格式傳輸大的
資料。
3,TCP是一個可靠的協議,它確保接收方完全正確地獲取傳送方所傳送的全部資料。
程式碼:伺服器端:
package com.liuxin.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class SocketServer { public static void main(String args[]){ ServerSocket ss=null; try { ss=new ServerSocket(4700); } catch (IOException e) { System.err.println("can not listen to"+e); } Socket socket=null; try { socket=ss.accept();//有請求則建立一個Socket物件,並繼續執行 } catch (IOException e) { System.err.println(e); } try { BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"gbk"));//把socket的輸入流內容放到br物件中 PrintWriter pw=new PrintWriter(socket.getOutputStream()); //把socket的輸出流內容放到pw物件中 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in,"gbk"));//由系統標準輸入裝置構造BufferedWrite物件 System.out.println("client:"+br.readLine());//列印客戶端輸入的文字 String line=sin.readLine(); while(!line.equals("bye")){//讀取到bye則停止迴圈 pw.println(line); pw.flush();//重新整理輸出流,使client馬上收到該字串 System.out.println("Server:"+line); System.out.println("Client:"+br.readLine());//從Client讀入一字串,並列印到標準輸出上 line=sin.readLine(); //從系統標準輸入讀入一字串 } pw.close(); //關閉Socket輸出流 br.close(); //關閉Socket輸入流 socket.close(); //關閉Socket ss.close(); //關閉ServerSocket } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客戶端:
package com.liuxin.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);//向本機的4700埠發出客戶請求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));//由系統標準輸入裝置構造BufferedReader物件
PrintWriter os=new PrintWriter(socket.getOutputStream());//由Socket物件得到輸出流,並構造PrintWriter物件
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));//由Socket物件得到輸入流,並構造相應的BufferedReader物件
String readline;
readline=sin.readLine(); //從系統標準輸入讀入一字串
while(!readline.equals("bye")){//若從標準輸入讀入的字串為 "bye"則停止迴圈
os.println(readline);//將從系統標準輸入讀入的字串輸出到Server
os.flush();//重新整理輸出流,使Server馬上收到該字串
System.out.println("Client:"+readline);//在系統標準輸出上列印讀入的字串
System.out.println("Server:"+is.readLine());//從Server讀入一字串,並列印到標準輸出上
readline=sin.readLine(); //從系統標準輸入讀入一字串
} //繼續迴圈
os.close(); //關閉Socket輸出流
is.close(); //關閉Socket輸入流
socket.close(); //關閉Socket
}catch(Exception e) {
System.out.println("Error"+e); //出錯,則打印出錯資訊
}
}
}