套接字对象值为null

时间:2012-09-12 06:10:28

标签: 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 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。

在清单中修复了它。

3 个答案:

答案 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)

如果您正在使用多个线程,则需要在承包商上进行同步。 您可以自己实现它,也可以将SocketAdapter类实例定义为volotile

另请阅读this