加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 数据不会写入printwriter

发布时间:2020-12-15 04:14:06 所属栏目:Java 来源:网络整理
导读:我实际上是在尝试创建一个程序: public void setUpNetwork(){ try { Socket sock = new Socket("localhost",1101); InputStreamReader read = new InputStreamReader(sock.getInputStream()); buff = new BufferedReader(read); write = new PrintWriter(so
我实际上是在尝试创建一个程序:

public void setUpNetwork(){
    try {
            Socket sock = new Socket("localhost",1101);
            InputStreamReader read = new InputStreamReader(sock.getInputStream());
            buff = new BufferedReader(read);
            write = new PrintWriter(sock.getOutputStream());
            System.out.println("Network Established");
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        }
}

这里,一旦建立了套接字连接,我就试图将用户输入的数据传递给打印流,然后在控制台中打印出数据.

我的服务器类只有这么多:

ServerSocket server = new ServerSocket(1101);
        Socket socket = server.accept();

当我运行它(运行时,我首先运行服务器,然后运行ChatSetUp类)时,控制台上没有任何内容!是因为sersock.accept()给出了一个具有不同端口的套??接字连接,而客户端无法与服务器通信?如果是这样,我需要将套接字对象从服务器传递到另一个类中的setUpNetwork(),以便我可以在其上创建输入流.我该怎么做?

编辑:

我已经修改了整个程序了!我正在使用Swing创建GUI,当用户在文本字段中输入文本并点击发送时,它会触发监听器,这就是我将文本添加到PrintWriter的位置.整个代码如下:….和setUpNetwork()也是这个类的一部分(不包括在下面)

编辑:包含在同一程序中的服务器代码并为服务器启动新线程.

public class ChatGraphs {

JTextField field;
JTextArea area;
PrintWriter write;
BufferedReader buff;
Socket sock;

public static void main(String[] args) {
    ChatGraphs grap = new ChatGraphs();
    grap.doIt();
}

private void doIt() {
    JFrame frame = new JFrame();
    frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);


    JPanel allPanel = new JPanel();
    allPanel.setLayout(new BoxLayout(allPanel,BoxLayout.Y_AXIS));

    JPanel areaPanel = new JPanel();
    areaPanel.setLayout(new FlowLayout());
    JLabel alabel = new JLabel("Chats");
    area = new JTextArea(20,50);
    area.setEditable(false);
    areaPanel.add(alabel);
    areaPanel.add(area);

    JPanel textPanel = new JPanel();
    textPanel.setLayout(new FlowLayout());
    JLabel flabel = new JLabel("Enter");
    field = new JTextField(20);
    JButton button = new JButton("Send");
    button.addActionListener(new ButtonListen());
    textPanel.add(flabel);
    textPanel.add(field);
    textPanel.add(button);

    allPanel.add(areaPanel);
    allPanel.add(textPanel);

    ConnectServer con = new ConnectServer();
    Thread t = new Thread(con);
    t.start();

    AddData add = new AddData();
    Thread t1 = new Thread(add);
    t1.start();

    //setUpServer();
    setUpClient();

    frame.setSize(700,500);
    frame.setVisible(true);
    frame.getContentPane().add(allPanel);
}

public class ButtonListen implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent arg0) {     
        write.println(field.getText());
        write.flush();
        field.setText("");
        field.setRequestFocusEnabled(true);

    }
}

private void setUpClient(){
    try {
        sock = new Socket("localhost",1101);
        InputStreamReader read = new InputStreamReader(sock.getInputStream());
        buff = new BufferedReader(read);
        System.out.println("Network Established");
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public class AddData implements Runnable{

    @Override
    public void run() {
        String line="";
        try {
            while((line=buff.readLine())!=null){
                System.out.println("Another net");
                area.append(line);
            }
            buff.close();
            write.close();
            sock.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class ConnectServer implements Runnable{

    public void run() {
        ServerSocket sersock = null;
        Socket sock = null;
        try {
                sersock = new ServerSocket(1101);
                sock = sersock.accept();
                write = new PrintWriter(sock.getOutputStream());
                sersock.close();
                sock.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }

}

我得到的例外是:

Exception in thread "Thread-2" java.lang.NullPointerException
    at org.sockets.ChatGraphs$AddData.run(ChatGraphs.java:120) // This line is : while((line=buff.readLine())!=null)
    at java.lang.Thread.run(Unknown Source)
Network Established

解决方法

客户端和服务器如何通过套接字找到对方?

>客户端需要知道服务器的网络地址(IP地址)和服务器正在侦听的端口号.
>服务器只需要知道它正在侦听哪个端口.如果它有更多具有不同IP地址的网络接口,您可以选择约束服务器监听其中一个网络接口(一个IP地址)

因此,将客户端连接到服务器的代码片段如下:

Socket socket4Client = new Socket("IP-Address,e.g. 123.45.67.89",PORT_NUMBER);

并且服务器的代码片段如下所示:

ServerSocket serverSocket = new ServerSocket(PORT_NUMBER);
Socket socket4Server = serverSocket.accept(); // Waits for a Client to connect

对于服务器端,您很可能希望为每个传入连接启动一个新线程.查看这些Tiny Applications的一些非常简单(只是不过分简化)的示例.

编辑/添加:

关于新问题行中的NullPointerException(…

你得到异常,因为buff是null.这是因为Thread ConnectServer在调用方法setUpClient()之前启动.您可以创建Thread但必须在实际启动()线程之前调用setUpClient().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读