早上好,我在下面的基本服务器/客户端程序遇到问题,在两个独立的IDLE(python)窗口上运行两个脚本后,客户端成功连接到服务器,并能够发送第一条消息(例如hello),在服务器端被翻译为“b'hello”,但我无法再次从服务器响应客户端,我收到错误:
s.send(conn,str(reply).encode('utf-8')) TypeError:必须可以转换为缓冲区,而不是socket
SERVER:
import socket
HOST = 'localhost'
PORT = 8019
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, address = s.accept()
print("Connected to", address)
while True:
data = conn.recv(1024)
print("Recieved :", repr(data))
reply = input("Reply :")
s.send(conn, str(reply).encode('utf-8'))
conn.close()
客户端:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',8019))
while True:
message = input("Your Message: ")
s.send(bytes(message,"ascii"))
print("Awaiting the reply...")
reply = s.recv(1024)
print("Recieved ", str(reply))
s.close()
我的问题如下,如何将字符串发送回我的客户端程序?如何读取客户端发送的字符串而不使用“b”'“格式化
(每次重新启动服务器时,我都需要更改客户端和服务器程序上的端口,我是否在使用后没有正确关闭端口?)
答案 0 :(得分:0)
首先,当套接字接受客户端socket.accept()
时,它返回两个值。
第一个是创建的新套接字,用于与连接端(客户端)通信。
在您的服务器代码中,您将客户端套接字作为参数提供,这应该引发错误。您只需要提供要发送的数据。
s.send(conn, str(reply).encode('utf-8'))
您应该使用客户端套接字发送数据。
conn.send( reply.encode('utf-8') )
使用sendall()
而不是使用发送,这需要确保所有数据都到达连接的另一端。
接收数据时,使用与用于编码的格式相同的格式进行解码(utf-8)
data = conn.recv(4069).decode('utf-8')
我已编辑了您的代码
import socket
HOST = 'localhost'
PORT = 8019
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1) # Number of connections
# Server loop
while True:
# Accept connections
client, address = s.accept()
print("Connected to", address)
# Receive data and decode using utf-8
data = client.recv( 1024 ).decode( 'utf-8' )
print("Recieved :", repr(data))
# Send data to client in utf-8
reply = input("Reply :")
client.sendall( reply.encode('utf-8') ) # Make sure data gets there with sendall()
s.close()
import socket
# Create socket and connect it to server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',8019))
# client loop
while True:
message = input("Your Message: ")
s.send( message.encode('utf-8') )
print("Awaiting the reply...")
reply = s.recv( 1024 ).decode( 'utf-8' )
print("Recieved ", str(reply))
s.close()