Android 套接字对象值为空
我在使用套接字库时遇到问题Android 套接字对象值为空,android,sockets,Android,Sockets,我在使用套接字库时遇到问题 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
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。我不知道我做错了什么,但我很确定这是基本的
编辑:原来套接字对象为空,因为应用程序没有internet权限触发IOException
在舱单上修正了它 使用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.
如果您正在处理多个线程,则需要通过承包商进行同步。 您可以自己实现它,也可以将
SocketAdapter
类实例定义为
另外,请阅读在构造函数中捕获异常没有多大意义。它只是误导了代码的其余部分,使其假设对象已经完全构造好了,而实际上它还没有。更改构造函数以抛出这些异常并删除所有try/catch,并相应地在调用站点捕获异常。这样,您就再也无法从此代码中获取空套接字引用。完全不正确。构造函数不需要同步,实际上不能声明为
synchronized
。这根本没有道理。每个线程将构造自己的实例,而不是同一个实例。将SocketAdapter
变量声明为volatile也无法解决此问题-1.@EJP没人说你错了。将构造函数声明为已同步的方法是使用volatile。你应该阅读我链接到的帖子。@Babibyu(1)没有同步构造函数,也不需要whatsover。(2) 将变量声明为volatile对存储在其中的对象的构造函数没有影响。(3) 在这篇文章中没有任何迹象表明任何地方都需要volatile
。(4) 您的答案仍然不正确。@EJP我不同意您的观点,我添加了另一个链接,对我的观点进行了更好的解释。请看一看,如果你仍然坚持构造函数需要同步,我已经解释了为什么这种想法是错误的。您关于双重检查锁定的新链接与此问题完全无关,因为OP没有尝试此链接。您也完全没有解释您的答案如何解释OP的问题。我还建议你阅读我的答案,并看看旁边的绿色大勾号。