我正在尝试设置一个连续读取来自端口的字符串的服务器。 我已经找到了一些代码,但它只会读取一个字符串然后停止。 如何修改它以便它不断读取到达该端口的字符串并将它们放入文本框?
我尝试过设置“while(true)”,但这会挂掉我的表单。我正在研究如何在backgroundWorker或Thread中监听套接字。
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);
}
答案 0 :(得分:3)
您需要在收到第一部分后再次致电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
}
}