【问题标题】:A nice mess of a socket一个很好的插座
【发布时间】:2013-04-04 22:04:34
【问题描述】:

我关于套接字的代码分为三个类,我已经研究了几个小时(并学习了 Socket Api),我已经把它归结为只剩下一个错误(我可以看)。从服务器接收到的消息根本不会打印,而是抛出这个错误。

线程“Thread-14”中的异常 java.lang.NullPointerException main.Listen.run(Listen.java:11) java.lang.Thread.run(Unknown Source)

控制台类

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!");
                }
            }

        }
    }

我猜 Stream 没有在 Listen 类中设置为变量“in”,但我不知道这是否是问题所在或如何解决。

【问题讨论】:

  • inListen 中为空,就像您猜到的那样。注意 NullPointer 带有一个行号。
  • 啊,嘿,是时候弄清楚如何正确获取值了...

标签: java sockets networking


【解决方案1】:

你没有在任何地方调用Network类的方法connect()。这就是为什么你的DataInputStream in永远不会被初始化。它在你的程序中总是null

我猜你应该在Listen 类中定义一个构造函数,在该类中调用超类Networkconnect 方法,如下所示:

public Listen()
{
  connect();
}

【讨论】:

  • @DrZarreh 为什么?你怎么能这么说?你在别的地方叫过吗?你构造了多少次 Listen 对象?
猜你喜欢
  • 2013-05-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2012-09-15
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多