我开发了一个打开套接字的服务器,每秒接收一个int号。这是我的代码。
private void runServer()
{
TcpListener tcpListener = new TcpListener(IPAddress.Any, 16001);
tcpListener.Start();
updateUI("Buscando clientes");
while (true)
{
TcpClient client = tcpListener.AcceptTcpClient();
Thread tcpHandlerThread = new Thread(new ParameterizedThreadStart(tcpHandler));
tcpHandlerThread.Start(client);
}
}
private void tcpHandler(object client)
{
TcpClient mClient = (TcpClient)client;
NetworkStream stream = mClient.GetStream();
byte[] message = new byte[1024];
stream.Read(message, 0, message.Length);
updateUI("HR: " + Encoding.ASCII.GetString(message) + "\n");
stream.Close();
mClient.Close();
}
我希望同时连接4个设备发送 int 数据,但是使用此代码,服务器停止接收几秒钟,然后一起接收所有设备。你可以说我需要做的改变就是听4个套接字并每秒获取我的int数据吗?
修改
这是调用runServer()
的代码 private void cmdServer_Click(object sender, EventArgs e)
{
if (serverStatus)
{
//El servidor está iniciado, así que paramos el servidor
cmdServer.Text = "Run server";
updateUI("Server Stopped.");
serverStatus = false;
cmbEventos.Enabled = true;
lblTituloEvento.ForeColor = System.Drawing.Color.Orange;
lblTituloEvento.Text = "Selecciona el evento y pulsa Iniciar Servidor";
}
else
{
Thread tcpServerRunThread = new Thread(new ThreadStart(runServer));
tcpServerRunThread.Start();
updateUI("Server is now running.");
cmdServer.Text = "Stop server";
serverStatus = true;
cmbEventos.Enabled = false;
lblTituloEvento.ForeColor = System.Drawing.Color.Green;
lblTituloEvento.Text = "Server " + cmbEventos.Text + " Online";
int numConvert;
bool resultado = int.TryParse(cmbEventos.SelectedValue.ToString(), out numConvert);
idEvento = numConvert;
}
}
编辑2:
我添加了循环,因为我们说:
private void tcpHandler(object client)
{
TcpClient mClient = (TcpClient)client;
NetworkStream stream = mClient.GetStream();
StringBuilder myCompleteMessage = new StringBuilder();
byte[] message = new byte[1024];
int numberOfBytesRead;
// Incoming message may be larger than the buffer size.
do
{
numberOfBytesRead = stream.Read(message, 0, message.Length);
myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(message, 0, numberOfBytesRead));
}
while (stream.DataAvailable);
//Old Reading
//stream.Read(message, 0, message.Length);
String messageRec = myCompleteMessage.ToString();
String[] auxMessage = messageRec.Split(new Char[] { '-' });
switch (auxMessage[0])
{
case "HR":
//HR command received
updateUI("HR: " + auxMessage[1] + "\n");
break;
}
stream.Close();
mClient.Close();
}
答案 0 :(得分:0)
您没有使用Read的返回值。它告诉你实际接收的字节数,最小值为1。
通常,您需要循环阅读。
TCP提供无边界字节流。如果你想发送消息,你需要发明一些执行此操作的协议。例如,长度前缀的protobuf是一个好主意。
此外,您的设计能够处理多个客户端。它应该工作。
您需要异步处理。
不,这与问题无关。使用线程作为套接字就可以了。