Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java套接字已从服务器端断开_Java_Sockets - Fatal编程技术网

java套接字已从服务器端断开

java套接字已从服务器端断开,java,sockets,Java,Sockets,我在服务器端面临一个关于套接字的问题。我的代码是客户端的。每当我发送第二条消息(无论是心跳还是任何其他消息)时,它都会在服务器上失败,服务器端会记录一条“消息格式错误”,但第一次相同的消息会成功。 请帮我解决这个问题。 我的客户代码: public class Main { String Host = ""; int port = 1111; Socket ss; BufferedReader in; Bu

我在服务器端面临一个关于套接字的问题。我的代码是客户端的。每当我发送第二条消息(无论是心跳还是任何其他消息)时,它都会在服务器上失败,服务器端会记录一条“消息格式错误”,但第一次相同的消息会成功。 请帮我解决这个问题。 我的客户代码:

    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) 

您的代码包含了大量的错误实践和谬误

  • 您正在记录异常并忽略它们,还做了一些奇怪的事情,比如让程序继续,返回“异常”,等等。这是糟糕的编程。例外情况是为了帮助你,而不是用绷带来掩盖血液。代码在绷带下不会自动愈合。例如,您应该声明
    connection()
    以抛出
    IOException
    ,并让调用方处理它

  • 作为(1)的结果,您有许多
    ss!=空
    测试。您甚至不应该处于需要执行I/O的状态,
    ss
    可能是
    null
    。同样,正确的异常处理和传播可以避免这种情况

  • 作为(1)的进一步结果,您有许多
    !ss.isConnected()
    测试,显然错误地认为此API会告诉您连接是否已断开。不会的。它只会告诉您是否已连接
    插座
    。在您的代码中,当您调用
    ss=newsocket(…)
    时,您已经连接了它,否则您还没有执行该代码。调用
    isConnected()
    不会增加任何值

  • 在输出流之前关闭套接字输入流。这是不正确的。您应该只关闭输出流,以及finally块中的套接字本身。这样输出流就会被刷新。关闭输入流将关闭套接字和输出流,而不刷新它。不要那样做


  • 您的代码包含了大量的错误实践和谬误

  • 您正在记录异常并忽略它们,还做了一些奇怪的事情,比如让程序继续,返回“异常”,等等。这是糟糕的编程。例外情况是为了帮助你,而不是用绷带来掩盖血液。代码在绷带下不会自动愈合。例如,您应该声明
    connection()
    以抛出
    IOException
    ,并让调用方处理它

  • 作为(1)的结果,您有许多
    ss!=空
    测试。您甚至不应该处于需要执行I/O的状态,
    ss
    可能是
    null
    。同样,正确的异常处理和传播可以避免这种情况

  • 作为(1)的进一步结果,您有许多
    !ss.isConnected()
    测试,显然错误地认为此API会告诉您连接是否已断开。不会的。它只会告诉您是否已连接
    插座
    。在您的代码中,当您调用
    ss=newsocket(…)
    时,您已经连接了它,否则您还没有执行该代码。调用
    isConnected()
    不会增加任何值

  • 在输出流之前关闭套接字输入流。这是不正确的。您应该只关闭输出流,以及finally块中的套接字本身。这样输出流就会被刷新。关闭输入流将关闭套接字和输出流,而不刷新它。不要那样做


  • 实际上正确的答案是,
    MML
    响应中没有
    \n
    。所以这根本不起作用:

    recv = in.readLine();   
    
    您必须读取响应的消息头部分中给出的消息长度,并读取到该长度

    更新:

  • MML
    命令中存在语法错误。您似乎正在使用协议的1.00版,因此这是一个有效的示例(查找差异):


  • 您必须用
    0
    填充额外的空格,仅在数字中,其他地方必须用空格填充。

    实际上正确的答案是
    \n
    MML
    响应中没有
    \n
    。所以这根本不起作用:

    recv = in.readLine();   
    
    您必须读取响应的消息头部分中给出的消息长度,并读取到该长度

    更新:

  • MML
    命令中存在语法错误。您似乎正在使用协议的1.00版,因此这是一个有效的示例(查找差异):


  • 您必须用
    0
    数字填充多余的空格,其他地方必须用空格填充。

    我们可以看到堆栈跟踪吗?一些服务器代码?那会有帮助的。你有关于服务器协议的详细信息吗?在您发送“\n”之后,它似乎不期望有任何其他内容,因为它从服务器上失败了。请翻译成实际的错误消息,最好是完整的堆栈跟踪。@tulsi从代码中可以明显看出这是TCP,没有人问过这个问题。请回答实际询问的问题。我们能看到stacktrace吗?一些服务器代码?那会有帮助的。你有关于服务器协议的详细信息吗?在您发送“\n”之后,它似乎不期望有任何其他内容,因为它从服务器上失败了。请翻译成实际的错误消息,最好是完整的堆栈跟踪。@tulsi从代码中可以明显看出这是TCP,没有人问过这个问题。请回答实际询问的问题。这不能解释为什么服务器在读取请求时引发异常。这不能解释为什么服务器在读取请求时引发异常。