Программирование сокетов в Python с использованием Pickle - PullRequest
0 голосов
/ 02 декабря 2018

Я использовал функцию pickle в python для вопроса о программировании сокетов.Но выходные данные, которые я получаю на сервере, печатаются как «<<strong> main .ProcessData instance at 0x7fbacba37f38>» вместо того, что отправляется.

Код сервера и клиента:

СЕРВЕР

import socket, pickle

class ProcessData:
    print "Server is Listening....." 


print "Server is Listening....."
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
print 'Data received from client'

КЛИЕНТ

import socket, pickle

class ProcessData:
    print 'ABCDEFGHIJK'



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'

Получаю следующий вывод:

Серверпрослушивает ..... сервер прослушивает ..... подключен ('127.0.0.1', 34726) <<strong> main .ProcessData экземпляр в 0x7f8e2dfaaf80> данные, полученные от клиента

Но я должен получить ABCDEFGHIJ.Что мне делать?

1 Ответ

0 голосов
/ 02 декабря 2018

Непонятно, почему у вас есть операторы print в ваших class объявлениях, но если поместить ваши данные в оператор print, объявление класса, конечно, не то, что вам нужно.

Вы правильно выбираете, отправляете,и получение объекта, но ваш объект ничего не делает.

Вероятно, вам понадобится какой-то модуль с вашим общим типом данных, и тогда клиент и сервер смогут взаимодействовать с этим типом.

Я создал processdata.py со следующим:

class ProcessData:
    def __init__(self, data= 'ABCDEFGHIJK'):
        self.data = data
    def __str__(self): return self.data

И затем изменил ваш код следующим образом:

КЛИЕНТ

import socket, pickle
from processdata import ProcessData

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'

СЕРВЕР

import socket, pickle

print "Server is Listening....."
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
print 'Data received from client'

И тогда я получаю

Server is Listening.....
Connected by ('127.0.0.1', 50941)
ABCDEFGHIJK
Data received from client
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...