我是python和网络领域的新手。我应该输入什么地址和端口s.connect
?另外,我是否在中正确使用了变量s.connect
?
import socket
recAddress = input("What is the address of the receiver of your messages?")
recPort = input("What port is the receiver using?")
def mysend(sock, msg):
totalsent = 0
while totalsent < MSGLEN:
sent = sock.send(msg[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = totalsent + sent
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((recAddress, recPort))
i = 2
mysend(s, str(i))
由于评论中解释的原因,我不会回答关于“我如何知道要传递给该程序的IP和端口”这个模糊的问题。
但是对于有关您的代码的特定问题:
另外,我是否在s.connect中正确使用了变量?
差不多,但是不完全是。
您得到的值是这样的:
recAddress = input("What is the address of the receiver of your messages?")
recPort = input("What port is the receiver using?")
假设这是Python 3.x,input
返回一个字符串。但是connect
(对于IPv4连接)要求端口号而不是字符串。因此,您必须将其转换到某个地方。
您可以在输入时立即执行以下操作:
recPort = int(input("What port is the receiver using?"))
…或者您可以在connect
通话中做到:
s.connect((recAddress, int(recPort)))
如果该假设是错误的,并且您使用的是Python 2.x,input
则将尝试评估输入字符串,这意味着您将获得…的数字,recPort
但是您就读错了recAddress
,除非您想强制使用用户在IP地址周围加上引号。
通常,您几乎永远不会使用input
;raw_input
而是调用它,并且如果执行该操作,则会得到一个字符串,并且所有内容都与我上面针对Python 3.x所述的内容完全相同。
最后,一些注意事项:
与其显式创建一个IPv4套接字并对其进行调用connect
,通常不如调用create_connection
。这样,如果以后再切换到兼容IPv6的网络,则程序仍可以正常运行(只要用户为您提供一个IPv6地址或一个解析为一个的DNS地址)。
sendall
套接字上的方法已经完成了您似乎正在尝试使用mysend
功能手动进行的操作。尽管有时send
像这样进行显式遍历有时会很有用(例如,如果您要调试错误,则意味着您可以准确指出问题出在哪里),通常,使用起来更简单send all
。
同样,在该循环中,您使用的是常量MSGLEN
,您没有在任何地方定义它,这显然行不通。而且,即使你没有地方定义它,你会想要什么发生,如果len(msg)
是不一样的MSGLEN
?例如,如果MSGLEN
is4
和msg
is '2'
(如您的示例),它将发送2个字节,然后继续尝试一次又一次发送0个字节。或者,如果MSGLEN
是1
不过msg
是'42'
,它会误导发送2个字节,而不是1。最有可能的,你想用len(msg)
在那里,没有MSGLEN
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句