Python socket 一些常见问题及多种解答

0 投票
1 回答
831 浏览
提问于 2025-04-17 15:19

我正在尝试使用一个示例来搭建服务器,但客户端只能发送一条消息,然后服务器会回复一个数字。

以下是代码。

import socket
mySocket = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
mySocket.bind ( ( '', 2000 ) )
mySocket.listen ( 1 )
while True:
   channel, details = mySocket.accept()
   print 'We have opened a connection with', details
   print channel.recv ( 100 )
   channel.send ( 'Green-eyed monster.' )
   channel.close()

问题:

  1. 为什么每次客户端给服务器发送消息时,服务器都会回复一个数字呢?

  2. 我怎样才能在互联网上使用套接字,而不是在局域网内?

  3. 有没有办法让我通过套接字让服务器在客户端之间传输数据,像即时通讯IM程序那样?

  4. 我可能会在我的Mac上为朋友们搭建这个IM服务器,这样不同操作系统(Mac和PC)之间能互通吗?

  5. 有没有什么好的库可以用来实现这个?(我听说HTTP很好)

  6. 这些代码行让我感到非常困惑。它们是怎么工作的?

    print channel.recv ( 100 )
    channel.send ( 'Green-eyed monster.' )
    
  7. 另外,当我关闭服务器(点击红色X)后,再次使用这个端口时,它会显示这个信息:

    Traceback (most recent call last):
    File "C:\Users\****\Desktop\Python\Sockets\First Server\server.py",
    line 3, in <module>
    mySocket.bind ( ( '', 2003 ) )
    File "C:\Python27\lib\socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
    error: [Errno 10048] Only one usage of each socket address
    (protocol/network address/port) is normally permitted
    
  8. 最后,有哪些好的教程可以让我更好地理解这些内容?

抱歉在同一个帖子里问这么多问题,但当我发布这个这个时,有人因为我在不同的问题中发布类似的问题而生气。

Python版本:Python 2.7.3

1 个回答

0

我花了几个小时做了一些研究,找到了我问题的解决方案!

3: 是的,客户端之间可以互相通信,他们只需要通过服务器来实现! 你需要在服务器端初始化一个无限循环,这样它就能接收数据并发送数据。这就是我解决问题的方法:

    while True:
        #Receiving from client
        data = conn.recv(1024)
        if not data:
            break
        conn.sendall(data)
        print data
        #To come out of the loop
    conn.close()

这个程序是一个叫做clientthread的定义的一部分,它负责初始化与客户端的所有连接。这个“实际”的循环会继续执行线程的其余部分:

     while True:
        #Wait to accept a connection - blocking call
        conn, addr = s.accept()
        #display client information (IP address)
        print 'Connected with ' + addr[0] + ':' + str(addr[1])

        #Start new thread takees 1st argument as a function name to be run, second
        #is the tuple of arguments to the function

        start_new_thread(clientthread ,(conn,))

4: 是的,它可以在不同的操作系统之间工作。套接字是与平台无关的。

6: 那行代码其实很简单。print channel.recv ( 100 ) 这行代码是告诉服务器打印用户输入,最多100个字符。下一行 channel.send ( 'Green-eyed monster.' ) 则是告诉服务器发送一条消息,内容是 Green-eyed monster 给客户端。

7: 这个错误发生是因为每个端口不能同时打开多个套接字。我建议在代码的最后使用 s.close()sys.exit() 来关闭端口。或者你也可以选择另一个端口!

8: 网上有很多很棒的教程。其中一个教你套接字基础的教程是 这个。Telnet对我来说真的很困惑,所以我发现结合 这个 客户端可以创建一个定制的客户端,实际上效果要好得多。

如果你有任何问题,欢迎留言,我会尽量回答。

撰写回答