我有以下ServerSocket代码接受传入的客户端:
public class Network {
private Socket socket = null;
private ServerSocket serverSocket = null;
private OutputStream outputStream = null;
private BufferedReader reader = null;
private PrintWriter writer = null;
private boolean firstConnect = true;
private String packet;
private static Thread serverThread = null;
public Network() {
serverThread = new Thread(ServerThread());
serverThread.start();
}
private Runnable ServerThread() {
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(1440);
} catch (Exception e) {
System.out.println("Error: " + e);
}
System.out.println("Listening for packets....");
try {
socket = serverSocket.accept();
} catch (Exception e) {
System.out.println("Error: " + e);
}
while (true) {
try {
socket = serverSocket.accept();
CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();
System.out.println("User connected: " + socket.getInetAddress());
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
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 (Exception e) {
System.out.println("Error: " + e);
}
}
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
String read = input.readLine();
System.out.println(read);
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
}
}
此代码在PC上完美运行。但是,当在Android设备上运行时,它永远不会接受客户端。
我已经看过以下潜在问题:
为什么代码仍然无法在我的Android设备上运行?
答案 0 :(得分:1)
您最有可能围绕创建ServerSocket
吞噬了NetworkOnMainThreadException
。然后,您将在接受连接的第二个和第三个捕获块中吞咽大量NPE。没有过度捕捉会帮助你在这里;)
在更大的层面上,当您在应用程序的主线程上执行I / O时,Android(默认情况下)并不喜欢它。查看Android Designing for Responsiveness上的指南。
最好的解决方案可能是创建自己的独立线程来处理这项工作。 AsyncTask
是一个常见而简单的Android范例,您可以在主线程中执行工作,但它实际上不非常适合这个:它的设计对于简短的后台任务,而不是像套接字监听那样长时间运行的任务。
答案 1 :(得分:1)
看起来你曾经accept
过多次。您调用accept
,成功应答第一个传入连接,然后您不执行任何操作,并在开始任何处理之前开始等待第二个连接。
这可能来自设备 - > PC由于某些时间或生命周期问题导致打开两个连接;我不确定。
答案 2 :(得分:1)
在您的客户端代码中使用192.168.171.18,它是您服务器的本地IP。使用与服务器侦听位置相同的端口。所以不要使用公共IP。