Ես գրում եմ Python-ի մի քանի խաղացողների առցանց խաղ: Սերվերն օգտագործում է Python 3.0, իսկ հաճախորդը՝ Python 2.7 (որովհետև ես ուզում եմ օգտագործել իմ սմարթֆոնը և կարող եմ գտնել միայն Python 2.7-ը դրա վրա): Այնուամենայնիվ, ես դժվարանում եմ վերափոխել տողի կոդավորումը սերվերի և հաճախորդի միջև:
Ես գրել եմ երկու ֆունկցիա՝ sendData
և receiveData
՝ վարդակից միացումից տող ուղարկելու և ստանալու համար: Խնդիրն այն է, որ երբ ես կոդավորում եմ 你好
տողը «utf-8» սերվերի կողմից և ապակոդավորում այն հաճախորդի կողմից, հաճախորդի վրա ստացա հետևյալ սխալը.
UnicodeDecodeError. «utf8» կոդեկը չի կարող վերծանել բայթերը 0-1 դիրքում. տվյալների անսպասելի ավարտ
Ես փորձեցի encode('utf-8')
երկու կողմից կամ decode*('utf-8')
երկու կողմից, բայց երկուսն էլ չաշխատեցին: Ես նաև փորձեցի օգտագործել թթու վարունգ, բայց հաճախորդի մոտ ստացա հետևյալ սխալը.
ValueError. չաջակցվող թթու վարունգի արձանագրություն՝ 3
Այսպիսով, ինչպե՞ս պետք է կոդավորեմ և վերծանեմ տողը:
Ահա իմ սերվերի կոդը (Python 3.0, datatrans.py):
def sendData(sock, data):
'''
Send string through socket.
'''
sock.send(struct.pack('Q', len(data)))
sock.send(bytes(data.encode('utf-8'))) # This might be the cause of the error
def receiveData(sock):
'''
Receive object from socket.
'''
lengthLeft = struct.unpack('Q', sock.recv(struct.calcsize('Q')))[0]
data = bytes()
while lengthLeft > 0:
block = sock.recv(lengthLeft)
data += block
lengthLeft -= len(block)
return str(data)
Սերվերի հիմնական սցենարը (Python 3.0).
import socket
import threading
import socket
from datatrans import sendData, receiveData
import time
port = int(input('Listen on port:'))
def log(string):
return '[%s]%s' % (str(time), string)
def handleRequest(sock):
sendData(sock, '你好')
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', port))
s.listen(5)
try:
while True:
sock, addr = s.accept()
print(log('%s entered the game' % str(addr)))
#print sock.recv(1000)
threading.Thread(target = handleRequest, args = (sock,)).start()
finally:
s.close()
Հաճախորդի համար իմ կոդը սա է՝ sendData
-ով և receiveData
-ով մի փոքր փոխված (Python 2.7):
# -*- coding: UTF-8 -*-
import socket
import struct
def sendData(sock, data):
'''
Send string through socket.
'''
sock.send(struct.pack('Q', len(data)))
sock.send(data)
def receiveData(sock):
'''
Receive object from socket.
'''
lengthLeft = struct.unpack('Q', sock.recv(struct.calcsize('Q')))[0]
data = ''
while lengthLeft > 0:
block = sock.recv(lengthLeft)
data += block
lengthLeft -= len(block)
return data.decode('utf-8') # Error comes from here
while True:
try:
ip = raw_input('Sever IP:')
port = int(raw_input('Port:'))
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
except socket.error as error:
print('Error while connecting')
print(error)
print('')
else:
break
while True:
print(receiveData(s))
Բացի այդ, ես մտածում եմ, թե ինչ պետք է անեմ օգտվողի կողմից մուտքագրված տողը հաճախորդից սերվեր ուղարկելիս, որպեսզի սերվերը չբողոքի կոդավորման սխալներից: Python 2.7-ը տարբեր համակարգերում օգտագործում է տարբեր կոդավորում, ուստի ես գաղափար չունեմ, թե ինչպես վարվել դրա հետ հիմա: Շնորհակալություն