비슷한 질문이 제기되었지만 나에게 효과가없는 것 같습니다. 사전을 직렬화하여 문자열로 변환 한 다음 소켓을 통해 보내기 전에 문자열을 변환하려고했습니다. 지금까지 성공하지 못했습니다!파이썬에서 소켓을 통해 사전을 어떻게 보냅니 까?
이 내 서버 코드 : #library 수입 소켓 수입 피클
소켓 초기화#socket initialization
host = "127.0.0.1"
port = 5000
mainAddr = (host, port)
#dict initialization
dataDict = {} #just imagine that dict has content
#create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #TCP
s.bind((mainAddr))
s.listen(4)
print('program started')
print('listening..')
while True:
try:
conn, addr = s.accept()
print("connection from: "+str(addr))
print("sending message..")
pickle.dumps(dataDict)
print('pickled!')
dataS = str(dataP)
print('stringed!')
dataE = dataS.encode('UTF-8')
print('encoded!')
s.sendto(dataE,addr)
print('data sent!')
except:
pass
s.close()
, 내가 해봤 다른 유형 : 보내는 부분에 대한
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDP
s = socket.socket()
, 나는이 대안을 시도했다 :
s.send(dataE)
s.send(dataE,addr)
s.sendall(dataE)
s.sendall(dataE,addr)
나는이 프로그램을 실행하면
, 이러한 인쇄 얻을 :
program started
listening..
connection from:<insert addr here>
sending message..
pickled!
stringed!
encoded!
은 data sent!
는 전송되지 않습니다. 그래서 나는 그것이 문제가있는 전송 부분이라고 추측합니다.
#library
import socket
import pickle
#initialization
host = '127.0.0.1'
port = 5000
buffer = 1024
#create socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #TCP
s.connect((host,port))
print('connected!')
#receive dictionary
print('receiving message..')
while True:
data, addr = s.recvfrom(buffer)
print('received!')
dataD = data.decode("UTF-8")
print('decoded!')
dataP = pickle.loads(dataD)
print('unpickled!')
print(str(dataP))
s.close()
클라이언트 단말기에서
만 다음 인쇄 : 클라이언트 측에 대한
는, 여기에 코드의 클라이언트 측에connected!
receiving message..
, 나는의 순서를 변경 시도했습니다 unpickling 및 디코딩하지만 여전히 유용합니다.
이것은 실제 코드가 아닙니다. 기능 코드를 게시하십시오. –
문제에 대한 접근 방법에 주목할 때 pickled 객체는 바이너리입니다. 당신은 그들을 str로 변환하고 있습니다 ... 그리고 나서 utf에서 인코딩합니다. 이것은 완전히 난센스입니다. 소켓은 바이너리이므로 소켓을 통해 pickle에서 반환 된 원시 바이트 스트림을 보낼 수 있습니다. 그냥 문제를 직면하면 그것을 단순화하고 반환하려고하십시오 :) –
와우! 그냥 절인에 대한 제안을 해주셔서 감사합니다! 마침내 내 코드가 작동합니다! 이 답변과 아래의 답변은 도움이되었습니다. – ziggy