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的问题。我还建议你阅读我的答案,并看看旁边的绿色大勾号。