Socket多个客户端

wsl_wushili 2017-12-13 03:16:30
有多个客户能正常连接服务端,但服务器只能接收当前最新一个客户端发出的信息,老客户的信息就直接被覆盖了。
如果最新连接的客户推出连接,服务器读不到依然连接的老客户发的信息。
服务器代码为:
Listening()
{
.....
newSocket.Bind(localEP);//绑定端口
newSocket.Listen(10);//开始监听
newSocket.BeginAccept(new AsyncCallback(OnConnectRequest), newSocket);//开始异步接受连接
}
startserve()
{
ThreadStart ServerThreadDelegate = new ThreadStart(Listening);//新建一个线程用于委托
ServerThread = new Thread(ServerThreadDelegate);
ServerThread.Start();
}
OnConnectRequest(IAsyncResult ar)
{
serverSocket = (Socket)ar.AsyncState;
clientSocket = serverSocket.EndAccept(ar);//异步接收连接
remote = clientSocket.RemoteEndPoint;
_sessionTable.Add(clientSocket.RemoteEndPoint, null);//将连接成功的客户端实例添加到哈希表中
serverSocket.BeginAccept(new AsyncCallback(OnConnectRequest), serverSocket);//等待新的客户端连接
ReceiveMessage();
}

ReceiveMessage()
{
while (true)
{
byte[] data = new byte[1024];
int recv = clientSocket.Receive(data);
message = Encoding.UTF8.GetString(data, 0, recv);
if(信息不为空)
message 加入队列 //!!在UI界面中用一个线程读队列元素!!,只能读到最新一个客户端发出的信息。
}
}
谢谢大家帮忙!
...全文
226 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
raynors 2017-12-15
  • 打赏
  • 举报
回复
ReceiveMessage() 这个是个公共函数,所有的异步线程都访问这个函数 ,里面的 clientSocket 也是个公共变量,自然是以最后一个为准了. 理论上clientSocket 应该由

OnConnectRequest(IAsyncResult ar)
        {
            serverSocket = (Socket)ar.AsyncState;
           Socket  clientsocket = serverSocket.EndAccept(ar);//异步接收连接  //新建一个线程内变量
            remote = clientSocket.RemoteEndPoint;
            _sessionTable.Add(clientSocket.RemoteEndPoint, null);//将连接成功的客户端实例添加到哈希表中
            serverSocket.BeginAccept(new AsyncCallback(OnConnectRequest), serverSocket);//等待新的客户端连接
            ReceiveMessage(clientsocket );    //内部变量传给消息处理函数
        }
但 ReceiveMessage 仍然是个公共函数,理论上要新开线程.来完成数据处理. 所以一般作异步SOCKET连接 还得有异步消息处理过程. _socket.BeginReceive _socket.EndReceive(ar)
  • 打赏
  • 举报
回复
ReceiveMessage() { while (true) { byte[] data = new byte[1024]; int recv = clientSocket.Receive(data); message = Encoding.UTF8.GetString(data, 0, recv); if(信息不为空) message 加入队列 //!!在UI界面中用一个线程读队列元素!!,只能读到最新一个客户端发出的信息。 } } clientSocket只是当前的socket。你得从_sessionTable取socket,这样就会取所有的socket。
Jason_Mao1 2017-12-14
  • 打赏
  • 举报
回复
用线程吧,同步的话肯定接收的只是当前连接的那个客户端 。希望能帮到你。
zaianda 2017-12-14
  • 打赏
  • 举报
回复
如果性能允许,你可以每个客户端单独一个线程。
xian_wwq 2017-12-13
  • 打赏
  • 举报
回复
异步连接,然后数据处理又成了同步方式 在客户端连接成功后,ReceiveMessage()处理不对 可以参考这个例子 http://download.csdn.net/download/xian_wwq/9636584

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧