我尝试使用套接字创建客户端-服务器应用程序。 我已经成功地使用 AVD 做到了这一点,并在我的电脑上运行服务器和客户端。 但是当我尝试让它在我的设备上的同一个 Wifi 网络中工作时,应用程序崩溃了。
是的,我使用单独的线程进行连接 并已将互联网的使用添加到 list 中。
这是一些代码...
客户端线程:
package com.mainlauncher;
import java.io.*;
import java.net.*;
public class ConnectionThread extends Thread {
private static final int SERVERPORT = 7777;
private static final String SERVERADDRESS = "My-PC";
private Socket socket;
private DataInputStream in;
private DataOutputStream out;
@Override
public void run() {
super.run();
open();
close();
}
void open(){
try{
socket = new Socket(SERVERADDRESS,SERVERPORT);
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}
catch(IOException e){}
}
void close(){
try {
if(in!=null)
in.close();
if(out!=null)
out.close();
if(socket!=null)
socket.close();
}
catch (IOException e) {}
socket=null;
}
}
服务器端主要:
import java.io.IOException;
import java.net.*;
public class Main {
public static void main(String[] args) {
int port = 7777;
new Main().handleClients(port);
}
private void handleClients(int port) {
ServerSocket serverSocket = null;
try{
serverSocket = new ServerSocket(port);
System.out.println("Server is ready...");
for(int i=1; ; i++){
Socket socket = serverSocket.accept();
ServerThread thread = new ServerThread(i,socket);
System.out.println(i + " Connected");
thread.run();
}
}
catch (Exception e){
System.err.println(e.getMessage());
}
finally{
if(serverSocket != null){
try{ serverSocket.close(); }
catch(IOException x){}
}
}
}
}
和服务器线程:
import java.io.*;
import java.net.*;
public class ServerThread extends Thread {
private int serverIndex;
private Socket socket;
private DataOutputStream out;
private DataInputStream in;
public ServerThread (int serverIndex, Socket socket){
this.serverIndex = serverIndex;
this.socket = socket;
}
@Override
public void run() {
super.run();
try {
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
System.out.println(serverIndex + " Disconnected");
}
finally{
try {
in.close();
out.close();
socket.close();
} catch (IOException e) {}
}
}
}
我尝试在这里寻找答案\谷歌等... 没有任何帮助。 我的电脑上没有防火墙或任何东西来阻止传入连接。
有人有什么想法吗?
谢谢, 利奥兹
最佳答案
这不会立即解决您的问题,但您有一些错误导致您的程序丢弃真正问题的证据。
1) 这只是简单地压制了异常,丢弃了它曾经发生过的所有证据。
catch(IOException e){}
2)这好一点,但它只打印出异常消息......而不是堆栈跟踪。
catch (Exception e){
System.err.println(e.getMessage());
}
2) 的另一个问题是它捕获所有异常...而不仅仅是 IOException。其中包括未经检查的异常,例如 NullPointerException
、SecurityException
等。
异常应该这样诊断:
catch (IOException e){
e.printStackTrace();
}
或已记录。
<小时/>最后,您处理请求的方式是错误的:
Socket socket = serverSocket.accept();
ServerThread thread = new ServerThread(i,socket);
System.out.println(i + " Connected");
thread.run();
错误出现在最后一个语句中。它实际上所做的只是简单地在当前线程中调用 thread
对象的 run()
方法...。要在不同的线程中运行 run()
方法,您需要调用 start
方法。像这样:
Socket socket = serverSocket.accept();
ServerThread thread = new ServerThread(i,socket);
System.out.println(i + " Connected");
thread.start();
关于java - android 打开套接字在设备上崩溃,适用于 AVD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13100700/