我必须 连接到外来服务器(“ 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
答案 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)
答案 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字节)大端长度。