Python中通过套接字发送和接收对象

2023-11-23

我在互联网上搜索了很多,但我还没有找到通过套接字发送对象并按原样接收它的解决方案。我知道它需要酸洗,我已经完成了。另一方面,它将其转换为字节并被接收。但是如何将这些字节转换为该类型的对象呢?

process_time_data = (current_process_start_time, current_process_end_time)
prepared_process_data = self.prepare_data_to_send(process_time_data)
data_string = io.StringIO(prepared_process_data)
data_string =  pack('>I', len(data_string)) + data_string
self.send_to_server(data_string)

这是在客户端将对象转换为 StringIO 并发送到服务器的代码。在服务器端我正在获取字节。现在我正在搜索要再次转换为 StringIO 的字节,以便可以获得对象值。

在代码中,Object 被包装在 StringIO 中并通过套接字发送。有更好的方法吗?

服务器端代码如下。

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#server.setblocking(0)
server.bind(('127.0.0.1', 50000))
server.listen(5)
inputs = [server]
outputs = []
message_queues = {}

while inputs:
    readable, writeable, exceptional = select.select(inputs, outputs, inputs)
    for s in readable:
        if s is server:
            connection, client_address = s.accept()
            print(client_address)
            connection.setblocking(0)
            inputs.append(connection)
            message_queues[connection] = queue.Queue()
            print('server started...')
        else:
            print('Getting data step 1')
            raw_msglen = s.recv(4)
            msglen = unpack('>I', raw_msglen)[0]
            final_data = b''
            while len(final_data) < msglen:
                data = s.recv(msglen - len(final_data))
                if data:
                    #print(data)
                    final_data += data
                    message_queues[s].put(data)
                    if s not in outputs:
                        outputs.append(s)
                    else:
                        if s in outputs:
                            outputs.remove(s)
                else:
                    break
            inputs.remove(connection)
            #s.close()
            del message_queues[s]

            process_data = ProcessData()
            process_screen = ProcessScreen()

            if final_data is not None:
                try:
                    deserialized_data = final_data.decode("utf-8")
                    print(deserialized_data)
                except (EOFError):
                    break
            else:
                print('final data is empty.')

            print(process_data.project_id)
            print(process_data.start_time)
            print(process_data.end_time)
            print(process_data.process_id)

两个辅助函数如下:

def receive_all(server, message_length, message_queues, inputs, outputs):
    # Helper function to recv message_length bytes or return None if EOF is hit
    data = b''
    while len(data) < message_length:
        packet = server.recv(message_length - len(data))
        if not packet:
            return None
        data += packet
        message_queues[server].put(data)
        if server not in outputs:
            outputs.append(server)
        else:
            if server in outputs:
                outputs.remove(server)
    inputs.remove(server)
    del message_queues[server]
    return data


def receive_message(server, message_queues, inputs, outputs):
    # Read message length and unpack it into an integer
    raw_msglen = receive_all(server, 4, message_queues, inputs, outputs)
    if not raw_msglen:
        return None
    message_length = unpack('>I', raw_msglen)[0]

    return receive_all(server, message_length, message_queues, inputs, outputs)

其中两个模型类如下:

class ProcessData:
    process_id = 0
    project_id = 0
    task_id = 0
    start_time = 0
    end_time = 0
    user_id = 0
    weekend_id = 0

# Model class to send image data to the server
class ProcessScreen:
    process_id = 0
    image_data = bytearray()

您正在寻找pickleloads and dumps运营。套接字基本上是字节流。让我们考虑一下您的案例。

class ProcessData:
    process_id = 0
    project_id = 0
    task_id = 0
    start_time = 0
    end_time = 0
    user_id = 0
    weekend_id = 0

此类的实例需要通过执行以下操作将其腌入数据字符串中data_string = pickle.dumps(ProcessData())并通过做来解开data_variable = pickle.loads(data) where data是收到的内容。

因此,让我们考虑一种情况,客户端创建一个对象ProcessData并将其发送到服务器。这是客户端的样子。这是一个最小的例子。

Client

import socket, pickle

class ProcessData:
    process_id = 0
    project_id = 0
    task_id = 0
    start_time = 0
    end_time = 0
    user_id = 0
    weekend_id = 0


HOST = 'localhost'
PORT = 50007
# Create a socket connection.
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

# Create an instance of ProcessData() to send to server.
variable = ProcessData()
# Pickle the object and send it to the server
data_string = pickle.dumps(variable)
s.send(data_string)

s.close()
print 'Data Sent to Server'

现在接收此数据的服务器如下所示。

Server

import socket, pickle

class ProcessData:
    process_id = 0
    project_id = 0
    task_id = 0
    start_time = 0
    end_time = 0
    user_id = 0
    weekend_id = 0


HOST = 'localhost'
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr

data = conn.recv(4096)
data_variable = pickle.loads(data)
conn.close()
print data_variable
# Access the information by doing data_variable.process_id or data_variable.task_id etc..,
print 'Data received from client'

运行服务器首先创建一个bind在端口上,然后运行client通过套接字进行数据传输。您还可以看看这个答案.

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

Python中通过套接字发送和接收对象 的相关文章

随机推荐

  • 字符串变量可以设置多少个字符?

    我有一个字符串类型的变量 例如string test 我可以设置多少个字符进行测试 谢谢 所有引用类型 如字符串 实例的最大大小是有限的 由 CLR 改为 2GB 由于 NET 中的一个字符占用 2 个字节 这意味着一个字符串最多可以容纳大
  • StreamProvider 不更新状态

    我正在尝试使用StreamProvider from this很棒的包 但我一直在努力让特定的流正常工作 我创建一个StreamController我用它来添加数据Stream通过其Sink 所有这一切似乎都运作良好 但是当使用这个Stre
  • 允许 PHP 会话延续到子域

    我对所有用户数据以及当用户访问其个人资料时使用 PHP 会话 不是 cookie 除了会话 id cookie user mydomain example他们会立即 注销 直到删除子域 有没有办法接受来自所有域的会话 只要它 mydomai
  • Internet Explorer 中的 标记

    既没有标签也不text decoration blink Internet Explorer 支持 css 中的样式 有什么技术可以在 IE 中制作闪烁文本吗 如果可能的话 避免眨眼 这会惹恼别人 但你可以用 JS jQuery 来做到这一
  • ASP.NET Identity 2 支持匿名用户吗?

    我想允许匿名 尚未注册和注册的用户在我的网站上发帖 Posts table Id int Subject nvarchar Body nvarchar UserId uniqueidentifier 该项目使用最新的 MS 技术 ASP N
  • 将 GVim 配色方案更改为类似于命令行 Vim

    是否可以使 GVim 的配色方案与命令行版本 Vim 中的配色方案完全匹配 与白色背景的 GVim 相比 我更喜欢 Vim 的颜色 但我仍然想使用 GVim 因为 Shift 键在命令行版本上映射得不太好 是的 可以使 gvim 与终端 V
  • 感人片段

    任何人都可以建议我为此的算法 您将获得 x 轴上 N 个线段的起点和终点 这些片段中有多少可以被恰好两条垂直于它们的线接触到 即使是在它们的边缘 输入示例 3 5 2 3 1 3 1 5 3 4 4 5 5 1 2 1 3 2 3 1 4
  • 我可以指定 WPF DataGrid 中哪些列是可编辑的吗?

    我有一个带有自动生成列的 WPF 4 0 DataGrid 我只想允许用户编辑第一列 有一个简单的方法可以做到这一点吗 我试图添加 DataGridCell 样式并根据 ColumnName 第一列始终具有相同的名称 或 ColumnInd
  • 强制 IE7 进入标准渲染模式(不是怪癖)

    由于 IE7 在怪异模式下渲染 我在 IE7 中遇到显示问题 我通过显示 document compatMode 并返回 BackCompat 而不是 CSS1Compat 来确认这一点 使用 IE8 并恢复到 IE7 是可行的 因为这样可
  • 如何在 Springfox 中更改 Swagger UI index.html 徽标和标题内容?

    我正在记录使用 Spring Boot 2 4 3 创建的 APIspringfox swagger3 0 0 所以我现在有以下页面 我的客户想要将 Swagger UI 徽标更改为他们自己的 我做不到 我搜索并找到了一些解决方案 但它不起
  • 仅当应用程序未运行时显示推送通知 android

    在我的应用程序中 我集成了推送通知GCM 每当通知出现时它就工作正常 但即使用户位于应用程序内部 也会出现推送通知 我希望仅当用户位于应用程序外部时才显示通知 这是我的推送通知代码 Gcm广播接收器 public class GcmBroa
  • 初学者选择 DirectX 9 还是 DirectX 10?

    我想做一些项目 让我的简历对游戏公司更有吸引力 所以我要开始买书了 但我不知道应该从阅读 DirectX 9 或 10 api 书籍开始 DirectX10 很棒 但业界似乎正在 缓慢向 10 迈进 那么我应该使用 9 还是使用 10 我建
  • 为应用程序选择多个 Internet 连接之一

    我有一台具有几种不同互联网连接的计算机 LAN WLAN WiFi 或 3G 所有这些都是活动的 机器可以使用其中任何一个 现在我想告诉我的应用程序使用可用的连接之一 例如 我想告诉我的应用程序仅使用 WiFi 而其他软件可能使用其他功能
  • Android - 自定义语音操作的意图

    当我使用谷歌语音搜索时 我可以说 发送文本 谷歌将启动我的短信程序 我可以说 听 谷歌将启动我的默认音乐应用程序 我的应用程序是否可以注册它自己的 特殊短语 例如 MyApp DoSomething 然后让 Google 启动 MyApp
  • 更优雅的多行 JavaScript 字符串方法

    我知道如何在不使用 的情况下打印大字符串的唯一方法是使用 反斜杠 丑陋的 div div 有没有办法在 longString 不受污染的情况下做到这一点 php 有 foo 长多行字符串
  • Android Actionbar 设置选项卡宽度

    目前我正忙于为我的公司开发 WHMCS 应用程序 作为导航 我想使用操作栏中的选项卡功能 但是 如何编辑选项卡的宽度 我需要在一个屏幕上同时显示 5 个内容 而无需滚动 我已经尝试过一些这样的样式
  • 如何在样式表中的 URL 中换行

    我有一个包含很长行 数据网址 的样式表 无论如何 我可以将这些行分成更小的行吗 长线示例 background image url data image png base64 really long string 您可以通过将 URI 用引
  • 圆与圆段碰撞

    我正在努力寻找一个可靠的解决方案来检测圆和圆段之间的碰撞 想象一下游戏敌人的视场锥体 其中圆圈代表感兴趣的物体 底部的图表是我为了尝试解决一些可能的情况而绘制的 但我确信还有更多 我了解如何快速排除极端情况 我丢弃任何不与整个圆碰撞的目标
  • 如果 WebAppContext 启动失败,如何取消启动或关闭 jetty

    我正在使用 Maven Jetty 插件 如果任何 bean 失败 有没有办法阻止服务器启动或关闭 例如使用 maven jetty plugin 这是一个例子 2013 04 22 11 43 59 327 WARN oejw WebAp
  • Python中通过套接字发送和接收对象

    我在互联网上搜索了很多 但我还没有找到通过套接字发送对象并按原样接收它的解决方案 我知道它需要酸洗 我已经完成了 另一方面 它将其转换为字节并被接收 但是如何将这些字节转换为该类型的对象呢 process time data current