2013-03-24 130 views
0

我一直在網上搜索一段時間尋找答案。使用python客戶端將數據發送到java服務器

用於發送文件的Python代碼:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
with open(path, mode='rb') as f: 
    s.sendall(f.read()) 

用於接收所述數據的java代碼:

private BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()); 
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path))) { 
     while (true) { 
      int size = bis.read(by); 
      if (size > 0) { 
       bos.write(by, 0, size); 
       bos.flush(); 
       total += size; 
       System.out.println(size + "(" + total + ")"); 
       if (total == length) { 
        break; 
       } 
      } 
     } 
    }..... 

我看到數據正被髮送,並且我知道該數據是在在java結束的流。然而,bis.read(by)調用會掛起,並拒絕讀取數據,直到連接數據死亡。

我懷疑它與java中的「flush」有關,但我找不到任何方式使用python做「flush」。

任何線索爲什麼會發生這種情況?

回答

0

我想出來了,出於某種原因出現了一個競爭條件,在python代碼中放入一個睡眠(0,2)使得java服務器能夠響應。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sleep(0.2) 
with open(path, mode='rb') as f: 
    s.sendall(f.read()) 
相關問題