使用Python和Java打开套接字的区别

1 投票
1 回答
1143 浏览
提问于 2025-04-17 09:08

我在用Java打开和关闭多个连接到同一个主机时,遇到了一个很奇怪的问题。

我想用一个for循环来打开一个tcp连接,发送一些数据,接收响应,然后关闭连接。但是在这个循环执行到第三次的时候,它就不工作了。虽然打开和写入socket还是可以的,但读取就不行了。

我最开始以为是远程主机的问题,但我写了一个小的python脚本来调试,结果一切正常,这个脚本轻松执行了超过50次的for循环,远程主机也总是按预期回复。

那么,python在打开和关闭socket时和Java有什么不同吗?我该怎么调试这个问题呢?

谢谢。

更新:

这是我在两种情况下使用的代码:

Python:

for i in range(0, 10):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    s.send(command)
    data = s.recv(1024)
    data = data[2:]
    print 'Received', "--->%s<--" % data.decode()

Java:

   for (int i = 0; i < 10; i++) {
        Socket socket = new Socket("localhost", 9998);

        OutputStream bos = socket.getOutputStream();
        InputStream bis = socket.getInputStream();

        byte[] raw = "XX0000NC".getBytes();
        raw[0] = 0x0;
        raw[1] = 0x6;

        bos.write(raw);
        bos.flush();

        byte[] buffer = new byte[1024];
        int readCount = bis.read(buffer);

        System.out.println(new String(Arrays.copyOfRange(buffer, 2, readCount)));

        socket.shutdownOutput();
        socket.shutdownInput();
        socket.close();
    }

1 个回答

0

你没有显示出在Python代码中使用的command的值。也许你发送了不同的命令?

我能看到的唯一其他区别是,在Python中你使用socket.send,而在Java中你使用OutputStream.write

当没有足够的缓冲区空间来写入所有数据时,会出现不同的行为:

  • send只发送它能发送的那部分数据,如果不能发送任何数据,它就会阻塞,直到可以发送为止。
  • write会一直阻塞,直到所有字节都发送完。

老实说,我觉得这种情况不太可能,因为你发送的命令非常短……

你可以很简单地测试这个情况,把你的Python代码改成:

for i in range(0, 10):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    sent = s.send(command)
    if sent != len(command):
        print 'Some bytes not sent!!!\n'
    data = s.recv(1024)
    data = data[2:]
    print 'Received', "--->%s<--" % data.decode()

撰写回答