【问题标题】:General Python socket questions with several answers带有几个答案的通用 Python 套接字问题
【发布时间】:2013-02-09 01:52:42
【问题描述】:

我正在尝试将an example 用于服务器,但客户端只能发送一条消息,然后服务器将回复一个数字。

这里是代码。

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. 如何通过 Internet 而不是 LAN 使用套接字?

  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. 最后,哪里有一些好的教程可以让我更好地理解这一点?

很抱歉在同一个帖子中问了这么多问题,但是当我发布 thisthis 时,人们因为我在不同问题中发布类似问题而生气。

Python 版本:Python 2.7.3

【问题讨论】:

    标签: python sockets operating-system


    【解决方案1】:

    我做了一些研究(超过 几个小时)并找到了一些解决我问题的方法!

    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:互联网上有一些很棒的教程。 this 是教你套接字基础知识的一个。 Telnet 对我来说真的很困惑,所以我发现结合this 客户端可以创建一个实际上更好的自定义客户端。

    如果您有任何问题,请随时发表评论,我会尽力回答。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 2015-04-17
      相关资源
      最近更新 更多