接收客户端返回的数据

2024-04-28

我使用套接字连接从服务器发送了一个缩放数组到客户端,它运行良好,现在我想将数据发送回服务器以在服务器中取消缩放。数据一次每行发送到客户端,因此我尝试将它们按顺序放回到名为 Final 的空数组中。

这是服务器.py

import socket
import numpy as np
import pandas as pd
import sklearn
from sklearn.preprocessing import MinMaxScaler

i = 0
scaler_ti = MinMaxScaler()
test_inputs = []
test_inputs = np.array(test_inputs)
temp_in = pd.read_excel(r'K:\BachelorThesis\Data\TestingData\Mix_Data_inputs.xlsx')
test_inputs = temp_in.to_numpy()
rows = test_inputs.shape[0]
scaler_ti.fit(test_inputs)
normalized_test_inputs = scaler_ti.transform(test_inputs)


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = ''
port = 62402
s.bind((host,port))
s.listen(5)

while True:

    connection, clientsocket, address = s.accept()
    print(f"connection from {address} has been established!")
    strg = test_inputs
    temp = strg.tobytes()
    clientsocket.send(temp)
    clientsocket.close()

    if i in range(65533):
        i = i + 1
        msg = connection.recv(64)
        out = np.frombuffer(msg)
        inverse = scaler_ti.inverse_transform(out.reshape(1,8))
        print(inverse)

这是客户端.py

import socket
import numpy as np
import pandas as pd
import sklearn
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import load_model
import tensorflow as tf
from random import randint

i = 0
final = []
final = np.array(final)
#modelLSTM = load_model('K:\BachelorThesis\code testing\TireForces.LSTM/LSTM_model.h5')

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 62402
s.connect((host, port))

while True:
    if i in range(65533):
        i = i + 1
        msg = s.recv(64)
        out = np.frombuffer(msg)
        #out = out.reshape(1,8)
        #out = out.reshape(1,1,8)
        #prediction = modelLSTM.predict(out)
        #inverse = scaler_ti.inverse_transform(prediction.reshape(1,8))
        #print(prediction)
        #print(inverse)
        final = np.vstack(out) 
        print(out)
        if len(msg) <= 0:
             break
    strg = final
    temp = strg.tobytes()
    s.send(temp)
    #serversocket.close()
#print (final)

这是我从 server.py 得到的错误

Traceback (most recent call last):
  File "K:\BachelorThesis\code testing\server.py", line 26, in <module>
    connection, clientsocket, address = s.accept()
ValueError: not enough values to unpack (expected 3, got 2)

这是我从 client.py 得到的错误

Traceback (most recent call last):
  File "K:\BachelorThesis\code testing\client.py", line 31, in <module>
    final = np.vstack(out)
  File "<__array_function__ internals>", line 5, in vstack
  File "C:\Users\karim\AppData\Local\Programs\Python\Python39\lib\site- 
packages\numpy\core\shape_base.py", line 283, in vstack
    return _nx.concatenate(arrs, 0)
  File "<__array_function__ internals>", line 5, in concatenate
ValueError: need at least one array to concatenate

你的主要问题是accept()总是只发送两个值,但您期望三个。

它应该是

 connection, address = s.accept()

你应该使用connection代替clientsocket


但它会带来其他问题,因为你关闭了clientsocket发送数据后,但您还需要此连接来接收数据。

所有这些看起来就像您加入了两个代码。这些代码可以单独工作,但不能一起工作 - 因为两者都需要关闭连接以通知数据已结束,但现在您无法在发送后关闭它,因为您需要连接来接收其他数据。

您必须使用不同的方式通知对方数据已结束。您必须首先发送数据大小(作为具有恒定大小的对象,因此作为字符串发送将不起作用,因为不同的数字可能有不同的长度),然后发送数据。然后另一方必须首先获取数据大小(作为具有恒定大小的对象),然后使用该值来检测是否获取了所有数据。

您可以使用struct转换integer大小为 4 字节(因此对于不同的值它将具有恒定的大小),另一方将必须读取 4 字节并再次使用struct转换回integer

我无法运行它,但这是代码。

Server:

import socket
import struct

import numpy as np
import pandas as pd
import sklearn
from sklearn.preprocessing import MinMaxScaler

# --- functions ---

def send_data(connection, data):
    data_size = len(data)
    data_size_as_4_bytes = struct.pack('>I', data_size)
    
    connection.send(data_size_as_4_bytes)    
    connection.send(data)

def recv_data(connection, chunk_size=64):
    data_size_as_4_bytes = connection.recv(4)
    data_size = struct.unpack('>I', data_size_as_4_bytes)[0]
    
    data = b""
    size = 0

    while size < data_size:
        chunk = connection.recv(chunk_size)
        size += len(chunk)
        data += chunk
    
    return data

# --- main ---

scaler_ti = MinMaxScaler()

temp_in = pd.read_excel(r'K:\BachelorThesis\Data\TestingData\Mix_Data_inputs.xlsx')

test_inputs = temp_in.to_numpy()
rows = test_inputs.shape[0]

scaler_ti.fit(test_inputs)
normalized_test_inputs = scaler_ti.transform(test_inputs)

# -- send ---

HOST = ''  # or '0.0.0.0'
PORT = 62402

#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = socket.socket()  # default values are `socket.AF_INET, socket.SOCK_STREAM`
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # solution for '[Error 89] Address already in use'. Use before bind()
s.bind((HOST, PORT))
s.listen(5)

try:
    while True:
        print('Waiting for client')

        # wait for new client
        connection, address = s.accept()
        print(f"connection from {address} has been established!")
        
        # --- send data ---
        
        print('send:', test_inputs)
        
        data = test_inputs.tobytes()
        send_data(connection, data)
        
        # don't close it because it is needed to receive data
        #clientsocket.close()

        # --- receive data ---

        data = recv_data(connection)
        output_data = np.frombuffer(data)
        
        print('recv:', output_data)

        # --- now you can close ---

        connection.close()
        
except KeyboardInterrupt:
    print("Stopped by Ctrl+C")
finally:
    s.close()
        

Client:

import socket
import struct

import numpy as np
import pandas as pd
import sklearn
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import load_model
import tensorflow as tf
from random import randint

# --- functions ---

def send_data(connection, data):
    data_size = len(data)
    data_size_as_4_bytes = struct.pack('>I', data_size)
    
    connection.send(data_size_as_4_bytes)    
    connection.send(data)

def recv_data(connection, chunk_size=64):
    data_size_as_4_bytes = connection.recv(4)
    data_size = struct.unpack('>I', data_size_as_4_bytes)[0]
    
    data = b""
    size = 0

    while size < data_size:
        chunk = connection.recv(chunk_size)
        size += len(chunk)
        data += chunk
    
    return data

def some_calcuations(input_data)

    # need something different
    output_data = input_data
    
    return output_data

# --- main ---

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 62402
s.connect((host, port))

# --- recv ---

data = recv_data(s)
input_data = np.frombuffer(msg)

print('recv:', input_data)

# --- calculations ---

output_data = some_calcuations(input_data)

# --- send ---

print('send:', output_data)

data = output_data.tobytes()
send_data(s, data)

# --- close ---

s.close()

BTW:

上周有类似的问题,我展示了工作代码 - 并且它也使用threading同时为许多客户端运行服务器。

GUI运行时使用socket发送图像(截图):
完全单击按钮时,tkinter 中没有响应 https://stackoverflow.com/questions/68430982/not-responding-in-tkinter-when-click-button-completely

使用套接字发送pickle:
Pickle 数据被截断 https://stackoverflow.com/questions/68425224/pickle-data-truncated

在服务器线程中使用套接字与多个客户端一起工作:
如何在 Python 中使用套接字处理多线程? https://stackoverflow.com/questions/68425239/how-to-handle-multithreading-with-sockets-in-python


EDIT:

循环发送的版本。

在所有行之后,它发送单词end通知数据已结束。

或者它可以在数据之前发送行数。

Server:

import socket
import numpy as np

import struct

# --- functions ---

def send_data(connection, data):
    data_size = len(data)
    data_size_as_4_bytes = struct.pack('>I', data_size)
    
    connection.send(data_size_as_4_bytes)    
    connection.send(data)

def recv_data(connection, chunk_size=64):
    data_size_as_4_bytes = connection.recv(4)
    data_size = struct.unpack('>I', data_size_as_4_bytes)[0]
    
    data = b""
    size = 0

    while size < data_size:
        chunk = connection.recv(chunk_size)
        size += len(chunk)
        data += chunk
    
    return data

# --- main ---

np.random.seed(0)  # it will always gives the same random numbers
test_inputs = np.random.random_sample((3,5))

# -- send ---

HOST = ''  # or '0.0.0.0'
PORT = 62402

#s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s = socket.socket()  # default values are `socket.AF_INET, socket.SOCK_STREAM`
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  # solution for '[Error 89] Address already in use'. Use before bind()
s.bind((HOST, PORT))
s.listen(5)

try:
    while True:
        # --- wait for new client ---

        print('Waiting for client')
        
        connection, address = s.accept()
        print(f"Connection from {address} has been established!")

        # --- send ---
        
        for row in test_inputs:
        
            # --- send data ---
            
            print('send:', row)
            
            data = row.tobytes()
            send_data(connection, data)

            # --- receive data ---

            data = recv_data(connection)
            row = np.frombuffer(data)
            
            print('recv:', row)

        # information that it is end of data 
        send_data(connection, 'end'.encode())

        # --- now you can close ---
        
        connection.close()
        
except KeyboardInterrupt:
    print("Stopped by Ctrl+C")
finally:
    s.close()

Client:


# author: Bartlomiej "furas" Burek (https://blog.furas.pl)
# date: 2021.07.23
#
# title: receiving back data from the client
# url: https://stackoverflow.com/questions/68499599/receiving-back-data-from-the-client/68502806#68502806

import socket
import numpy as np
from random import randint

import struct

# --- functions ---

def send_data(connection, data):
    data_size = len(data)
    data_size_as_4_bytes = struct.pack('>I', data_size)
    
    connection.send(data_size_as_4_bytes)    
    connection.send(data)

def recv_data(connection, chunk_size=64):
    data_size_as_4_bytes = connection.recv(4)
    data_size = struct.unpack('>I', data_size_as_4_bytes)[0]
    
    data = b""
    size = 0

    while size < data_size:
        chunk = connection.recv(chunk_size)
        size += len(chunk)
        data += chunk
    
    return data

def some_calcuations(input_data):

    # need something different
    output_data = input_data
    
    return output_data

# --- main ---

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 62402
s.connect((host, port))

while True:
    # --- recv ---

    data = recv_data(s)

    if data == b'end':
        break

    input_data = np.frombuffer(data)

    print('recv:', input_data)

    # --- calculations ---

    output_data = some_calcuations(input_data)

    # --- send ---

    print('send:', output_data)
    
    data = output_data.tobytes()
    send_data(s, data)

# --- close ---

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

接收客户端返回的数据 的相关文章

  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • Python设置1和True的解释

    在 IPython 3 交互式 shell 中 In 53 set2 1 2 True hello In 54 len set2 Out 54 3 In 55 set2 Out 55 hello True 2 是因为 1 和 True 得到
  • sy.sympify(str(表达式)) 不等于表达式

    据我了解 str将 SymPy 表达式转换为字符串并sympify将字符串转换为 SymPy 表达式 因此 我希望以下内容成立 对于合理的表达 gt gt gt sy sympify str expr expr True 我尝试过这个 确实
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • Python函数组成

    我尝试使用良好的语法来实现函数组合 这就是我所得到的 from functools import partial class compfunc partial def lshift self y f lambda args kwargs s
  • 如何将脚本作为 pytest 测试运行

    假设我有一个用简单脚本表示的测试assert 陈述 请参阅背景了解原因 例如 import foo assert foo 3 4 我如何以一种好的方式将该脚本包含在我的 pytest 测试套件中 我尝试了两种有效但不太好的方法 一种方法是将
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • 导入目录下的所有模块

    有没有办法导入当前目录中的所有模块 并返回它们的列表 例如 对于包含以下内容的目录 mod py mod2 py mod3 py 它会给你
  • 预测测试图像时出现错误 - 无法重塑大小数组

    我正在尝试使用 TensorFlow 和 Keras 在 Python 中进行图像识别 并且我已经关注了下面的博客 https stackabuse com image recognition in python with tensorfl
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • Python 或 C 语言中的 Matlab / Octave bwdist()

    有谁知道 Matlab Octave bwdist 函数的 Python 替代品 此函数返回给定矩阵的每个单元格到最近的非零单元格的欧几里得距离 我看到了一个 Octave C 实现 一个纯 Matlab 实现 我想知道是否有人必须用 AN
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • Python RE(总之检查第一个字母是否区分大小写,其余部分不区分大小写)

    在下面的情况下 我想匹配字符串 Singapore 其中 S 应始终为大写 其余单词可能为小写或大写 但在下面的字符串 s 是小写的 它在搜索条件中匹配 任何人都可以让我知道如何实施吗 import re st Information in
  • 旧版本的 spaCy 在尝试安装模型时抛出“KeyError: 'package'”错误

    我在 Ubuntu 14 04 4 LTS x64 上使用 spaCy 1 6 0 和 python3 5 为了安装 spaCy 的英文版本 我尝试运行 这给了我错误消息 ubun ner 3 NeuroNER master src pyt
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 如何在 Qt 中以编程方式制作一条水平线

    我想弄清楚如何在 Qt 中制作一条水平线 这很容易在设计器中创建 但我想以编程方式创建一个 我已经做了一些谷歌搜索并查看了 ui 文件中的 xml 但无法弄清楚任何内容 ui 文件中的 xml 如下所示
  • 如何查找连接到 AF_INET 套接字的客户端的 UID?

    有什么方法或类似的东西ucred for AF UNIX如果是AF INET插座 TCP在我的例子中 找出连接到我的套接字的客户端的UID 还有 proc net tcp但它显示了UID of the creator插座的而不是连接的cli
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin
  • 用 Beautiful Soup 进行抓取:为什么 get_text 方法不返回该元素的文本?

    最近我一直在用 python 开发一个项目 其中涉及抓取一些网站的一些代理 我遇到的问题是 当我尝试抓取某个知名代理站点时 当我要求 Beautiful Soup 查找 IP 在代理表中的位置时 它并没有按照我的预期执行操作 我将尝试查找每

随机推荐