2013-02-09 46 views
0

我试图使用an example作为服务器,但客户端只能发送一条消息,然后服务器会回复一个数字。有几个答案的一般Python套接字问题

这是代码。

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的朋友该即时通讯服务器 - 将它的操作系统的键(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

回答

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:在互联网上有一些很棒的教程。一个教你插座的基础是this。 Telnet对我来说真的很混乱,所以我发现,与this客户端一起,可以创建一个定制的客户端,这实际上更好。

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