首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用套接字将字节从Python发送到Java?

如何使用套接字将字节从Python发送到Java?
EN

Stack Overflow用户
提问于 2018-06-30 07:28:21
回答 1查看 3.1K关注 0票数 1

我读过一些关于如何在Python中使用套接字发送图片,以及如何在Java中使用套接字发送图片的帖子,我想将两者结合起来,使用两端的套接字将图片从Python发送到Java。我的大部分代码取自我读过的帖子,但这里是python客户端:

代码语言:javascript
复制
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect(("192.168.0.12",4141))

try:

    file = open("subbed.jpg", 'rb')
    bytes = file.read()
    print "{0:b}".format(len(bytes))
    size = len(bytes)
    s.sendall(size)

    answer = s.recv(4096)
    print "Answer = %s" %answer 

    if answer == 'GOT SIZE':
        s.sendall(bytes)

        answer = s.recv(4096)

        if answer == 'GOT IMAGE' :
            s.sendall("byte")
    file.close()
finally:
    s.close()

Java服务器的代码是:

代码语言:javascript
复制
public static void main(String[] args) {
    while(true) {
        try (
                ServerSocket server = new ServerSocket(PORT_NUMBER);
                Socket client = server.accept();
                PrintWriter out = new PrintWriter(client.getOutputStream(), true);
                InputStream in = client.getInputStream()) {
            System.out.println("GOT CONNECTION FROM: " + client.getInetAddress().toString());
            byte[] sizeAr = new byte[4];

            in.read(sizeAr);
            int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();
            System.out.println(Integer.toBinaryString(size));
            out.println("GOT SIZE");

            byte[] imageAr = new byte[size];
            in.read(imageAr);

            BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageAr));
            ImageIO.write(image, "jpg", new File("C:\\myprivatelocation\\test.jpg"));

        } catch (Exception ioe) {
            ioe.printStackTrace();
        }
    }
}

我认为最初的问题来自于发送尺寸。我不是python专家,也不是Java专家,但我认为Python将大小作为字符串发送,Java将其作为字节数组接收,并将其转换为整数,这两种语言中存储它们的方式存在一些差异。有没有人能为这个问题提供任何帮助?

EN

回答 1

Stack Overflow用户

发布于 2018-06-30 07:46:19

有些东西关闭了-当你尝试在套接字中发送一些整数时,你应该会得到某种错误:

代码语言:javascript
复制
>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect(('localhost', 7777))
>>> s.sendall(len(b'some bytes'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'int'

套接字只能发送bytes,你必须以某种方式将包含该大小的int对象转换为bytes,python不会自动为你做这件事。您的代码应该会失败,并显示上面的错误。

在java代码中,你使用asIntBuffer()Integer.toBinaryString来转换你的值,在python代码中,你只是尝试发送数据而不进行转换,你应该会得到错误。

现在,要将int转换为bytes,您可以使用struct模块;它将转换为C语言使用的二进制表示-我认为这正是您的java代码所期望的

代码语言:javascript
复制
 size_in_bytes = struct.pack('I', len(data_to_send))

同样,您应该使用struct.unpack将字节转换回整数对象。有关更多详细信息和可能的转换表,请参阅documentation

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51110497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档