2010-07-27 85 views
0

所以我有一個簡單的套接字服務器在Android模擬器上。當我只向它發送數據時,它工作得很好。但是,如果我想將這些數據回顯給python腳本,它根本不起作用。下面是工作代碼:蟒蛇從套接字接收

安卓

 


try { 
       serverSocket = new ServerSocket(port); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 


      while (checkingForClients) { 

       try { 
        clientSocket = serverSocket.accept(); 

        out = new PrintWriter(clientSocket.getOutputStream(), true); 
        in = new BufferedReader(new InputStreamReader(
          clientSocket.getInputStream())); 

        line = null; 
        while ((line = in.readLine()) != null) { 
         Log.d("ServerActivity", line); 

         /* THIS IS THE LINE THAT DOESN'T WORK*/ 
         //out.println(line); 
         handler.post(new Runnable() { 
          @Override 
          public void run() { 

           if(incomingData == null){ 
            Log.e("Socket Thingey", "Null Error"); 
           } 
           //out.println(line); 

           incomingData.setText("Testing"); 

           incomingData.setText(line); 


          } 
         }); 

        } 

       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

 

蟒蛇:

 


import socket 

host = 'localhost' 
port = 5000 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host,port)) 
s.send('Hello, World!') 
# data = s.recv(size) THIS LINE CAUSES PROBLEMS 
s.close() 
print 'Received:' , data 

 

因此,有2註釋行。沒有這些線,它完美的作品。但是,如果我在Python中添加s.recv(size),它就會凍結,我假設等待接收到的數據。但問題是,android代碼永遠不會獲取發送的數據。所以我不知道該怎麼做。

請記住,我是新來的python和套接字。

回答

4

要確保所有數據的實際確實被髮送,而無需關閉套接字,不要使用send方法您的插座 - 使用其sendall方法來代替!看看the docssendall ...:

不同的send(),這個方法繼續 從字符串發送數據,直到 所有數據已發送或錯誤 發生。

而那些爲send,略高於在同一個頁面,說

返回發送的字節數。 應用程序負責 檢查所有數據已發送; 如果只有部分數據是 傳輸,應用程序需要 嘗試傳送剩餘的 數據。

1

我有一些問題,你錯過了socket.shutdown()在你的代碼:

s.send('Hello, World!') 
s.shutdown(1) 
data = s.recv(size) 
s.close() 
print 'Received:' , data 

你學到新的東西...... 丹尼斯

0

Android的代碼讀取行,所以你可能需要在Python發送字符串的末尾發送一個\ n或者\ r \ n。