2016-04-05 19 views
1

Aynı sorunla ilgili birçok gönderi okudum, BufferedReader.readLine() satırlarını okuduğumuzdan, sunucudan "\n" göndermek zorundayız, böylece android istemciyi yeni bir satır olarak aldık. Ama benim problemim, masaüstü kodumla iletişim kurduğundan ve zaten kodlanmış olduğundan sunucu kodumu değiştiremem. İletiyi sunucudan "\n" eklemeden okumak için herhangi bir yolu var mı?Android: Sunucudan ileti almayan soket istemcisi

public class TCPClient { 

private String serverMessage; 


public static String SERVERIP = "192.168.0.1"; // controllers IP address 
public static final int SERVERPORT = 10001; 
private OnMessageReceived mMessageListener = null; 
private boolean mRun = false; 
private PrintWriter out = null; 
private BufferedReader in = null; 


public TCPClient(final OnMessageReceived listener) 
{ 
    mMessageListener = listener; 
} 

/** 
    * Sends the message entered by client to the server 
    * @param message text entered by client 
    **/ 
public void sendMessage(String message) 
{ 
    if (out != null && !out.checkError()) 
    { 
     System.out.println("message: "+ message); 
     out.println(message); 
     out.flush(); 
    } 
} 

public void stopClient() 
{ 
    mRun = false; 
} 

public void run() { 

    mRun = true; 

    try { 
     if(!MainActivity.STATIC_IP.equals("")) 
     { 
      SERVERIP = MainActivity.STATIC_IP; 
     } 

     InetAddress serverAddr = InetAddress.getByName(SERVERIP); 
     Log.e("TCP SI Client", "SI: Connecting..."); 

     Socket socket = new Socket(serverAddr, SERVERPORT); 


     try { 

      out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 
      Log.e("TCP SI Client", "SI: Sent."); 
      Log.e("TCP SI Client", "SI: Done."); 
      Log.e("Out Message",out.toString()); 

      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 


      while (mRun) 
      { 
       serverMessage = in.readLine(); 

       if (serverMessage != null && mMessageListener != null) { 

        mMessageListener.messageReceived(serverMessage); 
        Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'"); 
       } 
       serverMessage = null; 
      } 
     } 
     catch (Exception e) 
     { 

      Log.e("TCP SI Error", "SI: Error", e); 
      e.printStackTrace(); 
     } 
     finally 
     { 
      socket.close(); 
     } 

    } catch (Exception e) { 
     Log.e("TCP SI Error", "SI: Error", e); 
    } 

} 

    public interface OnMessageReceived { 
     public void messageReceived(String message); 
    } 
} 

Android client class

(Python) mesajı alıyorum nasıl diğer istemcisi.

data = self.sock.recv(1024) 

Ne sunucu gönderme komutları sonunda herhangi bir satır ara vermeden saniyede @alarm:On#, @alarm:Off# 4 komutlardır.

+0

Diğer istemci nasıl yapıyor? Protokol önceden tanımlanmış olmalıdır. Sadece onu uygulayın. Buradaki hiç kimse kendi protokolünüzü anlatamaz. Kod olmayan metin için kod formatlama kullanmayın. – EJP

+0

Diğer istemci python'dadır ve self.sock.recv (1024) –

+0

'u kullanarak verileri alacaktır. Şüphesiz ki, bunun için şüphe duyuyorum, bu durumda neden aynı şeyi yapamazsınız? – EJP

cevap

2

issue'u ayırt etmeme yardım edin. İşte çalışma code.

try { 
    out = new PrintWriter(socket.getOutputStream()); 
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
    int charsRead = 0; 
    char[] buffer = new char[BUFFER_SIZE]; 
    while (mRun) 
    { 
     charsRead = in.read(buffer); 
     serverMessage = new String(buffer).substring(0, charsRead); 
     if (serverMessage != null && mMessageListener != null) { 
      Log.i("Message from Server", serverMessage.toString()); 
     } 
    } 
}catch (Exception e){ 
    e.printStackTrace(); 
} 
+1

thx. Sorun yaşadığım aynı durumu çözmeme yardımcı oldu. – Tirolel

-2

Sockets numaralı telefondan Java Eğitimi'ni kullanarak bunları nasıl kullanacağınızı daha iyi anlamak için çalışmalısınız.

Sorunuz, Sunucu iletisinin ne zaman sona erdiğini bilmenin bir yolunu önermediğinden, arabelleğe alınmış bir akış kullanır ve okunabilir karakterleri sayarım, sonra bu karakterleri bir dizide okuyup bir String'e dönüştürürüm.

+0

'Okunabilir karakterleri sayın' tanımlayın. – EJP

+0

, alt sınıfa bağlı olarak [available()] (https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available()) kullanın. Çözümü buraya eklemek için –

İlgili konular