2013-06-03 2 views
0

이 코드에는 몇 가지 문제가 있습니다 ... 정수 이미지가 아닌 몇 바이트를 보내주십시오. 도와 줄 수있는 사람이 있습니까? 폴더에서 찾은 모든 이미지를 보내려고합니다. 고맙습니다.소켓을 사용하여 이미지 보내기 Python

CLIENT

import socket 
import sys 
import os 

s = socket.socket() 
s.connect(("localhost",9999))  #IP address, port 
sb = 'c:\\python27\\invia' 

os.chdir(sb)      #path 

dirs =os.listdir(sb)    #list of file 
print dirs 

for file in dirs: 
    f=open(file, "rb")    #read image 
    l = f.read() 
    s.send(file)      #send the name of the file 
    st = os.stat(sb+'\\'+file).st_size 
    print str(st) 
    s.send(str(st))     #send the size of the file 
    s.send(l)      #send data of the file 
    f.close() 
s.close() 

SERVER

import socket 
import sys 
import os 

s = socket.socket() 
s.bind(("localhost",9999)) 
s.listen(4)        #number of people than can connect it 
sc, address = s.accept() 

print address 
sb = 'c:\\python27\\ricevi' 

os.chdir(sb) 
while True: 
    fln=sc.recv(5)      #read the name of the file 
    print fln 
    f = open(fln,'wb')     #create the new file 
    size = sc.recv(7)     #receive the size of the file 
    #size=size[:7] 
    print size 
    strng = sc.recv(int(size))   #receive the data of the file 
    #if strng: 
    f.write(strng)      #write the file 
    f.close() 
sc.close() 
s.close() 
+5

그래서 문제가 무엇이고 질문이 무엇입니까? – kirelagin

+0

어떻게 이미지의 실제 바이트를 보내고받을 수 있습니까? .. 다른 폴더에서 이미지를 복사하고 싶기 때문에 os.stat 또는 os.getsize 함수가 잘 작동하지 않습니다. 코드는 매우 간단하지만 정확히 작동하지 않는 이유를 모르겠다. –

+0

그래서 "파이썬 소켓이 파일 보내기"에 대한 인터넷 검색을 시도 했습니까? – kirelagin

답변

0

socket.recv에 대한 매개 변수는 데이터 패키지를 수신하기위한 최대 버퍼 크기를 지정하고, 정확히 그 바이트가 판독되는 것은 없다.

당신은 쓰기 그래서 경우 :

strng = sc.recv(int(size)) 

당신이 반드시 size 오히려 큰 특별히 경우, 모든 컨텐츠를받지 않습니다.

실제로 작동하게하려면 size 바이트를 읽을 때까지 루프에서 소켓을 읽어야합니다.

+0

죄송합니다. 어떻게해야합니까?귀하의 경우에는 –

+0

[이] (http://pastebin.com/nemRgcpy)와 같은 것을 할 수 있습니다. 또는'socket.makefile'을 사용하여 파일 같은 객체로 변환하십시오.이 메소드는 EOF 때까지 차단됩니다. 또한 보내는 방법은 파일 이름의 길이가 정확히 5이고 파일 크기가 7 자리 인 경우에만 작동합니다. – mata

0

단일 소켓을 통해 일련의 파일을 전송하려면 각 파일의 윤곽을 그리는 방법이 필요합니다. 결과적으로, 당신은 크기와 이름, 그리고 물론 이미지 데이터와 같은 각 파일의 메타 데이터를 알 수있는 소켓 상단에 작은 프로토콜을 실행해야합니다.

송신자와 수신자 모두 프로토콜에 동의해야하지만이 작업을 수행하는 것처럼 보입니다.

당신이 당신의 보낸 사람에 다음

s.send(file)      #send the name of the file 
st = os.stat(sb+'\\'+file).st_size 
s.send(str(st))     #send the size of the file 
s.send(l) 

어떻게 수신기는 파일 이름은 얼마나 알고 있나요? 또는 수신자는 파일 이름의 끝 부분과 파일 크기가 시작되는 위치를 어떻게 알 수 있습니까? 수신자가 foobar.txt8somedata과 같은 문자열을 얻고 파일 이름이 foobar.txt이라고 추측해야한다고 생각할 수 있습니다. 파일의 길이는 8 바이트이며 데이터는 somedata입니다.

각 메타 데이터의 경계를 나타 내기 위해 \n과 같은 일종의 delimeter로 데이터를 분리해야합니다.

패킷 구조는 <filename>\n<file_size>\n<file_contents>으로 생각할 수 있습니다. 송신기로부터 데이터의 예 스트림은 다음과 같이 보일 수 있습니다 :

foobar.txt\n8\nsomedata 

수신기는 다음과 같은 파일 이름과 크기로 각 필드의 값을 결정하기 위해 입력에 \n을 찾고, 입력 스트림을 디코딩한다.

또 다른 접근법은 파일 이름과 크기에 이어 파일의 데이터에 고정 길이 문자열을 할당하는 것입니다.

관련 문제