客户端和服务器监听请求 [英] Clients and Server Listening for requests
问题描述
我想知道如果我的思维方式是什么好。
这里是sitution:
I would like to know if my way of thinking is any good. Here is sitution:
- 服务器接受异步的连接。之后接受的是recieveing上接受的套接字异步。
- 客户端连接到异步服务器,然后侦听请求异步。
我想要做的是发送从客户端和服务器的请求。对方应该接受她。
What I want to do is to send requests from both client and server. Other side should recieve it.
服务器code:
public ServerHandler()
{
_serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_serverSocket.Bind(_ipLocal);
_serverSocket.Listen(4);
_serverSocket.BeginAccept(AcceptCallback, null);
}
private void AcceptCallback(IAsyncResult ar)
{
Socket socket = (Socket)ar.AsyncState;
_clients.Add(socket);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecieveCallback, socket);
_serverSocket.BeginAccept(AcceptCallback, null);
}
private void RecieveCallback(IAsyncResult ar)
{
var socket = (Socket) ar.AsyncState;
var recieved = socket.EndReceive(ar);
var dataBuff = new byte[recieved];
Array.Copy(_buffer, dataBuff, recieved);
OnMessageRecieved(dataBuff);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecieveCallback, socket);
}
private void Send(byte[] data, Socket socket)
{
socket.BeginSend(data, 0, data.Length, SocketFlags.None,
SendCallback, socket);
}
private void SendCallback(IAsyncResult ar)
{
var socket = (Socket)ar.AsyncState;
socket.EndSend(ar);
}
private void SendToAll(byte[] data)
{
foreach (var clientSocket in _clients)
{
Send(data, clientSocket);
Debug.WriteLine("sent to: " + clientSocket.LocalEndPoint);
}
}
客户端code:
Client code:
public ClientHandler()
{
_ipLocal = new IPEndPoint(IPAddress.Parse(ServerIp), Port);
}
public void ConnectLoop()
{
int attempts = 0;
while (!_clientSocket.Connected)
{
try
{
attempts++;
_clientSocket.BeginConnect(IPAddress.Parse(ServerIp), Port, ConnectCallback, null);
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecieveCallback,
_clientSocket);
}
catch (Exception)
{
Debug.WriteLine("Connection attempts: " + attempts);
}
}
Debug.WriteLine("Connected");
}
private void ConnectCallback(IAsyncResult ar)
{
_clientSocket.EndConnect(ar);
}
private void RecieveCallback(IAsyncResult ar)
{
var socket = (Socket) ar.AsyncState;
int recieved = _clientSocket.EndReceive(ar);
var dataBuff = new byte[recieved];
Array.Copy(_buffer, dataBuff, recieved);
OnMessageRecieved(dataBuff);
_clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, RecieveCallback, _clientSocket);
}
private void Send(byte[] data, Socket socket)
{
socket.BeginSend(data, 0, data.Length, SocketFlags.None,
SendCallback, socket);
}
private void SendCallback(IAsyncResult ar)
{
var socket = (Socket)ar.AsyncState;
socket.EndSend(ar);
}
将某事像这样的工作?
Will sth like this work?
EDIT1:哦,我想通过1插槽做到这一点。客户端/服务器发送和recieveing在同一个插座。但可以有多个客户端<击>插槽击>,但只有1对客户端 - 服务器。
Oh, and I want to do it through 1 socket. Client/server sending and recieveing on same socket. But there can be multiple clients sockets, but only 1 for pair client-server.
推荐答案
如果没有测试,你的code看起来没事但是,你需要提供额外的code,以确定是否有一个整个邮件或不。
Without testing, your code looks alright however, you'll need to provide extra code to determine if you've got a whole message or not.
当你读,你可能会得到以下情形之一:
When you do a read, you may get one of the following scenarios:
- 一些消息,但不是全部
- 所有确切的消息
- 所有的消息,加上一些/所有其他消息的
- 套接字错误(断线等)。
有确定的一些普遍接受的方法是什么一个整体消息:
There are a few generally accepted methods of determining what a whole message is:
- 划定的留言,这样receival code需要寻找分隔符
- 带有某种嵌入一个固定的消息大小来表示,如果有更多的消息
- 一个可变信息大小,但与被发送的第一即说的第4个字节将指示消息的大小固定大小的一部分。所以,你知道你总是需要4个字节首先要确定消息的长度;然后你知道多少,为下一个消息处理。
这SO张贴聊天有更多的一些服务应用程序和处理消息的链接。
This SO post Chat service application has some more and links on processing messages.
这篇关于客户端和服务器监听请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!