【问题标题】:My simple client crash everytime it tries to connect to my python socket server每次尝试连接到我的 python 套接字服务器时,我的简单客户端都会崩溃
【发布时间】:2015-06-21 14:19:04
【问题描述】:

我的客户端每次尝试连接到我的 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()

【问题讨论】:

  • 当客户端崩溃时你得到什么输出?
  • 服务器说它从 获得了一个连接,客户端在 python shell 中的命令提示符中什么也没说,它说 Traceback(最近一次调用最后一次):文件“C :\Python34\client.py",第 9 行,在 initialMessage = raw_input("Send: ") NameError: name 'raw_input' is not defined
  • 请看我的回答。

标签: python sockets python-3.x serversocket


【解决方案1】:

您的服务器/客户端程序存在两个问题。

  1. 您的服务器在 while 循环之前和 while 循环内部有两个 accept() 调用,这会导致服务器在开始接收来自任何客户端的任何消息之前实际上等待两个连接。

  2. socket.sendall() 函数接受bytes 而不是字符串,因此在发送数据之前,您需要使用一些合适的编码对字符串进行编码,以将其转换为字节。此外,函数 -socket.recv() - 返回字节。因此,您需要对字节数据进行解码(使用发送时用于编码的相同编码),以便您可以取回正确的字符串并可以打印。合适的编码可以是 - 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')))

【讨论】:

  • 是的,我知道我有 2 个 accept() 奇怪地没有循环中的那个,当我用客户端连接到它时服务器崩溃。
  • 我描述了两个问题,请检查一下
  • 好的,我更改了代码并在我原来的问题中更新了它,现在事情开始起作用了,但是我得到了一个新的错误服务器端 print("Recieved:"+(data.decode('utf-8' ))) AttributeError: 'str' 对象没有属性 'decode'
  • 您不需要双重解码,只需其中一个就足够了 - data = databytes.decode('utf-8') print("Recieved: "+(data.decode('utf-8'))) 仅在第一行或第二行解码
  • 我不得不做很多修改,我发现我的代码中有很多错误,我不得不纠正但现在它可以工作了,感谢您的帮助。 Ps 我已经更新了原始问题中的代码。
猜你喜欢
  • 2021-12-28
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多