2016-12-04 1 views
0

파이썬 (나중에 c에있을 수도 있음)과 TCP 소켓을 사용하여 로컬 네트워크 채팅 프로그램을 만들려고합니다.서버와 클라이언트 파이썬 소켓을 결합합니다.

내 의도는 들어오는 메시지의 현재 컴퓨터 주소에서 서버가 수신 대기하도록하고 클라이언트에이를 릴레이하는 것입니다 (아직 확실하지 않은 방법). 클라이언트는 로컬 연결에서 활성 서버로 메시지를 보낼 수있는 간단한 GUI입니다. 실제로이 설정은 노드 네트워크의 일부를 형성합니다.

서버와 클라이언트를 같은 응용 프로그램에 둘 수도 있습니다. 스레드를 사용하지 않는 것이 좋습니다. 연결을 기다리는 동안 서버가 일시 중지되므로 GUI가 응답 할 수 없습니다.

동일한 응용 프로그램에서 둘 다 가질 수 없다면 서로간에 통신하는 두 개의 응용 프로그램을 가지고 있다고 생각했지만 thread는 두 프로세스를 어느 쪽이든 사용하는 것처럼 더 나은 대안으로 보입니다. 별도의 앱을 가지고 있다면 서버에서 클라이언트로 문자열을 보내 GUI를 업데이트 할 수 있습니까?

원하는 서버에서 클라이언트로 메시지를 보낼 때 발생하는 일종의 이벤트 (클라이언트 측)를 만들 수 있습니까?

또한 서버가 활성 상태인지 (컴퓨터 주소에 연결되어 있고 메시지를 기다리고 있는지) 어떻게 확인할 수 있습니까?

내 서버/클라이언트 관계 모델이 합리적입니까? 어떤 제안?

스택 오버플로에서 비슷한 소켓 질문을 확인했지만 특별히 문제를 해결 한 항목을 찾지 못했습니다. 나는 약간을 놓칠지도 모른다. 그래서 그들이 적합하다고 판명되면 그들에게 나의주의를 돌려 보내라.

이 질문은 매우 유사합니다 : Python socket server: listening to multiple clients, 그러나 그들은 각각 '서버'& 클라이언트가없는 것 같습니다.

참고 : 저는 & 소켓 네트워킹을 처음 사용합니다.

답변

0
  1. 먼저 소켓 프로그래밍에 대해 좋은 책이나 기사 (Google이 많습니다 - 그 중 몇 가지가 있습니다)를 읽어야합니다. Stackoverflow는 충분하지 않습니다. 무작위적인 질문 - 답에서 무언가를 배우려고 노력하는 데 시간을 낭비하게됩니다.
  2. "서버"는 "수신 전용 모드"를 의미하지 않으며 "클라이언트"는 "송신 전용 모드"를 의미하지 않습니다. 클라이언트와 서버간에 전이중 연결이 있습니다. 차이점은 "서버"가 포트를 열고 "클라이언트"와 "서버"는 전이중 통신을 할 수 있습니다.
  3. 예를 들어 "클라이언트"와 "서버"가 모두 연결을 시작할 수 있습니다. 서버와 클라이언트를 동일한 응용 프로그램에서 실행하는 것 "이 있습니다. 그러나 드문 행동입니다. 서버가 예를 들어 다른 서버 (예 : google.com)에 요청해야 할 경우 서버 측에서 필요합니다. 두 가지 유형의 소켓 (액티브 및 패시브)을 처리해야합니다.
  4. " 서버가 활성화되어 있습니까? " 서버가 "켜져 있으면"연결할 수 있습니다. 그렇지 않다면 여러분의 시도는 에러를 반환 할 것입니다 (파이썬에서는 예외입니다). 그게 전부 야.
  5. 소켓을 사용하는 방법에는 블로킹 모드와 비 블로킹 모드가 있습니다. 후자의 경우 프로그램은 작업이 끝날 때까지 기다릴 필요가 없습니다. 소켓을 통해 데이터를 수신하거나 보내는 동시에 비즈니스를 수행 할 수 있습니다.
  6. 원시 소켓을 사용하지 않는 것이 좋습니다. 이성적이지 않습니다.원시 소켓은 몇 가지 고유 한 기능으로 일부 새로운 소켓 프레임 워크를 만들려고하는 경우에만 필요합니다 (하지만 이렇게하려면 소켓 개발 전문가 여야합니다). 이미 이미 존재하는 수십 개의 프레임 워크가 파이썬에서만 존재하기 때문에 (그리고 C/C++을위한 프레임 워크 중 일부는 libevent입니다.) Python 비동기 소켓 라이브러리 중 하나는 asyncio입니다. Python 표준 라이브러리의 일부입니다 (현대 Python 버전 용).

행운을 빌어 요!

+0

나는 또한 봤 거든 소켓,하지만 둘 다 연결을 위해 열려있는 및 gui 작업 (보낼 수 있도록 처리하는 방법을 잘 모르겠습니다. 하나의 서버를 가지고 있다면 컴퓨터를 실행하는 컴퓨터가 잠자기 상태가되어 일부 클라이언트가 책임을 져야하기 때문에 앱에 서버와 클라이언트 쪽을 사용할 계획입니다. 넌 블로킹 모드에 대한 참조를 정교하게 제공 할 수 있습니까? (이것은 .select()를 사용하여 무엇입니까?) – Ben

+0

정보에 감사드립니다. asyncio를 살펴볼 것입니다. – Ben

+0

".select()?"를 사용하는 것입니다. 예 : select(), poll(), epoll() 등 – KromviellBlack

관련 문제