我是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))
答案 0 :(得分:0)
由于评论中解释的原因,我不会回答关于“如何知道要传递给该程序的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完全相同。
最后,一些附注:
通常最好调用create_connection
,而不是显式创建IPv4套接字并在其上调用connect
。这样,如果您以后切换到兼容IPv6的网络,您的程序仍然可以正常工作(只要用户提供IPv6地址,或解析为一个的DNS地址)。
套接字上的sendall
方法已经执行了您尝试使用mysend
函数手动执行的操作。虽然有时候明确地循环send
会很有用(例如,如果你试图调试错误,这意味着你可以确切地说出错误的地方),一般来说,只使用它更简单send all
。
此外,在该循环中,您使用的是常量MSGLEN
,您没有在任何地方定义,这显然不会起作用。而且,即使你 在某处定义了它,如果len(msg)
与MSGLEN
不同,你会想要发生什么?例如,如果MSGLEN
为4
,而msg
为'2'
(如您的示例所示),则会发送2个字节,然后继续尝试发送0个字节再次。或者,如果MSGLEN
为1
但msg
为'42'
,则会误导性地发送2个字节而不是1个。最有可能的是,您想使用len(msg)
那里,不是MSGLEN
。