【问题标题】:client/server connection closing causes loop error客户端/服务器连接关闭导致循环错误
【发布时间】:2014-07-18 20:00:31
【问题描述】:

我进入了客户端和服务器通信的阶段,相互发送消息。

我遇到的问题是如何关闭连接而不导致错误?

如果我终止导致连接丢失的应用程序之一(服务器或客户端),然后它会导致等待输入的循环无限循环并显示空值。

我尝试关闭套接字、缓冲区甚至线程,都没有成功。

这是客户端

public void onClick(View view) {
    try {
        EditText et = (EditText) findViewById(R.id.EditText01);
        String str = et.getText().toString();
        PrintWriter out = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream())), true);
        out.println(str);
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
}

class ClientThread implements Runnable {

    @Override
    public void run() {

        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            socket = new Socket(serverAddr, SERVERPORT);
            CommunicationThread commThread = new CommunicationThread(socket);
            new Thread(commThread).start();
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
            } catch (IOException e1) {
            e1.printStackTrace();
                } 
    }
}

这是服务器端

class ServerThread implements Runnable {

    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {

            try {
                socket = serverSocket.accept();
                CommunicationThread commThread = new CommunicationThread(
                        socket);
                new Thread(commThread).start();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

都使用这些类:

class CommunicationThread implements Runnable {

    private Socket clientSocket;
    private BufferedReader input;
    public CommunicationThread(Socket clientSocket) {
        this.clientSocket = clientSocket;
        try {
            this.input = new BufferedReader(new InputStreamReader(
            this.clientSocket.getInputStream()));
            } catch (IOException e) {
            e.printStackTrace();
            }
    }

    public void run() {
            while (!Thread.currentThread().isInterrupted()) {
            try {
                String read = input.readLine();
                updateConversationHandler.post(new updateUIThread(read));

                //***HERE EXTRA BIT FOR THE SERVER


            } catch (IOException e) {
                e.printStackTrace();
            } 
        }
    }
}

class updateUIThread implements Runnable {
    private String msg;
    public updateUIThread(String str) {
        this.msg = str;
    }

    @Override
    public void run() {
        text.setText(msg);
        }
}

唯一的区别是服务器在上面提到***HERE EXTRA BIT FOR THE SERVER

        PrintWriter out = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream())), true);
        out.println("Message recieved");

所以基本上,客户端连接,服务器接受,然后客户端发送消息,服务器接收消息并显示它,然后将“收到的消息”发送给客户端,客户端显示它。

这一切都很好,但是一旦失去连接,他们就会反复显示 null,我必须强制关闭应用程序。

【问题讨论】:

  • 你想每次都保持连接或客户端调用服务器吗?
  • 是的,我想保持连接以发送和接收数据,但我只想要一个解决方案,当连接丢失时,它们不会挂在循环中。谢谢
  • 对不起,我刚想了想,我想我需要关闭连接,客户端每次需要做某事时都会连接。谢谢
  • 我给你的建议是使用:客户端:AsyncTask,它将数据发送到服务器并自行关闭连接,并允许您在需要时将代码写入 UI 线程。我需要查看两边的 Logcat 以查看您的 null 异常是什么并纠正问题
  • @Riverside 假设我可以,然后关闭什么?

标签: java android sockets client-server


【解决方案1】:

您没有检查流的结尾。如果 readLine() 返回 null,则对端已关闭连接,您必须这样做并停止读取。

很难相信您真的需要为每一行添加一个新线程来更新 UI。

【讨论】:

  • 感谢您的回答,我尝试检查是否为空,但不起作用,应用程序崩溃。我应该如何检查它?如果发现空值怎么办?另外,我不明白每行都有新线程是什么意思,有没有比拥有那么多线程更好的方法?
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2017-05-25
相关资源
最近更新 更多