>

이것은 python-wiki의 UDP-Server-Example에 따른 제 UDP-Server입니다.

# ----- receiver.py -----
#!/usr/bin/env python
from socket import *
import sys
import select
host="192.168.88.51"
port = 1337
s = socket(AF_INET,SOCK_DGRAM)
s.bind((host,port))
addr = (host,port)
buf=128
data,addr = s.recvfrom(buf)
print "Received File:"
f = open("out.jpg",'wb')
data, addr = s.recvfrom(buf)
try:
    while(data):
        f.write(data)
        s.settimeout(1)
        data,addr = s.recvfrom(buf)
except timeout:
    f.close()
    s.close()
    print "File Downloaded"

이 코드는 정상적으로 작동하며 한 번에 하나의 파일을받을 수 있습니다. 그러나 여러 클라이언트가 있고 모든 파일이 수신되기를 원하므로 새로운 IP 연결이 이루어질 때마다 (한 특정 IP에서). 어떤 제안?

  • 답변 # 1

    먼저 비동기 서버를 원한다면 sockets 로 처음부터 글을 쓰지 않는 것이 좋습니다. . 대신, asyncio 같은 패키지를 사용  또는 Twisted .

    문제에 관해서는 TCP 중심 소켓을 사용하는 것이 더 편리하므로 SOCK_STREAM 를 사용해야합니다.  대신 UDP 형 SOCK_DGRAM 의 .

    먼저 다운로드 기능을 정의하십시오 :

    def get_file(s):
        s.settimeout(1)
        with open("out.jpg",'wb') as f:
            data, addr = s.recv(buf)
            try:
                while(data):
                    f.write(data)
                    data, addr = s.recv(buf)
            except timeout:
                print "File Downloaded"
    
    

    상수 (호스트 이름, 포트 번호 등)를 설정 한 후 다음과 같은 작업을 수행하십시오 ( from threading import Thread 수행).  먼저!) :

    s = socket(AF_INET,SOCK_DGRAM)
    s.bind((host,port))
    while True:
        print "Waiting for connection..."
        data, addr = s.recvfrom(buf)
        print "... connection from:", addr
        Thread(target=get_file, args=(s,)).start()  #starts a new thread for file download, addr acts like a filename
    
    

  • 이전 powershell - 온라인 교환 - 모든 메일 그룹 구성원에서 공유 사서함 제거
  • 다음 심포니/폼 빌더 querybuilder에서 특정 필드를 선택하십시오