TCP應用編程

TCPTransmission Control Protocol(傳輸控制協議)的簡稱,是TCP/IP體系中面向鏈接的運輸層協議,在網絡中提供全雙工的和可靠的服務。編程

TCP協議最主要的特色是:服務器

   1) 是一種基於鏈接的協議。網絡

   2) 保證數據準確到達。多線程

   3) 保證各數據到達的順序與數據發出的順序相同。 tcp

   4) 傳輸的數據無消息邊界。spa

TCP協議通訊流程:線程

1. 服務器端首先建立服務器套接字設計

2. 服務器套接字監聽一個端口,等待客戶端請求orm

3. 客戶端建立客戶端套接字對象

4. 客戶端向服務器端發送鏈接請求

5. 服務器確認與客戶端的鏈接

6. 客戶端和服務器端利用創建的鏈接進行通訊

7. 通訊完畢後,客戶端和服務器關閉各自的鏈接

服務器和客戶端利用 Socket 進行通訊的流程(如圖 所示)

 

 

 

服務器與客戶端的通訊流程

Socket編程基礎:

Socket(網絡套接字)是網絡通訊的基本構件,它是能夠被命名和尋址的通訊端口,使用中,每一個Socket 都有對應的類型和一個與之相關的進程。下面分別介紹如何利用Socket 創建服務器端程序和客戶端程序。

利用Socket 創建TCP服務器端程序,通常須要如下幾個步驟。

1) 建立服務器套接字,並將其與服務器的IP地址和端口號綁定

int  port = 888;

IPAddress ipAdd=IPAddress.Parse(192.168.1.100」);

TcpListener listener=new TcpListener(ipAdd, port);

注意,須要引入命名空間:

using System.Net;

using System.Net.Sockets;

2) 監聽服務器端口,等待客戶端鏈接請求

listener.Start();

3) 確認與客戶端的鏈接,並建立與該客戶端對應的Socket對象

Socket clientSocket= listener.AcceptSocket();

4) 經過創建的Socket對象與鏈接的客戶端進行數據傳輸

A. 向客戶端發送消息

string msg=」你們好」;

byte [] outBytes=Encoding.Default.GetBytes(msg.ToCharArray());

clientSocket.Send(outBytes);

B. 接收從客戶端發來的數據

byte [] buff=new byte[1024];

clientSocket.Receive(buff);

string msg = Encoding.Default.GetString(buff);

5) 斷開與客戶端的鏈接

clientSocket.Close();

6) 關閉服務器套接字

listener.Close();

利用Socket 創建TCP客戶端程序,通常須要如下幾個步驟。

1) 建立客戶端套接字

TcpClient tcpClient=new TcpClient();

注意,須要引入命名空間:

using System.Net;

using System.Net.Sockets;

2) 向遠程服務器發送鏈接請求

int  port = 888;

IPAddress ipAdd=IPAddress.Parse(192.168.1.100」);

tcpClient.Connect(ipAdd, port);

3) 獲取與服務器通訊的流通道

NetworkStream stream = tcpClient.GetStream();

4) 經過流通道與服務器端進行數據傳輸

A..向服務器端發送數據

string cmd=」 CHAT|」 + userAlias + 「:Hello, everyone|」;

byte [] outBytes=Encoding.Default.GetBytes(cmd.ToCharArray());

Stream.Write(outBytes,0,outBytes.Length);

B.接收從服務器端發來的數據

byte [] buff=new byte[1024];

int len= stream.Read(buff,0,buff.Length);

string msg = Encoding.Default.GetString(buff,0,len);

5) 斷開與服務器的鏈接

tcpClient.Close();

 

 

 

TCP編程應用實例——網絡即時通信程序

功能:

登陸、顯示在線用戶、顯示進行聊天的用戶信息、羣聊(發送的信息全部在線用戶都會收到)、私聊(與選定用戶聊天,發送信息只有選定的用戶能夠收到)

 

設計方案:

1. 服務器端的設計

服務器端管理聊天任務,並維持在線用戶列表,轉發用戶發送來的信息,咱們設計的功能以下:

1) 監聽本機IP 地址中的指定端口

2) 當有客戶端向該端口發出請求時,服務器程序當即創建一個與該客戶端的鏈接並啓動一個新的線程來處理該客戶端的全部請求

3) 根據客戶端發來的不一樣請求命令,執行相應的操做,並將處理結果返回給該客戶端。服務器能夠接收識別4種消息命令:CONN(創建新的鏈接)、CHAT(聊天)、PRIV(私聊)和EXIT(離開),每條消息命令能夠包含一個或多個消息參數,用管道符「|」來分隔消息的各部分。表-1列出了全部的消息命令。

 

 

命令格式

說明

CONN|發送者的用戶名|

該命令在客戶端與服務器端創建鏈接後由客戶端自動發送

服務器端收到該命令後,將「用戶名」添加到在線用戶列表並向全部在線用戶發送更新在線用戶列表的命令

CHAT|發送者的用戶名:發送內容|

該命令是用戶在客戶端輸入聊天內容並單擊「發送」按鈕後,由客戶端程序自動發送

服務器端收到該命令後,將「發送者的用戶名:發送內容」轉發給全部在線用戶

PRIV|發送者的用戶名|接收者的用戶名|發送內容|

該命令是用戶在客戶端選擇某個在線用戶並選中「悄悄話」複選框,輸入聊天內容並單擊「發送」按鈕後,由客戶端程序自動發送

服務器端收到該命令後,將「發送者的用戶名|接收者的用戶名|發送內容|」轉發給對應的接收者

EXIT|發送者的用戶名|

該命令是用戶在客戶端單擊「離開」按鈕後,由客戶端程序自動發送

服務器端收到該命令後,將發送者的用戶名從在線用戶列表中刪除,並向全部在線用戶發送更新在線用戶列表命令

 

2. 客戶端的設計

客戶端端包含用戶登陸窗口和聊天的主窗口,它容許用戶登陸到服務器,並能夠向服務器發送消息,同時還可從服務器接收返回的消息,咱們設計的功能以下:

1) 向服務器發送鏈接請求

2) 獲得服務器的確認後,創建與服務器的鏈接,並獲取與服務器進行通訊的流通道(NetworkStream

3) 經過流通道與服務器進行數據通訊。向服務器發送服務器可以識別的4種命令請求,同時接收服務器發回的消息命令。客戶端可以識別的命令有3種:JOIN(通知有新的用戶進入聊天室)、LIST(更新在線用戶列表)、QUIT(關閉客戶端應用程序),每條消息命令能夠包含一個或多個消息參數,用管道符「|」來分隔消息的各部分。表-2列出了全部的消息命令。

 

 

命令格式

說明

JOIN|剛登錄的用戶名|

該命令是在服務器端收到CONN命令後,由服務器端自動發送給客戶端,以通知有新的用戶進入聊天室

客戶端收到該命令後,在各自窗口中顯示此用戶已進入聊天室

LIST|用戶名1|用戶名2|...(全部在線用戶名)|

該命令是在服務器端收到客戶端發來的CONN命令(有新的用戶進入)或EXIT命令(有在線用戶退出)後,由服務器端自動發送給客戶端,以通知全部的在線用戶更新本身的在線用戶列表

客戶端收到該命令後,在各自的窗口中刷新在線用戶列表

QUIT|

該命令是在服務器端收到客戶端發來的EXIT命令後,由服務器端程序自動發送給客戶端(發送EXIT命令的客戶端),以通知該客戶端關閉鏈接並關閉客戶段程序

客戶端(發送EXIT命令的客戶端)收到該命令後,將關閉與服務器的鏈接並關閉客戶段程序

注意:以上命令是自定義的,能夠根據須要增長或更改,只要保證客戶端與服務器端消息命令格式一致就行。

 

 

解決方案:

一、 服務器端的實現

新建一個Windows窗體應用程序,命名爲ChatServer,爲了使用IPAddress對象、Socket對象和Thread對象,需引入命名空間System.NetSystem.Net.SocketsSystem.Threading

在服務器端使用多線程,每一個用戶使用單獨的線程進行鏈接,當服務器開始運行時,便啓動一個線程等待客戶端鏈接(在方法 StartListen() 中實現)。當接收到一個請求時,服務器當即啓動一個新線程來處理和該客戶端的信息交互(在方法 StartService() 中實現)。在此自定義了一個 Client 類,用於保存每一個在線用戶的用戶名和與服務器鏈接的 Socket 對象,當 Socket 鏈接一旦創建,就立刻將其保存在一個 Client 對象中,以便讓每一個用戶有本身的 Socket,之後能夠對不一樣用戶的 Socket 對象進行操做,實現與客戶端的數據交互。

祥見代碼ChatServer.cs

二、 客戶端的實現

新建一個Windows窗體應用程序,命名爲ChatServer,爲了使用IPAddress對象、Socket對象和Thread對象,需引入命名空間System.NetSystem.Net.SocketsSystem.Threading

在客戶端,首先建立客戶端套接字並鏈接到服務器指定端口,同時獲取與服務器通訊的流通道,在用戶登陸後,向服務器發送 CONN 命令以說明有新的用戶進入聊天室,服務器將返回全部在線用戶的暱稱,選擇不一樣的人,並選中「悄悄話」複選框,即可以進行私聊。

相關文章
相關標籤/搜索