C# 實現socket通訊程式(伺服器端)
上一篇說的是客戶端https://blog.csdn.net/cj151525/article/details/93061212,那麼這篇就要聊聊伺服器端的程式設計了。具體的計算機網路基礎知識請參考這個網站:https://www.cnblogs.com/dotnet261010/p/6211900.html
先看張原理圖:
伺服器端:
第一步:建立一個用於監聽連線的Socket對像;
第二步:用指定的埠號和伺服器的ip建立一個EndPoint對像;
第三步:用socket對像的Bind()方法繫結EndPoint;
第四步:用socket對像的Listen()方法開始監聽;
第五步:接收到客戶端的連線,用socket對像的Accept()方法建立一個新的用於和客戶端進行通訊的socket對像;
第六步:通訊結束後一定記得關閉socket;
伺服器與客戶端不同,伺服器要開兩個執行緒一個用於監聽連線,一個用於監聽客戶端資訊;還要有兩個socket,一個用於監聽,一個用於通訊。服務端的主要職責是處理各個客戶端傳送來的資料,因此在客戶端的Socket程式設計中需要使用兩個執行緒來迴圈處理客戶端的請求,一個執行緒用於監聽客戶端的連線情況,一個執行緒用於監聽客戶端的訊息傳送。
基本流程
• 建立套接字
• 繫結套接字的IP和埠號——Bind(EndPoint)
• 將套接字處於監聽狀態等待客戶端的連線請求——Listen(int) 監聽埠,其中 int 表示最大監聽數。
• 阻塞方法,當請求到來後,接受請求並返回本次會話的套接字——Accept()接受客戶端連結,並返回一個新的連結,用於處理同客戶端的通訊問題。
• 使用返回的套接字和客戶端通訊——Send()/Receive()
Send(byte[]) 簡單傳送資料。
Send(byte[],SocketFlag) 使用指定的SocketFlag傳送資料。
Send(byte[],int, SocketFlag) 使用指定的SocketFlag傳送指定長度資料。
Send(byte[], int, int,SocketFlag) 使用指定的SocketFlag,將指定位元組數的資料傳送到已連線的socket(從指定偏移量開始)。
Receive(byte[]) 簡單接受資料。
Receive(byte[],SocketFlag) 使用指定的SocketFlag接受資料。
Receive(byte[], int, SocketFlag) 使用指定的SocketFlag接受指定長度資料。
Receive (byte[], int,int, SocketFlag) 使用指定的SocketFlag,從繫結的套接字接收指定位元組數的資料,並存到指定偏移量位置的緩衝區。
• 返回,再次等待新的連線請求
• 關閉套接字
客戶端:
客戶端相對於服務端來說任務要輕許多,因為客戶端僅僅需要和服務端通訊即可,可是因為在和伺服器通訊的過程中,需要時刻保持連線通暢,因此同樣需要兩個執行緒來分別處理連線情況的監聽和訊息傳送的監聽。
基本流程
• 建立套接字保證與伺服器的埠一致
• 向伺服器發出連線請求——Connect(EndPoint)連線遠端伺服器,如果沒有相應的遠端等待連線,直接返回錯誤。
• 和伺服器端進行通訊——Send()/Receive()
• 關閉套接字
服務端接收客戶端資訊並向客戶端返回資訊
服務端:
static void Main()
{
try{
IPEndPoint ipe = new IPEndPoint(IPAddress.Any,8001);
Socket s = newSocket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);//建立一個Socket類
s.Bind(ipe);//繫結
s.Listen(0);//開始監聽
Socket temp = s.Accept();//等待客戶端連線
byte[] recvBytes = new byte[1024];
int bytes = temp.Receive(recvBytes);//從客戶端接受資訊,返回接收的資料長度
string recvStr = Encoding.UTF8.GetString(recvBytes,0, bytes);
Console.WriteLine("Server GetMessage:{0}", recvStr);
string sendStr = "Ok!Client SendMessage Sucessful!";
byte[] bs = Encoding.UTF8.GetBytes(sendStr);
temp.Slend(bs);//向客戶端傳送資料
temp.Close();
s.Close();
}
catch (ArgumentNullException e){
Console.WriteLine("ArgumentNullException:{0}", e);}
catch (SocketException e){
Console.WriteLine("SocketException: {0}", e);}
Console.WriteLine("Press Enter to Exit");
Console.ReadLine();
}
相關文章
- C# 通過socket實現UDP 通訊C#UDP
- c#實現最簡單的socket通訊C#
- C# 如何實現簡單的Socket通訊(附示例)C#
- C/S(socket、執行緒 實現多個客戶端、伺服器端簡易通訊)執行緒客戶端伺服器
- 程式間通訊(Socket)
- Windows Socket程式設計精華《TCP通訊伺服器》Windows程式設計TCP伺服器
- C# NModbus RTU通訊實現C#
- Socket搭建即時通訊伺服器伺服器
- iOS基於Socket.io即時通訊IM實現,WebRTC實現視訊通話iOSWeb
- 通過socket實現DUP程式設計程式設計
- socket通訊
- C#中使用Socket實現簡單Web伺服器C#Web伺服器
- linux網路程式設計之用socket實現簡單客戶端和服務端的通訊(基於TCP)Linux程式設計客戶端服務端TCP
- WebSocket實現前後端通訊Web後端
- 求助:c#客戶端如何跟java伺服器通訊C#客戶端Java伺服器
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- C#實現聯通簡訊Sgip協議程式原始碼C#協議原始碼
- Golang 實現客戶端與伺服器端UDP協議連線通訊Golang客戶端伺服器UDP協議
- C#高效能Socket伺服器SocketAsyncEventArgs的實現(IOCP)C#伺服器
- python實現兩臺不同主機之間進行通訊(客戶端和服務端)——SocketPython客戶端服務端
- Java多執行緒技術:實現多使用者服務端Socket通訊Java執行緒服務端
- unix socket通訊
- 客戶端與服務端Socket通訊原理詳解客戶端服務端
- UDP協議網路Socket程式設計(java實現C/S通訊案例)UDP協議程式設計Java
- java的nio之:java的bio流下實現的socket伺服器同步阻塞模型和socket的偽非同步的socket伺服器的通訊模型Java伺服器模型非同步
- Thinking in Java--使用NIO實現非阻塞Socket通訊ThinkingJava
- 通過 Socket 實現 TCP 程式設計入門TCP程式設計
- 通過 Socket 實現 UDP 程式設計 入門UDP程式設計
- golang實現子程式通訊Golang
- Java實現TCP通訊程式JavaTCP
- JAVA通訊(二)——實現客戶機和伺服器通訊Java伺服器
- Android 使用Socket完成程式間通訊Android
- java多執行緒實現TCP網路Socket程式設計(C/S通訊)Java執行緒TCP程式設計
- Java:基於TCP協議網路socket程式設計(實現C/S通訊)JavaTCP協議程式設計
- (轉)Linux下 C++呼叫C 實現socket網路通訊程式設計LinuxC++程式設計
- C#實現ADH815通訊C#
- Linux網路程式設計之socket簡單通訊--客戶端程式碼Linux程式設計客戶端
- socket.IO通訊