我的简单客户端每次尝试连接到我的 python 套接字服务器时都会崩溃
My simple client crash everytime it tries to connect to my python socket server
我的客户端每次尝试连接到我的 python 套接字服务器时都会崩溃。我不知道为什么,但是我的服务器接缝启动正常,然后当我启动我的客户端时,它建立了到服务器的连接,但它直接崩溃了。我几乎按照他们在 py socket docs 中所说的那样做,所以我想知道我是否错过了什么或者只是盲目地盯着一些简单的东西。任何人都可以帮助我使用 python3.4.
server.py
import socket
host = ''
port = 1010
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
conn, addr = s.accept()
print ("Connection from", addr)
while True:
databytes = conn.recv(1024)
if not databytes: break
print("Recieved: "+(databytes.decode('utf-8')))
response = input("Reply: ")
if response == "exit":
break
conn.sendall(response.encode('utf-8'))
conn.close()
client.py
import socket
host = '127.0.0.1'
port = 1010
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
print("Connected to "+(host)+" on port "+str(port))
initialMessage = input("Send: ")
s.sendall(initialMessage.encode('utf-8'))
while True:
data = s.recv(1024)
print("Recieved: "+(data.decode('utf-8')))
response = input("Reply: ")
if response == "exit":
break
s.sendall(response.encode('utf-8'))
s.close()
您的 server/client 程序中有两个问题。
您的服务器有两个 accept()
调用,在 while 循环之前和 while 循环内部,这导致服务器实际上等待两个连接,然后才能开始接收来自任何客户.
socket.sendall()
函数接收 bytes
而不是字符串,因此在发送数据之前,您需要使用一些合适的编码对字符串进行编码,将其转换为字节。此外,函数 - socket.recv()
- returns 字节。因此,您需要对字节数据进行解码(使用与发送时编码相同的编码),以便返回正确的字符串并打印出来。合适的编码可以是 - utf-8
- 但您可以使用您选择的任何编码。
编码字符串并使用 sendall()
func 的示例 -
s.sendall(response.encode('utf-8'))
接收数据时对字符串进行解码的例子-
databytes = conn.recv(1024)
if not databytes: break
data = databytes.decode('utf-8')
你不一定需要将解码后的值存储在另一个变量中,你也可以在打印数据时直接调用.decode('utf-8')
函数 - print("Recieved: "+(data.decode('utf-8')))
.
我的客户端每次尝试连接到我的 python 套接字服务器时都会崩溃。我不知道为什么,但是我的服务器接缝启动正常,然后当我启动我的客户端时,它建立了到服务器的连接,但它直接崩溃了。我几乎按照他们在 py socket docs 中所说的那样做,所以我想知道我是否错过了什么或者只是盲目地盯着一些简单的东西。任何人都可以帮助我使用 python3.4.
server.py
import socket
host = ''
port = 1010
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)
conn, addr = s.accept()
print ("Connection from", addr)
while True:
databytes = conn.recv(1024)
if not databytes: break
print("Recieved: "+(databytes.decode('utf-8')))
response = input("Reply: ")
if response == "exit":
break
conn.sendall(response.encode('utf-8'))
conn.close()
client.py
import socket
host = '127.0.0.1'
port = 1010
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
print("Connected to "+(host)+" on port "+str(port))
initialMessage = input("Send: ")
s.sendall(initialMessage.encode('utf-8'))
while True:
data = s.recv(1024)
print("Recieved: "+(data.decode('utf-8')))
response = input("Reply: ")
if response == "exit":
break
s.sendall(response.encode('utf-8'))
s.close()
您的 server/client 程序中有两个问题。
您的服务器有两个
accept()
调用,在 while 循环之前和 while 循环内部,这导致服务器实际上等待两个连接,然后才能开始接收来自任何客户.socket.sendall()
函数接收bytes
而不是字符串,因此在发送数据之前,您需要使用一些合适的编码对字符串进行编码,将其转换为字节。此外,函数 -socket.recv()
- returns 字节。因此,您需要对字节数据进行解码(使用与发送时编码相同的编码),以便返回正确的字符串并打印出来。合适的编码可以是 -utf-8
- 但您可以使用您选择的任何编码。
编码字符串并使用 sendall()
func 的示例 -
s.sendall(response.encode('utf-8'))
接收数据时对字符串进行解码的例子-
databytes = conn.recv(1024)
if not databytes: break
data = databytes.decode('utf-8')
你不一定需要将解码后的值存储在另一个变量中,你也可以在打印数据时直接调用.decode('utf-8')
函数 - print("Recieved: "+(data.decode('utf-8')))
.