我尝试使用socket创建客户端 - 服务器应用程序。 我已经成功使用AVD并在我的电脑上运行服务器和客户端。 但是当我尝试让它在我的设备上使用相同的Wifi网络时,应用程序就会崩溃。
是的,我正在使用单独的线程进行连接 并且已经在清单中添加了Internet的使用。这里有一些代码......
客户端线程:
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){}
}
}
}
}
和ServerThread:
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) {}
}
}
}
我试着在这里寻找答案\谷歌等... 没什么帮助。 没有防火墙或任何东西阻止我的电脑上的传入连接。
任何想法?
感谢, Lioz
答案 0 :(得分:1)
这不会立即解决您的问题,但是您有一些错误会导致您的程序丢失真正问题的证据。
1)这简单地压制了异常,抛弃了所有发生过的证据。
catch(IOException e){}
2)这样做要好一些,但它只打印出异常消息...而不是堆栈跟踪。
catch (Exception e){
System.err.println(e.getMessage());
}
2)的另一个问题是它捕获所有异常......而不仅仅是IOExceptions。这包括未经检查的例外,例如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();