2013-04-04 76 views
2

我关于套接字的代码被分成了三个类,我一直在研究它(并学习Socket Api)几个小时,现在我已经把它理解为只有一个(我可以看到)。从服务器收到的消息将不会打印,但会抛出此错误。一个很好的套接字

在线程 “螺纹14” 的异常显示java.lang.NullPointerException main.Listen.run(Listen.java:11)​​java.lang.Thread.run(未知来源)

控制台类

package main; 

public class Console extends Handle { 

    String nextl = System.getProperty("line.separator"); 
    String info = "[INFO] "; 
    String ser = "[SERVER] "; 
    String err = "[ERROR] "; 
    String name = "[" + userName + "] "; 

    public void log() { 
     startupCon(); 
     Network network = new Network(); 
     int allgood = network.connect(); 
     if (allgood == 34) { 
      Listen listen = new Listen(); 
      new Thread(listen).start(); 
     } 
    } 

    void startupCon() { 

     System.out.println("==========="); 
     System.out.println("=+CONSOLE+="); 
     System.out.println("===========" + nextl); 
    } 

    void networkCon(String net) { 
     System.out.println(net); 
    } 

} 

网络类:

package main; 

import java.net.*; 
import java.io.*; 

public class Network extends Console { 

    int port = 7771; 
    String host = "localhost"; 
    Socket client; 

    OutputStream outToServer; 
    DataOutputStream out; 
    InputStream inFromServer; 
    DataInputStream in; 

    public int connect() { 
     int getOpen = open(); 
     System.out.println(getOpen); 
     int getStream = trans(getOpen); 
     System.out.println(getStream); 
     return getStream; 
    } 

    int open() { 
     try { 

      networkCon(info + "Attemping to connect to /" + host + ":" + port); 
      client = new Socket(host, port); 
      System.out.println(info + "Established connection with " 
        + client.getRemoteSocketAddress()); 
      return 42; 
     } catch (SocketTimeoutException s) { 
      networkCon(err + "Socket timed out!"); 
      return 9; 
     } catch (IOException e) { 
      System.out.println(err + "Could not connect to /" + host + ":" 
        + port); 
      return 9; 
     } 
    } 

    int trans(int hostup) { 
     if (hostup == 42) { 
      try { 
       outToServer = client.getOutputStream(); 
       out = new DataOutputStream(outToServer); 
       inFromServer = client.getInputStream(); 
       in = new DataInputStream(inFromServer); 
       return 34; 
      } catch (SocketTimeoutException s) { 
       networkCon(err + "Socket timed out!"); 
       return 8; 
      } catch (IOException e) { 
       System.out.println(err + "Connection lost!"); 
       return 8; 
      } 
     } 
     return 7; 
    } 

} 

听类(我的存在的祸根)

package main; 

import java.io.*; 
import java.net.*; 

public class Listen extends Network implements Runnable { 

    public void run() { 
      while (true) { 
       try { 
        networkCon(in.readUTF()); 
       } catch (SocketTimeoutException s) { 
        networkCon(err + "Socket timed out!"); 
       } catch (IOException e) { 
        System.out.println(err + "Connection lost!"); 
       } 
      } 

     } 
    } 

我猜流是没有得到“在”类中聆听设置为可变的,但我没有线索,如果是这样的问题,或者如何修理它。

+0

'in'是空的'Listen',就像你猜到了。请注意,NullPointer带有一个行号。 – keyser 2013-04-04 22:06:57

+0

啊,ty,时间来弄清楚如何正确获取值... – 2013-04-04 22:09:55

回答

4

你无处调用的方法Network类的connect() ..这就是为什么你的DataInputStream in从未初始化..它总是在你的程序null ..

我想,你应该在Listen类,其中定义构造函数你调用父类Networkconnect方法如下:

public Listen() 
{ 
    connect(); 
} 
+0

谢谢,这工作。 – 2013-04-04 22:20:16

+0

@DrZarreh:我的荣幸。 – 2013-04-04 22:21:43

+0

其实,它现在双连接运行.... – 2013-04-04 22:44:28