【发布时间】:2015-08-10 13:10:18
【问题描述】:
我编写了一个 TCPClient 程序以在我的 PC 上运行。它首先启动一个 TCP 侦听器以侦听特定端口,然后在多个线程上读取/写入多个 TCP 客户端。
我可以从客户端读取数据,但是每当我尝试向其发送数据时,程序都会显示它已发送数据,但客户端没有收到任何内容。
代码如下:
TcpClient client = listener.AcceptTcpClient();
var childSocketThread = new Thread(() =>
{
if (client.Connected)
{
using (NetworkStream stream = client.GetStream())
{
Console.WriteLine("connected");
byte[] data = new byte[1000];
try
{
if (stream.CanRead)
{
stream.Read(data, 0, 1000);
string dataStr = Encoding.ASCII.GetString(data);
string dataa = dataStr.TrimEnd('\0');
//Console.WriteLine(dataa);
if (dataa.Length > 10)
{
deviceid = ParseRequest(dataa);
byte[] sendnow = Encoding.ASCII.GetBytes(reply[deviceid]);
Array.Clear(data, 0, 1000);
Console.WriteLine("Recieved data: " + dataa);
Console.WriteLine("Sending data");
using (StreamWriter writer = new StreamWriter(stream))
{
writer.AutoFlush = true;
writer.WriteLine(reply[deviceid]);
}
Console.WriteLine(reply[deviceid]);
Console.WriteLine("Sent");
}
Console.WriteLine();
}
}
catch (Exception es)
{
Console.WriteLine(es);
}
}
}
});
childSocketThread.Start();
我使用的服务器设备是 PLC。另外,我已经尝试过的事情:
1) 使用 Socket.Send 方法直接发送。
2) 使用 NetworkStream 方法直接发送。
3) 接受 TCP 连接作为套接字。 (Socket device = listener.AcceptSocket)。
这些方法似乎都没有发送到设备,即使程序告诉我发送数据没有问题,因为它在尝试发送数据后显示“已发送”。 我从此链接http://www.codeproject.com/Articles/488668/Csharp-TCP-Server 下载了另一个程序。他们提供的测试应用程序能够在与我在同一台 PC 上运行的程序相同的端口上发送和接收数据。
我无法就如何诊断以及更重要的是解决此问题获得任何指导。有什么想法吗?
2015 年 8 月 10 日上午 11:18 更新:
该程序的输出如下:
【问题讨论】:
-
您需要向我们展示客户端和服务器代码。我已经看到你做错了很多事情,但我们确实需要双方。
-
客户端代码是BCL语言的PLC代码,不知道有没有人知道。但另一方面,测试代码应用程序(链接到代码项目)可以在相同的客户端代码上正常工作。
-
您确定要发送一个以 CRLF 结尾的字符串吗?您似乎从设备获得的数据表明
\0是终止符。并且绝对避免在网络流附近的任何地方使用StreamWriter/StreamReader:)) -
更重要的是,如果 \0 是当前请求的终止符,他可能会读取更多数据并尝试解析它,因为缓冲区是 1000 长。此外,Read 函数返回一个 int 值,告诉您它实际上能够读取多少内容。保持从流中读取直到达到 \0 或 1000 很重要,因为您的客户端可能只能读取 11 个字节,这可能不足以正确解析它。
-
另外,包括您的客户端程序从接受连接到发送的输出。让我们看看你得到什么,然后解析和发送
标签: c# sockets tcpclient tcpserver