c# - 如何继续接受异步套接字上的数据?
问题描述
因此,我使用 C# 中的 Socket 类设置了一个非常基本的服务器和客户端。我之前做过一个它不是异步的,所以我决定尝试一下。
我遇到的问题是我一直从服务器向客户端发送数据,但客户端只得到第一个,然后就好像它停止监听了。有什么方法可以继续检查是否有传入数据,然后是否只是抓取它?
客户
private static Socket _clientSocket;
private static byte[] buffer = new byte[2048];
static void Main(string[] args)
{
Connect();
Console.ReadLine();
}
private static void Connect()
{
try
{
_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_clientSocket.BeginConnect(new IPEndPoint(IPAddress.Loopback, 1234), new AsyncCallback(ConnectCallback), null);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
private static void ConnectCallback(IAsyncResult AR)
{
try
{
_clientSocket.EndConnect(AR);
Console.WriteLine("Connected to the server");
_clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
new AsyncCallback(ReceiveCallback), _clientSocket);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
private static void ReceiveCallback(IAsyncResult AR)
{
Socket clientSocket = AR.AsyncState as Socket;
var length = clientSocket.EndReceive(AR);
byte[] packet = new byte[length];
Array.Copy(buffer, packet, packet.Length);
var data = Encoding.ASCII.GetString(packet);
Console.WriteLine("Received " + data);
}
和服务器
private static Socket _clientSocket;
private static byte[] buffer = new byte[2048];
static void Main(string[] args)
{
Connect();
Console.ReadLine();
}
private static void Connect()
{
try
{
_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_clientSocket.BeginConnect(new IPEndPoint(IPAddress.Loopback, 1234), new AsyncCallback(ConnectCallback), null);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
private static void ConnectCallback(IAsyncResult AR)
{
try
{
_clientSocket.EndConnect(AR);
Console.WriteLine("Connected to the server");
_clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
new AsyncCallback(ReceiveCallback), _clientSocket);
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
private static void ReceiveCallback(IAsyncResult AR)
{
Socket clientSocket = AR.AsyncState as Socket;
var length = clientSocket.EndReceive(AR);
byte[] packet = new byte[length];
Array.Copy(buffer, packet, packet.Length);
var data = Encoding.ASCII.GetString(packet);
Console.WriteLine("Received " + data);
}
解决方案
在您的 ReceiveCallback 中,再次调用 BeginReceive 以继续接收。
推荐阅读
- java - Hibernate 生成额外的表
- oracle - 如何在 Oracle 中执行与 LISTAGG 相反的操作
- javascript - 为什么我的反应路由器不工作?点击时 URL 发生变化,但在 DOM 上不显示
- c++ - 如何将 C++ 中的 VT100 转义序列打印到 Windows 终端?
- python - 如何用 Python pptx 替换 PPP 中的文本?
- arrays - 如何获取输出结果在括号中的数组,如 [1][2][3] 到 [1 2 3]
- javascript - 使用纯 Java 脚本单击旁边的按钮后如何删除每个项目
- android - 是否可以在android中将一个设备共享屏幕到另一台设备?
- android - 如何更改现有的 .apk 应用程序 ID?
- python - ValueError:输入 0 与层 lstm_14 不兼容:预期 ndim=3,发现 ndim=2