2013-09-12 3 views
0

Я пишу код сервера для прослушивания информации из сокета, но когда я нажимаю букву P, я должен отправить клиенту сообщение «Сообщение». Вот то, что я сделал до сих пор:Python select for blocking

import select 
import Queue 
import socket 
import time 
import sys 
import msvcrt 
from msvcrt import getch 

n = 0 
HOST = '' 
PORT = 2323 

servsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
servsock.bind((HOST, PORT)) 
servsock.listen(5) 
servsock.setblocking(0) 

inputs = [servsock] 
outputs = [] 
message_queues = {} 

while 1: 
    (sread, swrite, serr) = select.select(inputs, outputs, []); 
    for sock in sread: 
     if sock is servsock: 
      (newsock, address) = servsock.accept() 
      newsock.setblocking(0) 
      print "New connection: ", address 
      inputs.append(newsock) 
      newsock.send("You are connected") 
      outputs.append(newsock) 

     else: 
      recv_msg = sock.recv(100) 
      if recv_msg == "": 
       (host, port) = sock.getpeername() 
       print "Client %s:%s disconnected" % (host,port) 
       sock.close() 
       inputs.remove(sock) 
       outputs.remove(sock) 
      else: 
       (host, port) = sock.getpeername() 
       print "Client %s:%s sent: %s "% (host,port,recv_msg)   

    for sock in swrite: 
     while msvcrt.kbhit(): 
      if msvcrt.getch() == "p": 
       sock.send("Message") 

Но выглядит выбор достигает swrite, входит туда, но тогда он не перебирает больше между SREAD и swrite. Если я нажму «1» в любое время, он действительно отправит в сокет «Сообщение», но он никогда не вернется к песку! Мне просто нужно читать для ввода сообщений все время, а когда я нажимаю клавишу P для отправки «сообщения», не блокируя остальную часть программы.

Не могли бы вы помочь мне? Thanks

ответ

0

Почему вы ожидаете, что он войдет в сегмент чтения? Что это значит, чтобы читать, что это не так? Другими словами, откуда вы знаете, что он не добирается туда, когда он должен? Если нет новых подключений или данных, отправляемых на это, выбор никогда не будет запускаться для чтения, потому что нет чтения.

Этот код не очень хорош, так как вы будете спамить swrite-секцию, потому что ваши сокеты (почти) всегда могут быть записаны. Вы должны выбирать только для записи, когда хотите что-то написать. Если вы проверите свой CPU, вы почти гарантируете 100% -ное использование.

В идеале вы найдете библиотеку, которая позволит вам добавлять ввод с клавиатуры в качестве объекта, который можно выбрать, чтобы вы могли искать удары с клавиатуры в своем выборе. Тем не менее, я не знаю, есть ли способ сделать это в python.

+0

На самом деле я записал программу «Клиент», которая постоянно отправляет на этот сервер информацию, поэтому, если выбор работает так, как я ожидаю и читаю снова, он должен найти эту информацию. На самом деле, я могу быть уверен, что часть sread не работает, потому что я ничего не получаю. Идея, стоящая за сверкающей частью, заключается в том, что когда я нажимаю P, программа знает, что она должна отправить обратно клиенту сообщение «Сообщение». –