客户端/服务器连接关闭导致循环错误

时间:2014-07-18 20:00:31

标签: java android sockets client-server

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

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

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

我尝试关闭套接字,缓冲区甚至是线程,但是没有用。

这是客户端

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,我必须强制关闭应用程序。

1 个答案:

答案 0 :(得分:0)

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

很难相信你真的需要为每一行更新UI的新线程。