Python 套接字从 Java PrintWriter 套接字接收不完整的消息

2023-12-07

我制作了一个 python“队列”(类似于 JMS 协议),它将接收来自两个 Java 客户端的问题。 python 服务器将从其中一个 Java 客户端接收消息,第二个客户端将读取问题并发布答案。连接和消息传递工作正常,当 Java 客户端用很长的字符串进行应答时,问题就出现了。

python收到的响应不完整!更糟糕的是,消息被剪切为一定数量的字符并且始终保持相同的长度,但是,如果其他人托管服务器,则该数字会有所不同。 (即:friend1 托管服务器,friend2 发送响应,收到的长度:1380 个字符。Friend2 托管服务器,friend1 发布答案,收到的长度:1431 个字符)这是服务器端 python 代码:

s = socket.socket()         
host = socket.gethostname() 
# host = "192.168.0.20"
port = 12345  
s.bind((host, port))

s.listen(5)                 
while True:
    c, addr = s.accept()     
    # print 'Got connection from', addr
    message = c.recv(8192) #Is this length a problem?

    # print message
    message = message.strip()
    ipAddress = addr[0]

我在 StackOverflow 上读到问题,c.recv() 对于大量字节应该没有问题,而我们的响应接近 1500 个字符。这是java客户端:

private void openConnection(){
        try {

            socket = new Socket(HOST, PORT);

            out = new PrintWriter(socket.getOutputStream(), true);

            in = new BufferedReader(new InputStreamReader(
                    socketPregunta.getInputStream()));    

            stdIn = new BufferedReader(new InputStreamReader(System.in));


        } catch (Exception e) {}

}

public void sendAnswer(String answer) throws IOException{
        openConnection();

        out.write("PUBLISH-" + answer); //This answer is send incomplete!
        out.flush();

        closeConnection();
}

提前致谢!


从文档中:

recv(buffersize[ flags]) -> 数据

从套接字接收最多 buffersize 字节。对于可选的 flags 参数,请参阅 Unix 手册。当没有数据可用时,阻塞 直到至少有一个字节可用或直到远程端 关闭。当远端关闭且所有数据读取完毕后,返回 空字符串。

So recv()可以返回比您要求的更少的字节,这就是您的情况所发生的情况。网上有这方面的讨论套接字操作方法.

基本上你需要继续打电话recv()直到您收到完整的消息,或者远程对等方关闭连接(由recv()返回一个空字符串)。如何做到这一点取决于您的协议。选项有:

  1. 使用固定大小的消息
  2. 有某种分隔符或标记来检测消息结束
  3. 让客户端提供消息长度作为消息的一部分
  4. 让客户端在发送完消息后关闭连接。显然在这种情况下它将无法收到响应。

查看您的 Java 代码,选项 4 可能适合您,因为它发送消息,然后关闭连接。这段代码应该可以工作:

s = socket.socket()         
host = socket.gethostname() 
# host = "192.168.0.20"
port = 12345  
s.bind((host, port))

s.listen(5)                 
while True:
    c, addr = s.accept()     
    # print 'Got connection from', addr

    message = []
    chars_remaining = 8192
    recv_buf = c.recv(chars_remaining)
    while recv_buf:
        message.append(recv_buf)
        chars_remaining -= len(recv_buf)
        if chars_remaining = 0:
            print("Exhausted buffer")
            break
        recv_buf = c.recv(chars_remaining)

    # print message
    message = ''.join(message).strip()
    ipAddress = addr[0]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 套接字从 Java PrintWriter 套接字接收不完整的消息 的相关文章

随机推荐

  • 使用 Maven 管理 DLL 依赖项

    我有一个 Java 程序 使用 Maven 管理其依赖项 其中一个依赖项是另一个程序的 JNI 包装器 Maven 负责对相关 JAR 文件的引用 但我自己却在处理 DLL 文件 有没有好的方法让 Maven 也处理 DLL 理想情况下 我
  • 如何清除所有用户的会话?

    我在我的项目中使用 php 会话 我更新了代码 向会话添加了一些值 现在我需要清除所有现有会话 ps 我的操作系统是ubuntu 9 04 默认情况下 PHP 会话信息存储在 tmp 下的文件中 文件名通常以 sess 为前缀 因此删除这些
  • lxml classic:获取除嵌套标签之外的文本内容?

    这一定是绝对的经典 但我在这里找不到答案 我正在使用 lxml cssselect 解析以下标签 li a href stations 1 span class num 3 span Detroit a li 我想获取的内容 li tag
  • 如何在python中搜索文件夹名称并将其删除

    我有一个文件夹和子文件夹的目录 我需要搜索它以找到某个文件夹名称 旧数据 以便我可以删除 旧数据 中的文件并删除文件夹本身及其中的文件 但是不是它的父文件夹 有 122 个文件夹可供搜索 其中只有一些文件夹包含名为 旧数据 的子文件夹 如何
  • 找不到 CFBundle CertUIFramework.axbundle 的可执行文件

    刚刚更新到 Xcode 5 这是它在我所有应用程序的记录器上抛出的第一个错误 似乎无法理解为什么会发生这种情况 2013 09 19 10 46 54 341 MyApp 1156 a0b Cannot find executable fo
  • 将我自己的参数发送到事件处理程序?

    我正在专门使用 AssemblyResolve 首先是我的代码 然后我的问题如下 var a AppDomain CurrentDomain a AssemblyResolve new ResolveEventHandler HandleI
  • JQuery具有特定类的多个html表格单元格的总和

    我有一个包含许多行的 HTML 表格 每行都有一个单元格 sum类 我如何计算所有单元格的总和 sum class total sum of td with sum class table tr td Name 1 td td Desc 1
  • 根据背景颜色获取值的总和 - Google 表格

    可以在谷歌表格中根据如下格式对一行数据求和 sumif a1 d1 if background is green 解释 我认为实现你的目标的唯一方法是使用谷歌应用脚 本特别是自定义功能 自定义函数如下totalColor cells col
  • 异步方法正确吗?修磨机警告

    在我的方法中RecalcChartAsync我做了一些时间密集的事情 所以我想我会异步做一些事情 我想启动这两个方法CreateHistogramAsync CalculatePropValuesAsync同时在我的中做一些事情Recalc
  • 如何使用SceneKit编辑器创建AR Portal效果?

    我想创建一个原型像这个 仅使用 Xcode SceneKit 编辑器 我找到了一个answer房间是通过简单的编程方式创建的SCNPlane对象并调整渲染顺序 但是 我想整合一些更详细的内容 例如下载房间的 3D 模型 并使其只能通过门户访
  • 迭代直到达到 int.MaxValue

    作为一个小测试 我想看看在 C 控制台应用程序中计算 int MaxValue 需要多长时间 每隔几个小时我就会检查一下进度 昨晚 当我以为程序将完成执行时 它执行回到 0 我不确定为什么会发生这种情况 我想知道是否有人可以向我解释一下 它
  • 在android中保存来自服务器的图像的最佳方法

    我正在开发一个应用程序并从服务器获取产品图像 目前 我将这些图像转换为字节数组后将其保存到 SQLite 数据库中 并在使用时将它们转换回位图 现在我有以下两个疑问 将图像保存在应用程序中的最佳方法是什么 我们也可以在其中同步它们并在需要时
  • Prestashop 1.7 客户密码加密?

    我为 Prestashop 1 6 制作了一些基于 php 的第三方系统 它可以直接连接 Prestashop 数据库 我已将 Presta 升级到 1 7 5 1 并且可以正常使用 只是它不再登录客户 因为正如我所看到的 密码加密已更改
  • xcode 中 .strings 文件中的杂注标记替代是什么?

    pragma mark 适用于 h 文件 在 strings 文件中使用什么来实现相同的效果 A strings文件基本上是一个具有特殊格式的plist文件 也就是说 它不是编译器的输入文件 这也意味着 一个 pragma不允许出现在 pl
  • 如何从 Spring Data MongoDB 中的 MongoDB ObjectId 中提取时间戳?

    MongoDB文档建议从 ObjectId 中提取插入时间 而不是使用单独的时间字段 有谁知道如何使用 Spring Data MongoDB 做到这一点 特别是 我想查询在特定日期范围内插入的文档 很容易从ObjectId 但是你没有得到
  • 当父文档可能不存在时更新 MongoDB 子文档

    这是我的数据 包括books集合 具有书评子集合 books id ObjectId 5558f40ad498c653748cf045 title Widget XYZ isbn 1234567890 reviews id ObjectId
  • R将具有开始和结束年份的数据帧转换为时间序列[重复]

    这个问题在这里已经有答案了 我想将具有起始年和结束年变量的数据框转换为完整的时间序列 其中 1 包含起始年和结束年之间的所有年份 2 填写以下值其间年份的所有变量 原始数据如下所示 data original lt data frame n
  • Hyperledger Fabric:对等链码实例化错误

    启动容器时出错 无法生成特定于平台的 docker 构建 从构建返回错误 1 无法加载包 包 bin github com hyperledger fabric chaincode marbles 打开 bin github com hyp
  • 我应该如何使用 createJs 创建响应式画布以适应不同移动设备的屏幕?

    我想开发一款html5手机游戏 如您所知 移动设备的屏幕尺寸不同 因此我想创建一个响应式画布 以便它可以适应不同的屏幕 最简单的方法是根据视口使用 JavaScript 调整画布大小 然后重排内容 var w container width
  • Python 套接字从 Java PrintWriter 套接字接收不完整的消息

    我制作了一个 python 队列 类似于 JMS 协议 它将接收来自两个 Java 客户端的问题 python 服务器将从其中一个 Java 客户端接收消息 第二个客户端将读取问题并发布答案 连接和消息传递工作正常 当 Java 客户端用很