【问题标题】:Cannot read data sent from TCP client on python to TCP server in C#无法读取从 python 上的 TCP 客户端发送到 C# 中的 TCP 服务器的数据
【发布时间】:2020-12-03 14:35:01
【问题描述】:

我有一个用 C# 编写的 Windows 服务,它打开了一个 TCP 套接字。我已经通过 telnet 连接并测试了这个 TCP 套接字,并且我能够使用 telnet 协议通过 putty 向套接字发送和接收消息。当连接一个小的 python 脚本时,该脚本能够接收消息,但无法发送它们以使它们被 C# 服务器接收。服务器的代码是:

IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
TcpListener listener = new TcpListener(ipAddress, 5555);
listener.Start();


Thread whileThread = new Thread(() =>
{
    while (true)
    {
        TcpClient client = listener.AcceptTcpClient();
        Thread childThread = new Thread(() =>
        {

            NetworkStream stream = client.GetStream();
            StreamReader streamreader = new StreamReader(client.GetStream(), Encoding.ASCII);
            string line = null;
            WriteToNetworkStream(stream, "Connected to the service");
            eventLog1.WriteEntry("TCP Socket opened");
            eventLog1.WriteEntry((GetState(client) == TcpState.Established).ToString()); //this does return True.
            while ((line = streamreader.ReadLine()) != "<EOF>" && GetState(client) == TcpState.Established)
            {
                eventLog1.WriteEntry(line);
            }
            eventLog1.WriteEntry("TCP Socket closed");

            stream.Close();
            client.Close();
        });

        childThread.Start();

    } 
});
whileThread.Start();

另一边的python脚本是:

import socket
import time

TCP_IP = '127.0.0.1'
TCP_PORT = 5555
BUFFER_SIZE = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
time.sleep(1)
s.send("this is a test")
time.sleep(10)
data = s.recv(BUFFER_SIZE)
print(data)

对方永远不会收到“这是一个测试”的消息,但直到 time.sleep(10) 完成后才会记录“TCP Socket closed”,这表明 C# 确实识别出某种长时间的连接。此外,数据变量确实包含“已连接到服务”,这表明服务器可以向客户端发送数据。就像我之前说的,当尝试使用 telnet 和 putty 发送和接收消息时,这确实可以正常工作。

【问题讨论】:

  • 您希望发送和接收字节而不是字符串。

标签: python c# sockets tcp tcplistener


【解决方案1】:

您是否尝试过从网络流中读取字节?我不能说它是否会有所作为,但值得尝试检查是否有实际字节进入:

NetworkStream stream = client.GetStream();
Byte[] bytes = new Byte[256]; //whatever size is appropriate
int bytesRead;
string data;
while ((bytesRead = stream.Read(bytes, 0, bytes.Length)) != 0)
{
    data = System.Text.Encoding.ASCII.GetString(bytes, 0, bytesRead);
    // ......
}

【讨论】:

  • 这确实有效。 streamreader.ReadLine() 与 stream.Read() 有何不同?他们不应该有相同的目的吗?我对为什么这不起作用感到有点困惑。谢谢你的回答,这在很大程度上解决了它。
猜你喜欢
  • 2021-09-05
  • 2019-06-29
  • 2012-05-26
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 2015-12-26
  • 2019-07-24
  • 2017-02-24
相关资源
最近更新 更多