java socket网络聊天室 客户端接收不到服务端的消息

图片说明
运行之后 服务端给客户端发消息 客户端接收不到服务端的消息 服务端可以接收到客户端的消息 求助!!

服务端代码:

package Chat;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

//如果一个类需要有界面的显示,那么该类就需要继承自JFrame,并被称为"窗体类"。
//1.定义JFrame窗体中的组件
//2.在构造方法中初始化窗体的组件
//3.使用网络编程完成数据的传输(TCP,UDP 协议)
//4.实现发送按钮的监听点击事件
public class ServerChatMain extends JFrame implements ActionListener{
    public static void main(String[] args) {
        //调用构造方法
        new ServerChatMain();
    }
    //属性
    //文本域
    private JTextArea jta;
    //滚动条
    private JScrollPane jsp;
    //面板
    private JPanel jp;
    //文本框
    private JTextField jtf;
    //按钮
    private JButton jb;
    //输出流
     private BufferedWriter bw = null;
    //构造方法
    public ServerChatMain(){
        //初始化组件
        jta = new JTextArea();
        //注意:需要设置文本域默认不可编辑
        jta.setEditable(false);
        //注意:需要将文本域添加到滚动条中,实现滚动效果。
        jsp = new JScrollPane(jta);
        //面板
        jp = new JPanel();
        jtf = new JTextField(10);
        jb = new JButton("发送");
        //注意:需要将文本框与按钮添加到面板中
        jp.add(jtf);
        jp.add(jb);
        //注意:需要将文本框与面板全部添加到窗体中
        this.add(jsp, BorderLayout.CENTER);
        this.add(jp,BorderLayout.SOUTH);
        //注意:需要设置标题,大小,位置,关闭,是否可见
        this.setTitle("聊天室服务端");
        this.setSize(300,300);
        this.setLocation(300,300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        //TCP服务端开始
        //给发送按钮绑定一个监听点击事件
        jb.addActionListener(this);
        try{
            //1.创建服务端套接字
            ServerSocket serverSocket= new ServerSocket(8888);
            //2.等待服务端的连接
            Socket socket = serverSocket.accept();
            //3.获取Socket通道输入流(使用BufferedReader实现每行读取)
            //InputStream in= socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //4.  获取Socket通道输出流(使用BufferedWriter实现刷新和换行)
            //当用户需要点击发送按钮的时候需要写出数据
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //循环读取数据,并拼接到文本域中
            String line = null;
            while((line=br.readLine())!=null){
                //将读取的数据拼接到文本域中显示
                jta.append(line+System.lineSeparator());
            }
            //5.关闭ServerSocket通道
            serverSocket.close();
        }catch (IOException e){
            e.printStackTrace();

        }
        //TCP服务端结束

    }
    @Override
    public void actionPerformed(ActionEvent e){
        //System.out.println("发送按钮被点击了");
        //1.获取文本框中发送的内容
        String text =jtf.getText();
        //2.拼接需要发送的内容
        text ="服务端对客户端说:"+text;
        jta.append(text+System.lineSeparator() );
        //3.发送
        try {
            bw.write(text);
            bw.newLine();
            bw.flush();
            //4.清空文本框内容
            jtf.setText("");
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

}

客户端代码:

package Chat;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;

//如果一个类需要有界面的显示,那么该类就需要继承自JFrame,并被称为"窗体类"。
//1.定义JFrame窗体中的组件
//2.在构造方法中初始化窗体的组件
public class ClientChatMain extends JFrame implements ActionListener {
    public static void main(String[] args) {
        //调用构造方法
        new ClientChatMain();
    }
    //属性
    //文本域
    private JTextArea jta;
    //滚动条
    private JScrollPane jsp;
    //面板
    private JPanel jp;
    //文本框
    private JTextField jtf;
    //按钮
    private JButton jb;
    //输出流
    private BufferedWriter bw = null;
    //构造方法
    public ClientChatMain() {
        //初始化组件
        jta = new JTextArea();
        //注意:需要设置文本域默认不可编辑
        jta.setEditable(false);
        //注意:需要将文本域添加到滚动条中,实现滚动效果。
        jsp = new JScrollPane(jta);
        //面板
        jp = new JPanel();
        jtf = new JTextField(10);
        jb = new JButton("发送");
        //注意:需要将文本框与按钮添加到面板中
        jp.add(jtf);
        jp.add(jb);
        //注意:需要将文本框与面板全部添加到窗体中
        this.add(jsp, BorderLayout.CENTER);
        this.add(jp, BorderLayout.SOUTH);
        //注意:需要设置标题,大小,位置,关闭,是否可见
        this.setTitle("聊天室客户端");
        this.setSize(300, 300);
        this.setLocation(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        //TCP客户端开始
        //给发送按钮绑定一个监听点击事件
        jb.addActionListener(this);
        try {
            //1.创建客户端套接字(尝试连接)
            Socket socket = new Socket( "192.168.1.106",8888);
            //2.获取socket通道输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //3.获取socket通道输出流
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //循环读取数据,并拼接到文本域中
            String line = null;
            while ((line = br.readLine()) != null) ;
            jta.append(line + System.lineSeparator());
            //4.关闭socket通道
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        //TCP客户端结束
    }
    @Override
    public void actionPerformed(ActionEvent e){
        //1.需要获取文本框中需要发送的数据内容
        String text =jtf.getText();
        //2.拼接内容
        text = "客户端对服务端说:"+text;
        //3.自己显示
        jta.append(text+System.lineSeparator());
        try {
            //4.发送
            bw.write(text);
            bw.newLine();
            bw.flush();
            //5.清空
            jtf.setText("");
        } catch (IOException ex) {
            ex.printStackTrace();
        }


    }

}

1个回答

client中用大括号把语句括起来,不要省略{}

        while ((line = br.readLine()) != null) {
                jta.append(line + System.lineSeparator());
            }
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问