我在使用套接字库时遇到了麻烦。
import java.io.*;
import java.net.*;
public class SocketAdapter{
Socket mySocket=null;
PrintWriter out=null;
BufferedReader in=null;
public SocketAdapter(String host,int port){
try {
InetAddress serverAddr = InetAddress.getByName(host);
mySocket = new Socket(serverAddr, port);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
out = new PrintWriter(mySocket.getOutputStream(), true);
} catch (NullPointerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void writeto(String data){
out.println(data);
}
public String readdata(){
String fromSocket=null;
try {
fromSocket = in.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// blocking
return fromSocket;
}
public void close(){
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mySocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我通过主要活动中的第二个线程访问此类。在调试器中,mySocket的值始终为null。我不知道我做错了什么,但我很确定它是基本的东西。
编辑:事实证明,套接字对象为空,因为应用程序没有互联网权限触发IOException。
在清单中修复了它。
答案 0 :(得分:0)
使用Socket变量作为静态可能会起作用。 static Socket mySocket = null;
或 使用单独的函数来获取套接字连接。
public Socket getSocketConnection(String strServerIP , int iPort)
{
try
{
Socket s = new Socket(strServerIP,iPort);
return s;
}
catch (Exception e)
{
return null;
}
}// End getSocketConnection Method.
答案 1 :(得分:0)
在构造函数中捕获异常并没有太大意义。它只是误导了代码的其余部分,假设对象已经完全构造,而它没有。将构造函数更改为 throw 这些异常并删除所有try / catches,并在调用站点相应地捕获异常。然后你再也不能从这段代码中获得一个空的Socket引用。
答案 2 :(得分:-1)