2012-05-07 40 views
2

我正在面對服務器端的套接字問題。我的代碼是客戶端。無論何時我發送第二條消息(無論是心跳還是其他消息),它都將在服務器上失敗,並且服務器端記錄「消息格式錯誤」,但同一消息將在第一次成功。 請幫我解決這個問題。 我的客戶端代碼:從服務器端斷開的java socket

public class Main { 

     String Host = ""; 
     int port = 1111; 
     Socket ss; 
     BufferedReader in; 
     BufferedWriter out; 
     String recv; 

     public void connection() { 
      try { 

       ss = new Socket(Host, port); 
       ss.setSoTimeout(30000); 

       in = new BufferedReader(new InputStreamReader(ss.getInputStream())); 
       out = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream())); 

      } catch (UnknownHostException ex) { 
       Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
      } catch (IOException ex) { 
       Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

     public void sender(String regTag) { 

      if (ss == null || !ss.isConnected()) { 
       connection(); 
      } 
      try { 

       if (out != null && regTag != null) { 
        out.write(regTag + "\n"); 
        System.out.println("message::" + regTag); 
        out.flush(); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     public String Reciver() { 

      try { 

       recv = in.readLine(); 
       if (ss != null && recv != null) { 
        return recv; 
       } else { 
        disconnect(); 
        String Str = "nothing...Sorry"; 
        return Str; 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return "Exception"; 
      } 
     } 

     public void disconnect() { 
      try { 
       System.out.println("socket discoonected."); 
       ss.close(); 
       in.close(); 
       out.close(); 
       connection(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     public static void main(String[] args) { 


      Main me = new Main(); 
      me.connection(); 
      String hbhb = "`SC`0004HBHBB7BDB7BD"; 
      String login = "`SC`00581.000000CRBTSRVM 00000001DLGLGN 00000002 TXBEG LOGIN:USER=cvbs,PSWD=password DEB2CCA8"; 
      String cut = "`SC`00631.000000CRBT00PPSPHS00000002DLGCON 00000003 TXBEG CUT PPS FEE:MDN=9610023,CUTFEE=1000,REASON=1 BDB7DA88"; 
      me.sender(hbhb.trim()); 
      String str = me.Reciver(); 
      System.out.println("Response :::" + str); 
      me.sender(login.trim()); 
      String str1 = me.Reciver(); 
      System.out.println("Response hb:::" + str1); 
} 

它收到每月的第二個消息,空...所有的時間

原木服務器端

[121_SERVER] 2012-05-03 14:26:37:213 [ERROR] [ServerAccptor.java:254] -> 
errorCode = [UIP-80015] errorDesc = [Uip server has a exception when receiving data from the client,will remove the client,Server [adapter id=121],.] 
     at com.ztesoft.zsmart.bss.uip.adapter.socket.server.ServerAccptor.listenMsg(ServerAccptor.java:252) 
     at com.ztesoft.zsmart.bss.uip.adapter.socket.server.ServerAccptor.run(ServerAccptor.java:117) 
Caused by: errorCode = [UIP-9102] errorDesc = [] Describing= [read client message error,will remove client.] 
     at com.ztesoft.zsmart.bss.uip.adapters.socket.server.mml.MMLServerAdapter.readByteField(MMLServerAdapter.java:784) 
     at com.ztesoft.zsmart.bss.uip.adapters.socket.server.mml.MMLServerAdapter.reciveWholeMsg(MMLServerAdapter.java:671) 
+0

我們可以看到堆棧跟蹤嗎?一些服務器代碼?這將有所幫助。 – Th0rndike

+0

你有關於協議與服務器的細節嗎?在您發送'\ n'後,似乎不會期望任何其他內容。「 –

+0

」服務器出現故障「。請翻譯成實際的錯誤消息,最好是完整的堆棧跟蹤。 – EJP

回答

4

您的代碼體現了許多不良做法和謬誤。

  1. 你正在登錄異常,否則忽略他們,做奇怪的事情好像讓程序繼續,返回「異常」等,這是編程很差。例外情況可以幫助你,而不是用皮帶來隱藏血液。該代碼將不會自動癒合在繃帶下。例如,您應該聲明connection()拋出IOException並讓來電者處理它。

  2. 由於(1)您有很多ss != null測試。你甚至不應該處於你需要做I/O的狀態,並且ss可能是null。再次糾正異常處理和傳播將避免這種情況。

  3. 作爲(1)的進一步結果,您有很多!ss.isConnected()測試,顯然是錯誤地認爲該API會告訴您連接是否已被丟棄。它不會。它只會告訴你是否已連接Socket。在你的代碼中,當你調用ss = new Socket(...)時,你已經連接了它,否則你還沒有執行那個代碼。撥打isConnected()不會增加任何值。

  4. 您正在關閉輸出流之前的套接字輸入流。這是不正確的。您應該關閉只有輸出流,並且套接字本身在finally塊中。這樣輸出流就會被刷新。關閉輸入流會關閉套接字和輸出流而不會刷新它。不要這樣做。

0

其實正確的答案是,有在MML響應沒有\n。因此,這永遠不會奏效:

recv = in.readLine(); 

你必須閱讀響應的消息頭部分給出的消息長度,並宣讀了該長度。

UPDATE:

  1. 有你MML命令語法錯誤。看來你正在使用版本1。該協議的00,所以這是一個示例是工作(尋找差異):

    `SC`00741.00CRBT PPS  00000001DLGCON 00000004TXBEG  PPS CUT FEE:mdn=93784050910,fee=300,id=20140812165011003 F3E0ADDF 
    

您必須填寫與0多餘的空格只是在數量上,在其他地方你有一個空格,以填補他們。

+0

這並不能解釋爲什麼服務器正在拋出讀取請求的異常。 – EJP