2010-03-28 3 views
2

나는 파이썬과 네트워크 프로그래밍에 대해 많이 모른다. 현재 사용자가 보낸 문자 메시지를 수신하고 Google 검색 API에서 일부 정보를 가져와 사용자에게 문자 메시지를 통해 결과를 반환 할 수있는 간단한 응용 프로그램을 구현하려고합니다. 이 응용 프로그램은 사용자 메시지를 계속 듣고 즉시 회신합니다.파이썬에서 수신 소켓을 실행할 때 jython 사용에 관한 질문

사용자가 문자 메시지를 보내려면 어떻게해야합니까? 그것은 중국의 모바일 공급 업체로부터 fetion이라는 프로그램입니다. 인스턴트 통신 도구와 마찬가지로 클라이언트 측 페션은 SMS를 수신/전송하기 위해 모바일을 사용하는 다른 사람들과 메시지를주고받을 수 있습니다.

나는 fetion 프로그램을 시뮬레이트하는 오픈 소스 파이썬 프로그램을 사용하고 있습니다. 따라서 기본적으로이 Python 프로그램을 사용하여 SMS를 통해 휴대 전화를 사용하는 다른 사람들과 의견을 나눌 수 있습니다.

내 핵심 프로그램은 java를 기반으로하므로이 Python 프로그램을 Java 환경에 적용해야합니다. 나는 자이 썬을 사용하고 있으며, 이제는 자바 코드 라인을 통해 사용자에게 메시지를 보낼 수있다.

하지만 진짜 질문은 SMS를 통해 사용자로부터 수신하는 프로세스입니다. 파이썬 코드에서는 새로운 스레드가 생성되어 사용자의 소리를 계속 듣습니다. 파이썬에서 확인을해야하지만, 내가 자이 썬에서 유사한 프로세스를 실행할 때, 다음과 같은 예외가 발생합니다

다음과
Exception in thread Thread:Traceback (most recent call last): 
File "D:\jython2.5.1\Lib\threading.py", line 178, in _Thread__bootstrap 
    self.run() 
File "<iostream>", line 1389, in run 
File "<iostream>", line 1207, in receive 
File "<iostream>", line 1207, in receive 
File "<iostream>", line 150, in recv 
File "D:\jython2.5.1\Lib\select.py", line 223, in native_select 
    pobj.register(fd, POLLIN) 
File "D:\jython2.5.1\Lib\select.py", line 104, in register 
    raise _map_exception(jlx) 
error: (20000, 'socket must be in non-blocking mode') 

파이썬 코드의 라인 (150)이 될 때 : 때문에 I의

def recv(self,timeout=False): 
    if self.login_type == "HTTP": 
     time.sleep(10) 
     return self.get_offline_msg() 
     pass 
    else: 
     if timeout: 
      infd,outfd,errfd = select([self.__sock,],[],[],timeout)//<---line 150 here 
     else: 
      infd,outfd,errfd = select([self.__sock,],[],[]) 

     if len(infd) != 0: 
      ret = self.__tcp_recv() 

      num = len(ret) 
      d_print(('num',),locals()) 
      if num == 0: 
       return ret 
      if num == 1: 
       return ret[0] 
      for r in ret: 
       self.queue.put(r) 
       d_print(('r',),locals()) 

      if not self.queue.empty(): 
       return self.queue.get() 

     else: 
      return "TimeOut" 

을 파이썬, 특히 소켓 부분에 익숙하지 않고 자이 썬에서 새로운 것을 사용하기 때문에 나는 정말로 당신의 도움이나 조언이나 설명이 필요하다.

대단히 감사합니다!

답변

1

오류 (기본적으로) 입력 대기를 차단하도록 설정된 소켓에서 select을 호출하려고 시도했음을 나타냅니다. 비 블로킹을 가능하게하는 이식성있는 방법은 self.__sock이 생성 된 곳을 찾고 socket.setblocking(0)을 호출하는 것입니다.

선택 호출 이전에 setblockingrecv에 전화 할 수는 있지만 독자에게는 혼란을 줄 수 있습니다. 이것들은 저레벨 소켓 루틴에 대한 직접 호출이기 때문에 이것은 엄격하게 파이썬 질문이 아니며 플랫폼에 맞게 socket 시스템 호출의 작동에 관한 것입니다.

2

jython select documentaion 페이지에서 설명한 것처럼 소켓이 블로킹 또는 비 블로킹 일 수있는 cpython과 달리 비 블로킹 모드의 소켓 만 jython에 멀티플렉싱 할 수 있습니다.

http://wiki.python.org/jython/SelectModule#Onlysocketsinnon-blockingmodecanbemultiplexed

자이 썬이 변경 아무것도 할 수있는 자바의 제한 사항입니다.

이 정확한 상황에 맞는 자이 썬 선택 모듈에는 특수 함수 cpython_compatible_select가 있습니다.

당신은 위의 코드에서 선택 모듈의 가져 오기를 표시하지 않습니다,하지만 난 무엇을보고에 따라, 당신은 당신이 교체 할 경우 가져 오기를 선택에서이

같은 가져 오기

을 선택하고해야

로 선택 가져 오기를 선택 cpython_compatible_select에서이

와 그 수입은 그런 모든 것이 잘 작동합니다.

마지막으로 선택 모듈 문서 페이지의 "경고"섹션을 읽으십시오.

관련 문제