【发布时间】: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