2013-12-21 3 views
1

소켓을 사용하여 로컬 네트워크에서 실행되는 채팅 서버에서 작업하고 있으며 내 집에있는 모든 컴퓨터에서 클라이언트 프로그램을 실행하고 있으며이 프로그램을 사용하면 모든 클라이언트가 서로 대화 할 수 있습니다.Python : 알림 시스템?

문제는 입력을 눌러 채팅 로그를 수동으로 업데이트해야한다는 것입니다.

내가 원하는 방식은 몇 초마다 새로운 메시지를 확인하고 새 메시지가 있으면 소리를내는 것입니다. 누구든지이 일을 어떻게 할 수 있는지 알고 있으며,이 프로젝트의 대부분을 수행 한 것처럼 스스로 알아 내려고 노력할 것입니다. 그러나 도움이 필요합니다.

import socket 
import sys,os 

name=raw_input("Enter name: ") 
# Create a TCP/IP socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_address = ('192.168.1.80', 10000) 
print >>sys.stderr, 'connecting to %s port %s' % server_address 
while True: 
    message=raw_input('Message: ') 
    try: 
     os.system('cls') 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     sock.connect(server_address) 
     if message is not '': 
      sock.sendall(name+": "+message) 
     else: 
      sock.sendall('EMPTY') 
     if message=='quit': 
      break 
     x=sock.recv(999) 
     print x 
    except: 
     break 
sock.close() 

감사 :

여기
import socket 
import sys 

# Create a TCP/IP socket 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_address = ('192.168.1.80', 10000) 
print >>sys.stderr, 'starting up on %s port %s' % server_address 
sock.bind(server_address) 
sock.listen(1) 
print 'Waiting for user...' 
convo='Welcome!' 
while True: 
    # Find connections 
    connection, client_address = sock.accept() 
    try: 
     data = connection.recv(999) 
     if data=='EMPTY': 
      pass 
     else: 
      print data 
      convo=convo+'\n'+data 
     connection.sendall(convo) 
    except: 
     connection.close() 

클라이언트입니다 : 여기

서버입니다!

답변

1

두 작업을 동시에 수행해야하는 경우 (클라이언트 스크립트가 의 새 메시지를 서버에서 읽을 때 클라이언트의 입력을 읽어야 할 필요가있는 경우) 스레드를 사용하거나 사용자 입력 읽기, 서버에서 메시지 읽기 용) 또는 futures (이후 python3.2).

1

여기 파이썬에서 오디오 재생을위한 질문 : 왜 당신이 당신의 서버에 매번 다시 연결하는 클라이언트에 대해서는 Play audio with Python

은? 어쨌든, 문제를 올바르게 이해한다면 사용자 입력을 차단하고 서버의 메시지를 처리하려고합니다.

스레드를 사용하지 않고도 반복적 인 신호를 사용하는 것이 좋습니다. 함수 호출 setitimer()이 있습니다.이 함수 호출은 여러분이하고있는 일을 깨고 모든 함수를 자주 호출 한 다음 자신이 있던 곳 (사용자 입력)으로 돌아갑니다. 타이머 기능에서 서버 메시지를 확인하고 수신 된 메시지를 인쇄하고 사운드를 재생 한 다음 사용자 입력으로 돌아갑니다. setitimer() 예제가 enter link description here입니다.

사용자 입력에 약간의 추한 것일 수 있으므로 현재 입력중인 내용을 다시 인쇄해야하지만 보낼 수는 없습니다 (raw_input() 이외의 것을 사용).

약간 더 복잡한 옵션으로 소켓 입력 및 사용자 입력을 수신하는 동안 차단 될 수있는 select() 함수 호출이 도움이 될 수 있습니다. 그런 다음 어느 것을 구별하고 하나의 루프에 모두 유지하십시오.

while True: 
    # select on server socket and user input (blocks for either one) 

    # if here, either a message has been received or the user typed something 

    # if a message from server 
     ... 
     playSound() 
    # else 
     # send to server