首先我做道歉,如果这样的问题存在,我搜索谷歌和通过可能有我的答案但找不到它的问题。 我有以下的服务器代码:c#异步服务器回复
private void StartServer()
{
try
{
sSocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
sSocket.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, 0);
sSocket.Bind(new IPEndPoint(IPAddress.Any, 6666));
sSocket.Listen(0);
sSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Server", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void AcceptCallback(IAsyncResult ar)
{
try
{
cSocket = sSocket.EndAccept(ar);
buffer = new byte[cSocket.ReceiveBufferSize];
cSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
sSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Server", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
int received = cSocket.EndReceive(ar);
if(received == 0)
{
return;
}
Array.Resize(ref buffer, received);
text = Encoding.ASCII.GetString(buffer);
DisplayText(text);
cSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Server", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void DisplayText(string text)
{
Dispatcher.BeginInvoke(new Action(delegate
{
textBox.Text += ">> " + text + "\r\n" + "\r\n";
}));
}
而下面的客户端代码:
private void connect()
{
try
{
cSocket = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
cSocket.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, 0);
cSocket.BeginConnect(new IPEndPoint(IPAddress.Parse("192.168.1.2"), 6666), new AsyncCallback(ConnectCallback), null);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Registracija", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
cSocket.EndConnect(ar);
buffer = Encoding.ASCII.GetBytes("sendstuff");
cSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), null);
}
catch (SocketException) { }
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Registracija", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void SendCallBack(IAsyncResult ar)
{
cSocket.EndSend(ar);
}
我知道,我使用的是一个外部IP能够插座一个本地IP。我刚刚删除了一些非重要的东西,并把本地IP隐藏外部的一个。因此,我将客户端连接到服务器,没有问题,一切都很好,我可以毫无问题地将数据发送到服务器,但我无法弄清楚/找到任何地方如何让服务器向客户端回复一些东西。举个例子,假设我发送一个字符串给服务器,说“我是一个字符串”。现在,服务器用这个字符串做了一些事情,比方说,切断“我是”,现在需要将剩下的“字符串”发送回客户端。
正在发送的字符串非常简单,所以缓冲区在我的情况下工作正常。事情是,如果我BeginSend我打电话显示文本如何将客户端接收它,因为没有ReceiveCallbacks等? – snorkle213
显然你需要使用'BeginReceive'并在你发送数据之前在你的客户端注册你的回调函数,即在'ConnectCallback'函数中。事情是,可以在另一侧的单个“接收”回调中接收多个“发送”,反之亦然。因为你正在处理流,所以要小心。这就是为什么如果您想要多次处理数据,您需要分隔符/结构化数据,例如从多个句子中删除“我”。 – mostruash