2020-09-30Socket 一個伺服器監聽多個客戶端 功能實現
多個Socket通訊客戶端,具體的是伺服器在window系統下c#開發,實現互動通訊。Socket通訊伺服器啟動時,Socket將偵聽到的Socket連線傳給接受Socket,然後由接受Socket完成接受、傳送訊息,當Socket存在異常時,斷開連線。
1、伺服器一直監聽當前客戶端是否有連線
2、動態的保留當前有連線狀態的客戶端
3、伺服器端和客戶端進行互動資料
主函式
public void StartListenUp()
{
IPAddress myIP = GetIPAddress();
IPEndPoint localEndPoint = new IPEndPoint(myIP, _port);
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
listener.Bind(localEndPoint);
listener.Listen(10);
string userIP;
while (true)
{
Socket newClient = listener.Accept();
userIP = ((IPEndPoint)newClient.RemoteEndPoint).Address.ToString();
_transmit_IP.Add(userIP, newClient);
Thread clientThread = new Thread(new ParameterizedThreadStart(ThreadFun));
clientThread.Start(userIP);
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
/// 執行緒執行體,訊息傳遞給執行緒執行體的使用者名稱,用以與使用者通訊
private void ThreadFun(object obj)
{
//通過轉發表得到當前使用者套接字
Socket handler = _transmit_IP[obj] as Socket;
// 業務處理
}
以上是伺服器的主要程式碼並已經和客戶端測試通過
希望大家批評指正。。。
ps:聽人勸吃飽飯,檢視了微軟最新非同步通訊的例子除錯了下
程式碼如下:
public static void StartListening()
{
// Data buffer for incoming data.
byte[] bytes = new Byte[1024];
// Establish the local endpoint for the socket.
// The DNS name of the computer
// running the listener is "host.contoso.com".
IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);
// Create a TCP/IP socket.
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Bind the socket to the local endpoint and listen for incoming connections.
try
{
listener.Bind(localEndPoint);
listener.Listen(100);
while (true)
{
// Set the event to nonsignaled state.
allDone.Reset();
// Start an asynchronous socket to listen for connections.
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);
// Wait until a connection is made before continuing.
allDone.WaitOne();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}
public static void AcceptCallback(IAsyncResult ar)
{
// Signal the main thread to continue.
allDone.Set();
// Get the socket that handles the client request.
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
// Create the state object.
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
}
public static void ReadCallback(IAsyncResult ar)
{
String content = String.Empty;
// Retrieve the state object and the handler socket from the asynchronous state object.
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
// Read data from the client socket.
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
// There might be more data, so store the data received so far.
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
// Check for end-of-file tag. If it is not there, read more data.
content = state.sb.ToString();
if (content.IndexOf("<EOF>") > -1)
{
// All the data has been read from the client. Display it on the console.
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}", content.Length, content);
// Echo the data back to the client.
Send(handler, content);
}
else
{
// Not all data received. Get more.
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
}
}
}
private static void Send(Socket handler, String data)
{
// Convert the string data to byte data using ASCII encoding.
byte[] byteData = Encoding.ASCII.GetBytes(data);
// Begin sending the data to the remote device.
handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);
}
private static void SendCallback(IAsyncResult ar)
{
try
{
// Retrieve the socket from the state object.
Socket handler = (Socket)ar.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("Sent {0} bytes to client.", bytesSent);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
作者:江南煙雨居
出處:http://www.cnblogs.com/newstart//
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
相關文章
- websocket(多個客戶端)Web客戶端
- C/S(socket、執行緒 實現多個客戶端、伺服器端簡易通訊)執行緒客戶端伺服器
- jQuery實現客戶端CheckAll功能jQuery客戶端
- 實現一個clickhouse tcp協議客戶端驅動TCP協議客戶端
- ORACLE 動態註冊,靜態註冊,多個監聽,一個監聽多個埠配置Oracle
- FTP客戶端c程式碼功能實現FTP客戶端C程式
- 啟動多個zabbix_agented客戶端客戶端
- ntp客戶端配置多個時間源客戶端
- 如何用Java Socket實現一個簡單的Redis客戶端JavaRedis客戶端
- 實現上傳(增刪)多個檔案的客戶端寫法。 (轉)客戶端
- Oracle 10g RAC客戶端配置監聽Oracle 10g客戶端
- 記筆記:C# Socket客戶端監聽伺服器端處理方案【同步】筆記C#客戶端伺服器
- pycurl實現hadoop的客戶端功能薦Hadoop客戶端
- FishRedux完成一個玩安卓客戶端Redux安卓客戶端
- 手擼一個新聞客戶端客戶端
- 建立一個Twisted Reactor TCP客戶端ReactTCP客戶端
- 如何建立一個Java遊戲客戶端Java遊戲客戶端
- WCF 第一章 基礎 為一個ASMX服務實現一個WCF客戶端ASM客戶端
- c#實現redis客戶端(一)C#Redis客戶端
- oracle 監聽配置多個埠Oracle
- 誰能接這個活:做一個網址的PC客戶端,實現自動控制客戶端
- 【Java】Java多執行緒實現的聊天客戶端和伺服器Java執行緒客戶端伺服器
- locust 新手問下 locust 自定義一個 socket 客戶端該如何實現客戶端
- Redis 6.0 客戶端快取的伺服器端實現Redis客戶端快取伺服器
- 藍芽客戶端和伺服器的實現藍芽客戶端伺服器
- TCP實現公網伺服器和內網客戶端一對多訪問(C語言實現)TCP伺服器內網客戶端C語言
- GankIo又一個ReactNative客戶端React客戶端
- C++程式碼實現一個簡易http服務端,返回給客戶端一張圖片C++HTTP服務端客戶端
- nginx 80埠監聽多個域名Nginx
- oracle 多個例項監聽不到Oracle
- 客戶端骨架屏實現客戶端
- X-Forwarded-For中多個IP哪個是真實客戶端IP? - adam-pForward客戶端
- 一個高顏值Flutter版WanAndroid客戶端FlutterNaNAndroid客戶端
- 寫一個Flutter彩票客戶端--開獎列表Flutter客戶端
- React Native 專案(One 【一個】客戶端)React Native客戶端
- CXF入門教程(2) -- 第一個客戶端客戶端
- 監聽發現區域網dropbox客戶端broadcast-dropbox-listener客戶端AST
- 客戶端JavaScript的5個弊端客戶端JavaScript