套接字修复错误TypeError:必须为整数

时间:2019-05-25 20:03:50

标签: python sockets

我必须  连接到外来服务器(“ localhost”,10000), 然后发送USER,然后发送Aliensignal

但是我收到一条错误消息,这意味着我的.send格式不正确。 您知道在一个.send中发送两个差异字符串的好方法是什么吗?

import socket
clientsocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
clientsocket.connect (('localhost', 10000))
clientsocket.send('USER:','aliensignal') 

Traceback (most recent call last):
File "/tmp/usercode.py", line 15, in <module>
clientsocket.send('USER:','aliensignal')
TypeError: an integer is required

3 个答案:

答案 0 :(得分:0)

[Python 3.Docs]: socket.send(bytes[, flags])的(可选) flags 参数必须为整数(通常不应使用该整数,但是如果需要更多详细信息,请检查[man7]: RECV(2))。 / p>

对于您当前的情况,您可以:

  • 呼叫发送两次(每次一次):

    clientsocket.send(b"USER:")
    clientsocket.send(b"aliensignal")
    
  • 连接字符串( bytes )并同时发送它们:

    clientsocket.send(b"USER:aliensignal")
    

答案 1 :(得分:0)

socket.send()的文档说第二个位置参数是int,而不是str。它进一步指出,有关此参数的更多信息可以在Unix手册的recv(2)中找到。至少,这里是recv(2)

的Linux手册页

答案 2 :(得分:0)

send仅采用通常不使用的字符串和选项整数标志。 TCP只是一个字节流,没有消息边界。必须定义产生完整消息的协议。您的外来服务器需要更具体一些。

您可以这样做:

clientsocket.send(b'USER:aliensignal')

,但您也可以进行以下变化。字节只是以相同的顺序输入到发送缓冲区中。

clientsocket.send(b'USE')
clientsocket.send(b'R:a')
clientsocket.send(b'liens')
clientsocket.send(b'ignal')

那么外星服务器如何知道您已发送完整消息?以下是一些可能的方法:

  • 关闭客户端连接。服务器可以继续读取字节,直到recv返回0为止,这意味着客户端关闭了连接。
  • 使用定界符。在消息末尾发送换行符\n。服务器可以读取直到找到换行符并知道它具有完整的消息。如果读取的内容超出了换行符,则可以将多余的内容保存为下一条传入消息的一部分。
  • 发送消息的长度(以字节为单位),然后发送消息。例如send(b'\x16User:aliensignal')。对于更长的消息,协议可以约定消息的长度和字节序,例如32位(4字节)大端长度。