我使用以下代码将我的客户端连接到服务器。问题是这不会终止,我无法在此之后开始新的活动。
我认为问题是我不关闭套接字或线程没有终止。
我在onCreate()
cThread = new Thread(new ClientThread());
cThread.start();
这是我的Runnable
public class ClientThread implements Runnable {
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
Log.d("ClientActivity", "C: Connecting...");
socket = new Socket(serverAddr, 8080);
connected = true;
while (connected) {
try {
Log.d("ClientActivity", "C: Sending command.");
PrintWriter out = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(socket
.getOutputStream())), true);
// where you issue the commands
out.println(serverIpAddress);
Log.d("ClientActivity", "C: Sent.");
} catch (Exception e) {
Log.e("ClientActivity", "S: Error while sending", e);
}
connected = false;
}
//socket.close();
Log.d("ClientActivity", "C: Closed.");
} catch (Exception e) {
Log.e("ClientActivity", "C: Error while connecting", e);
connected = false;
}
}
}
答案 0 :(得分:1)
你的程序很无用。假设套接字已建立,while
循环仅执行一次,因为在第一次迭代结束时,您将connected
设置为false
,从而禁用任何进一步的循环。你不要刷新你的缓冲输出以确保它被写入,而你甚至不能从套接字读取,所以我想知道你的自定义协议是什么样的..此时,您的所有程序都只是将一个字符串写入服务器,然后退出。我们甚至无法说明您无法开始新活动的原因,因为在提供的代码中没有什么可以阻止您这样做。
基本上有两种TCP协议
如果这是另一个聊天程序,我建议不要设计自己的TCP协议,并从像WebSockets这样的标准技术开始。有Java clients可用,您可以在浏览器中使用一些Javascript测试您的服务器,并且在服务器端有更多选择(Socket.IO - 对于JS解决方案,{{3 },...)。
获得一些经验并熟悉工作后,您可以尝试设计自己的自定义TCP协议。到那时,您至少已经学会了套接字,线程和Android编程的基础知识。
顺便说一句,您可能需要查看Jetty, Glassfish以了解不需要用户互动的后台任务。