接收客户端返回的数据

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(使用前将#替换为@)

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

  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • Python 中 genfromtxt() 的可变列数?

    我有一个 txt具有不同长度的行的文件 每一行都是代表一条轨迹的一系列点 由于每条轨迹都有自己的长度 因此各行的长度都不同 也就是说 列数从一行到另一行不同 据我所知 genfromtxt Python 中的模块要求列数相同 gt gt g
  • Sorted(key=lambda: ...) 背后的语法[重复]

    这个问题在这里已经有答案了 我不太明白背后的语法sorted 争论 key lambda variable variable 0 Isn t lambda随意的 为什么是variable在看起来像的内容中陈述了两次dict 我认为这里的所有
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • python ttk treeview:如何选择并设置焦点在一行上?

    我有一个 ttk Treeview 小部件 其中包含一些数据行 如何设置焦点并选择 突出显示 指定项目 tree focus set 什么也没做 tree selection set 0 抱怨 尽管小部件明显填充了超过零个项目 但未找到项目
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • 字典的嵌套列表

    我正在尝试创建dict通过嵌套list groups Group1 A B Group2 C D L y x 0 for y in x if y x 0 for x in groups d k v for d in L for k v in
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • 如何逐像素绘制正方形(Python,PIL)

    在空白画布上 我想使用 Pillow 逐像素绘制一个正方形 我尝试使用 img putpixel 30 60 155 155 55 绘制一个像素 但它没有执行任何操作 from PIL import Image def newImg img
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • 将 Scikit-Learn OneHotEncoder 与 Pandas DataFrame 结合使用

    我正在尝试使用 Scikit Learn 的 OneHotEncoder 将 Pandas DataFrame 中包含字符串的列替换为 one hot 编码的等效项 我的下面的代码不起作用 from sklearn preprocessin
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐