如何使用插座连接?

2024-10-03 17:26:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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))

Tags: oftheinputisconnectmsgsocketwhat
1条回答
网友
1楼 · 发布于 2024-10-03 17:26:38

我不会回答关于“我如何知道要将什么IP和端口传递给这个程序”的模糊问题,原因在评论中解释了。在

但是对于关于代码的具体问题:

Also, am I using variables correctly in s.connect?

差不多,但不完全是。在

你可以得到这样的值:

recAddress = input("What is the address of the receiver of your messages?")
recPort = input("What port is the receiver using?")

假设这是python3.x,^{}返回一个字符串。但是^{}(对于IPv4连接)要求端口使用数字,而不是字符串。所以,你必须在某处转换它。在

您可以在输入时立即执行此操作:

^{pr2}$

…或者您可以在connect调用中执行此操作:

s.connect((recAddress, int(recPort)))

如果这个假设是错误的,并且您使用的是python2.x,那么^{}将尝试计算输入字符串,这意味着您将得到recPort的一个数字……但是如果您不想强制用户在IP地址的两边加上引号,您就不能正确地读取recAddress。在

一般来说,您几乎不想使用input;而是调用^{},如果您这样做,您将得到一个字符串,并且所有内容都与我在上面为python3.x中描述的完全相同。在


最后,一些旁注:

与其显式地创建IPv4套接字并在其上调用connect,不如调用^{}。这样,如果以后切换到与IPv6兼容的网络,你的程序仍然可以正常工作(只要用户给你一个IPv6地址,或者一个解析为IPv6地址的DNS地址)。在

套接字上的^{}方法已经完成了您似乎试图用mysend函数手动执行的操作。虽然有时像这样显式地循环send是有用的(例如,如果您试图调试一个错误,这意味着您可以确切地知道哪里出了问题),但一般来说,只使用send all更简单。在

另外,在这个循环中,您使用了一个常量MSGLEN,这个常量在任何地方都没有定义,这显然行不通。而且,即使你在某个地方定义了它,如果len(msg)与{不一样,你会希望发生什么?例如,如果MSGLEN4,而{}是{}(如您的示例所示),它将发送2个字节,然后不断尝试发送0个字节。或者,如果MSGLEN1,而{}是{},那么它将误导性地发送2个字节而不是1个字节。很有可能,您希望在那里使用len(msg),而不是{}。在

相关问题 更多 >