簡體   English   中英

Java套接字與服務器端斷開連接

[英]java socket disconnected from server side

我在服務器端遇到有關套接字的問題。 我的代碼是客戶端。 每當我發送第二條消息(無論是心跳或其他任何消息)時,它將在服務器上失敗,並且服務器端記錄“消息格式錯誤”,但同一條消息將首次成功。 這個你能幫我嗎。 我的客戶代碼:

    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);
}

它總是在每隔第二條消息上收到null

來自服務器端的日志

[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) 

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

  1. 您正在記錄異常,否則將其忽略,並進行一些奇怪的事情,例如讓程序繼續運行,返回“ Exception”等。這是糟糕的編程。 有例外可以幫助您,不要讓創可貼將它們掩蓋起來。 該代碼在創可貼下不會自愈。 例如,您只需要聲明connection()即可引發IOException並讓調用者對其進行處理。

  2. 作為(1)的結果,您有許多ss != null測試。 您甚至不應該處於需要執行I / O並且ss可以為null 同樣,正確的異常處理和傳播將避免這種情況。

  3. 作為(1)的進一步結果,您有許多!ss.isConnected()測試,顯然是錯誤地認為此API會告訴您是否斷開了連接。 不會的 它只會告訴您是否已連接Socket 在您的代碼中,當您調用ss = new Socket(...) ,您已經連接了它,否則您尚未執行該代碼。 調用isConnected()不會增加任何值。

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

實際上,正確的答案是MML響應中沒有\\n 因此,這永遠行不通:

recv = in.readLine();   

您必須讀取響應的消息頭部分中給出的消息長度,並讀取到該長度。

更新:

  1. 您的MML命令中存在語法錯誤。 似乎您正在使用協議的1.00版,因此這是一個有效的示例(查找差異):

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

您必須僅用數字0填充多余的空格,否則必須用空格填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM