c#连续套接字监听
本文关键字:监听 套接字 连续 | 更新日期: 2023-09-27 18:08:13
我正在尝试设置一个服务器,连续读取通过端口的字符串。我写了一段代码,但它只读取一个字符串,然后停止。我如何修改它,使它连续读取到该端口的字符串,并将它们放入文本框?
我试过放一个"while(true)",但那会挂起我的表单。我目前正在研究如何使套接字在后台工作者或线程中侦听。
public void start_server()
{
_server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_server_socket.Bind(new IPEndPoint(IPAddress.Any, 1234));
_server_socket.Listen(0);
_server_socket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private void AcceptCallback(IAsyncResult AR)
{
_client_socket = _server_socket.EndAccept(AR);
_buffer = new byte[_client_socket.ReceiveBufferSize];
_client_socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
private void ReceiveCallback(IAsyncResult AR)
{
string text = Encoding.ASCII.GetString(_buffer);
write(text);
}
private void write(string text)
{
MethodInvoker invoker = new MethodInvoker(delegate
{
textBox1.Text =textBox1.Text+text;
});
this.Invoke(invoker);
}
您需要在接收到第一部分后再次调用BeginReceive
重新启动接收。
此外,您还缺少EndReceive
,因此
- 没有错误处理
- 无法发现远端是否关闭。
- 不知道你实际接收了多少字节(可以小于
_buffer.Length
)。
应该是这样的:
private void ReceiveCallback(IAsyncResult AR)
{
try
{
int bytesTransferred = resultState.Socket.EndReceive(ar);
if (bytesTransferred == 0) return; // Closed
string text = Encoding.ASCII.GetString(_buffer, 0, bytesTransferred);
write(text);
// Read more
_client_socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), null);
}
catch (Exception e)
{
// Error handling
}
}