2014-03-07 49 views
0

我對telnet通信有很奇怪的問題。當我向服務器發送消息時,服務器將在每次下一條消息後回覆。服務器的答覆是這樣的:Telnet後臺服務器回覆

//壞IP發射機ADRESS消息

如果我發送「第一條消息」服務器不會回覆。我發送「第二條消息」後,服務器會回覆第一條消息。每次從服務器回覆一個消息遲到。 我的通信過程如下所示:

enter image description here

如果我使用Telnet應用程序從谷歌Play商店它的作品完美,通信過程如下所示:

C: first message 
S: [// bad IP transmitters adress message 'first message'] 
C: second message 
S: [// bad IP transmitters adress message 'second message'] 
C: third message 
S: [// bad IP transmitters adress message 'third message'] 

有一些方法,如何解決呢?非常感謝!

代碼:

TCPclass

public class TCPclass { 

private boolean mRun = false; 
String messageFromServer; 
private OnMessageReceived mMessageListener = null; 
PrintWriter out; 
BufferedReader in; 

public TCPclass(OnMessageReceived listener) { 
    mMessageListener = listener; 
} 

public void stopClient() { 
    mRun = false; 
} 

public void sendMessage(String message) { 
    if (out != null && !out.checkError()) { 
     message = message + '\r' + '\n'; 
     out.print(message); 
     out.flush(); 
     Log.i("Terminal", "Message sent."); 
    } 
} 

public void start(String hostname, int port) { 
    mRun = true; 
    try { 
     InetAddress serverAddr = InetAddress.getByName(hostname); 

     Socket socket = new Socket(serverAddr, port); 

     try { 

      out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())), true); 

      // receive the message which the server sends back 
      in = new BufferedReader(new InputStreamReader(
        socket.getInputStream())); 

      while (mRun) { 
       do 
       { 

       String messageFromServer = in.readLine(); 


       if (messageFromServer != null && mMessageListener != null) { 
        mMessageListener.messageReceived(messageFromServer); //append message to Text View 
       } 
       messageFromServer = null; 


      } while (in.ready()); 
     } 

     } catch (Exception e) { 
      Log.e("Terminal", "S: Error ", e); 
     } finally { 
      socket.close(); 
     } 

    } catch (Exception e) { 
     Log.e("Terminal", "Establish connection error " + hostname + " " 
       + port); 
    } 
} 

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

MainActivity類別:

public class MainActivity extends Activity { 

private TCPclass mTcpClass; 
public String hostname = "127.0.0.1"; 
public int port = 7011; 
TextView serverMessage; 
private connectTask mTask; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final EditText IPaddress = (EditText) findViewById(R.id.eAddress); 
    final EditText ePort = (EditText) findViewById(R.id.ePort); 
    final EditText eMessage = (EditText) findViewById(R.id.eMessage); 
    serverMessage = (TextView) findViewById(R.id.tOutput); 

    Button okButton = (Button) findViewById(R.id.bOK); //Connect button 
    okButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { // connect 
      // TODO Auto-generated method stub 
      hostname = IPaddress.getText().toString(); 
      String strPort = ePort.getText().toString(); 

      try { 
       port = Integer.parseInt(strPort); 

      } catch (NumberFormatException e) { 
       Log.e(strPort, "Error port"); 
      } 
      mTask = new connectTask(); 
      mTask.execute(""); 
     } 
    }); 

    Button sendButton = (Button) findViewById(R.id.bSend); 
    sendButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      String message = eMessage.getText().toString(); 
      serverMessage.append("C: " + message + "\n"); 
      Log.i("Terminal", "Sending message " + message); 
      if (mTcpClass != null) { 
       mTcpClass.sendMessage(message); 
      } 
      eMessage.setText(""); 
     } 
    }); 
} 

public class connectTask extends AsyncTask<String, String, TCPclass> { 
    @Override 
    protected TCPclass doInBackground(String... message) { 
     Log.i("Terminal", "doInBackground."); 

     mTcpClass = new TCPclass(new TCPclass.OnMessageReceived() { 
      @Override 
      // here the messageReceived method is implemented 
      public void messageReceived(String message) { 
       // this method calls the onProgressUpdate 
       publishProgress(message); 
      } 
     }); 
     mTcpClass.start(hostname, port); 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     serverMessage.append("S: " + Arrays.toString(values) + "\n"); 
    } 
} 
+0

你沒有顯示任何你的接收代碼,我猜在那裏緩衝。 – chrylis

+0

我將代碼添加到我的問題。請看一下。謝謝。 – Matwosk

+1

更多代碼請 – Leo

回答

0

在我看來,該服務器可能發送一個空白或多餘的地方,你有沒有考慮對於。我打電話available()ready()的世界上最後的和最迷,但是也許這是它的一個案例:

do 
{ 
    String response = in.readLine(); 
    // ... 
} while (in.ready()); 

...爲了調試的目的,至少,直到你理清的迴應是每個什麼你發送的線路。請注意,在這裏使用while循環肯定是不正確的。

+0

效果仍然相同,看起來沒有空白或多餘的線條。我從wireshark捕獲服務器消息,它看起來像這樣:http://clip2net.com/s/6XO82z在數據中只有消息壞IP爲12345和0D =(CR) – Matwosk

+0

很奇怪,響應以\ r( 0xd)不是\ r \ n。你可以編輯當前的代碼到你的問題? – EJP

+0

我上傳了。希望我正確使用了你的調試代碼。 – Matwosk