Python3客户端/服务器问题

时间:2014-11-17 07:07:39

标签: python

早上好,我在下面的基本服务器/客户端程序遇到问题,在两个独立的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”'“格式化

(每次重新启动服务器时,我都需要更改客户端和服务器程序上的端口,我是否在使用后没有正确关闭端口?)

1 个答案:

答案 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()