『壹』 TCP/IP 是怎樣傳輸數據文件的
1、當你把要傳送的數據傳遞給TCP後,TCP把這些信息分成很多個數據包(這種數據包稱為TCP分組),每一個分組都包含有一個序號。接著TCP分組被傳遞給IP層,IP層把這個TCP分組放在一個IP數據包的數據部分。然後,這個IP數據包被傳到目的主機。目的主機
上的IP層,把IP數據包的數據部分(即TCP分組)傳遞給TCP層。TCP接收到分組後,檢查數據包的正確性,如果不正確,通知源計算機重新送該IP包。利用分組的序號來將數據按照原來的順序排列,然後送給應用層。換句話說,IP的工作是把原始數據(數據包)從一地傳送到另一地;TCP的工作是管理這種流動並確保其數據是正確的。在IP層,信息不是一個恆定的流,而是一個個小的數據包,這種數據包稱為IP數據報。所有要發送的信息都必須被拆成IP數據包,才能在IP網上傳送。IP數據報中最主要的內容有:源計算機的地址信息、目的計算機的地址信息、要傳輸的數據。當發送一個數據包時,計算機首先根據目的地址決定將其發送給誰,如果目的計算機與源計算機在同一個物理網路中,則直接將這個數據報發送給它。如果目的計算機與源計算機不在同一個物理網路中,則發送給路由器,路由器這個特殊的計算機連在了兩個網路之中,因此可以同時與兩個網路中的計算機通信。路由器在收到數據包後,根據目的地址決定是直接發給目的計算機(如果在同一個物理網路中),還是轉發給另一台計算機(如果不在同一個物理網路中)。
『貳』 socket TCP協議接收大文件時recv的buffer設置多少合適
tcp是數據流。
如果你第一次的recv不能接收全部數據,可以再次調用recv接收剩餘的版。
具體點:
你在發送的時權候可以把數據長度寫在前4個位元組,或者先發送數據長度過來。
接收的時候就能先知道數據長度,再動態分配內存,接收剩餘數據。
這是socket中非常常用的方法。
『叄』 如何通過Socket TCP發送並接收一個文件
主要是你通過socket api封裝要發送的數據,內部會自動封裝成數據流進行傳輸。
1,什麼是Socket
網路上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個埠號唯一確定。
但是,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。在java環境下,Socket編程主要是指基於TCP/IP協議的網路編程。
2,Socket通訊的過程
Server端Listen(監聽)某個埠是否有連接請求,Client端向Server 端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。
對於一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:
(1) 創建Socket;
(2) 打開連接到Socket的輸入/出流;
(3) 按照一定的協議對Socket進行讀/寫操作;
(4) 關閉Socket.(在實際應用中,並未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因為程序本身比較簡單,要求不高,所以並未造成什麼影響。)
3,創建Socket
創建Socket
java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。這是兩個封裝得非常好的類,使用很方便。其構造方法如下:
Socket(InetAddress address, int port);
Socket(InetAddress address, int port, boolean stream);
Socket(String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(SocketImpl impl)
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
ServerSocket(int port);
ServerSocket(int port, int backlog);
ServerSocket(int port, int backlog, InetAddress bindAddr)
Socket client = new Socket("127.0.01.", 80);
ServerSocket server = new ServerSocket(80);
在創建socket時如果發生錯誤,將產生IOException,在程序中必須對之作出處理。所以在創建Socket或ServerSocket是必須捕獲或拋出例外。