2012-05-07 18 views
2

サーバー側のソケットに関する問題が発生しました。私のコードはクライアント側です。 2番目のメッセージ(ハートビートでも他のメッセージでも)を送信するときはいつでも、サーバー上では失敗し、サーバー側では「メッセージ形式のエラー」がログに記録されますが、同じメッセージが初めて成功します。 これで私を助けてください。 私のクライアントコード:これは、サーバーサイドからの毎秒のメッセージにjavaソケットがサーバー側から切断されました

ログをヌル...すべての時間を受信

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を行う必要がある州にいてもいけません。ssnullです。やはり正しい例外処理と伝搬がこれを避けるでしょう。

  3. (1)の結果として、!ss.isConnected()という数多くのテストがあります。このAPIは、接続が切断されたかどうかをこのAPIが教えてくれると誤解されています。それはできません。 Socketがまだ接続されているかどうかだけを伝えます。あなたのコードでは、ss = new Socket(...)と呼んでいるので、あなたはそれを接続しています。そうでなければ、まだそのコードを実行していません。 isConnected()を呼び出すと値は加算されません。

  4. 出力ストリームの前にソケット入力ストリームを閉じています。これは間違っています。 のみ出力ストリームを閉じ、最終的にブロック内のソケット自体を閉じる必要があります。こうすることで、出力ストリームがフラッシュされます。入力ストリームを閉じると、ソケットと出力ストリームはフラッシュせずに閉じられます。それをしないでください。

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

関連する問題