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通訊C#
- C/S(socket、執行緒 實現多個客戶端、伺服器端簡易通訊)執行緒客戶端伺服器
- 程式間通訊(Socket)
- Windows Socket程式設計精華《TCP通訊伺服器》Windows程式設計TCP伺服器
- C# NModbus RTU通訊實現C#
- Socket搭建即時通訊伺服器伺服器
- socket通訊
- C#實現ADH815通訊C#
- 通過 Socket 實現 TCP 程式設計入門TCP程式設計
- 通過 Socket 實現 UDP 程式設計 入門UDP程式設計
- python實現兩臺不同主機之間進行通訊(客戶端和服務端)——SocketPython客戶端服務端
- Thinking in Java--使用NIO實現非阻塞Socket通訊ThinkingJava
- 網路程式設計-Socket通訊程式設計
- UDP協議網路Socket程式設計(java實現C/S通訊案例)UDP協議程式設計Java
- TCP通訊客戶端和服務端簡單程式碼實現TCP客戶端服務端
- Java多執行緒技術:實現多使用者服務端Socket通訊Java執行緒服務端
- WebSocket實現前後端通訊Web後端
- Android Socket 通訊Android
- 使用python搭建伺服器並實現Android端與之通訊Python伺服器Android
- Golang 實現客戶端與伺服器端UDP協議連線通訊Golang客戶端伺服器UDP協議
- Java:基於TCP協議網路socket程式設計(實現C/S通訊)JavaTCP協議程式設計
- java多執行緒實現TCP網路Socket程式設計(C/S通訊)Java執行緒TCP程式設計
- epoll+socket實現 socket併發 linux伺服器Linux伺服器
- Java實現TCP通訊程式JavaTCP
- golang實現子程式通訊Golang
- socket程式設計實現tcp伺服器_C/C++程式設計TCP伺服器C++
- 打工筆記--------------------------c#實現串列埠通訊筆記C#串列埠
- C#實現掃碼槍串列埠通訊C#串列埠
- 基於 socket.io 快速實現一個實時通訊應用
- socket.IO通訊
- socket通訊的建立
- JAVA通訊(二)——實現客戶機和伺服器通訊Java伺服器
- 通過 App Groups 實現程式間通訊APP
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- 通過C#實現OPC-UA服務端(二)C#服務端
- Zsh 開發指南(第十七篇 使用 socket 檔案和 TCP 實現程式間通訊)TCP
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- 記筆記:C# Socket客戶端監聽伺服器端處理方案【同步】筆記C#客戶端伺服器