2015-12-29 89 views
0

在我尝试掌握Python的网络概念时,我创建了一个简单的服务器客户端程序。服务器创建一个套接字并检查连接,然后向所有连接的实体发送消息。像这样,替代socket.accept()方法

import socket,os 
ip='' 
port=242 
sock = socket.socket() 
sock.bind((ip,port)) 
sock.listen(5) 
clients=[] 
while True: 
    clients.append(sock.accept()) 
    os.system('cls') 
    print 'connected to: ' 
    for client in clients: 
     print client[1] 
    message=raw_input('> ') 
    for client in clients: 
     try: 
      client[0].send(message) 
     except: 
      clients.remove(client) 

程序但似乎停止,直到接收的连接。如果我想实现聊天的元素,这是有点困难的。我知道我可以将socket.accept()置于循环之外,但是我打算有多个客户端(因此为.append())。 我已经提供了我的客户端代码,以防有任何影响。

import socket 
port=int(raw_input('enter the socket adress: ')) 
sock=socket.socket() 
sock.connect(('localhost',port)) 
connected=True 
while connected: 
    data=sock.recv(1024) 
    if data=='#exit': 
     connected=False 
    else: 
     print data 

请在写回复时考虑到我是一名自学成才的高中新生,对Python的知识有限。 (如果从我的程序的格式不明显...:'[]

注意:我试图避免select()方法,因为它再次超出了我目前的理解范围。

+0

你说你试图避免选择(),如果你无法围绕这一点,多线程将真正挑战你。如果你想做你想要的定向多重演员,那么你必须是一个或另一个。 – msw

回答

2

对于服务器来接收和管理多个客户端连接,有两种常见的方法(可能还有其他不常用的方法,我不会介绍)。

多线程的方式

在这种方法中应用程序中有两个线程。如果你没有在线程上做太多的工作,它非常粗略地意味着你的应用程序同时运行两个程序并且它们共享数据。

一环(接收线程):

  • 等待新的连接(例如调用accept())
  • 添加新的连接列出

环两(输入线程):

  • 等待用户输入(例如调用原始输入())
  • 将输入发送到连接列表中的每个连接

在这种情况下,接受块(等待)直到新连接到达因为这就是所有线程的作用并不重要。请记住,连接列表由两个循环共享,这是要小心处理的事情。谷歌和线索谷歌搜索将为您提供丰富的信息开始。

无阻塞环方法

在这种方法中,有一个单一的线程循环遍历并在循环的每次迭代检查各种事情。例如,循环如下所示:

  • 我有任何新的连接正在等待吗?
  • 如果是这样,处理它们,如果不是,则继续(不要等待连接)
  • 我有任何用户输入?
  • 如果是这样,处理它,如果没有则继续(不等待用户输入)

的select()机制是非常相似,我刚才所描述的,但它也有一些等待。循环更类似于:

  • 等待,直到一些有趣的事情发生
  • 是一些有趣的一个新的连接?如果是这样,接受它。
  • 那是一些有趣的新用户输入吗?如果是这样,发送它。

权衡

两种方法可以概括为“在同一时间运行两个简单的循环”或“一个复杂的循环,但没有别的在同一时间运行”。

多线程方法使每个线程的代码保持独立,但必须处理如果两个循环尝试同时访问连接列表会发生什么情况。单线程方法不必担心这个问题,但结果会更复杂一些。

这两种方法都呈现出有趣的学习机会。