0

我在使用套接字库时遇到问题。

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 的值始终为空。我不知道我做错了什么,但我很确定它是基本的。

编辑:原来套接字对象为空,因为应用程序没有互联网权限触发了 IOException。

在清单中修复了它。

4

3 回答 3

0

在构造函数中捕获异常没有多大意义。它只是误导其余代码假设对象已完全构造,而实际上还没有。更改构造函数以抛出这些异常并删除所有 try/catch,并在调用站点相应地捕获异常。然后,您再也无法从此代码中获得空的 Socket 引用。

于 2012-09-12T07:15:16.397 回答
0

使用 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.     
于 2012-09-12T06:35:47.097 回答
-1

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

也请阅读这个

于 2012-09-12T06:59:44.187 回答