1. 程式人生 > >TCP與UCP協議,及socket程式設計

TCP與UCP協議,及socket程式設計

TCPTranfer Control Protocol的 簡稱,是一種面向連線的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的資料流。傳送方和接收方的成對的兩個socket之間必須建 立連線,以便在TCP協議的基礎上進行通訊,當一個socket(通常都是server socket)等待建立連線時,另一個socket可以要求進行連線,一旦這兩個socket連線起來,它們就可以進行雙向資料傳輸,雙方都可以進行傳送 或接收操作。

UDPUser 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); //出錯,則打印出錯資訊
		}
	}
}