Markloy 2020-04-17 19:00 采纳率: 0%
浏览 531

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();
        }


    }

}
  • 写回答

2条回答 默认 最新

  • VICTOR_fusheng 2020-04-17 21:53
    关注

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

            while ((line = br.readLine()) != null) {
                    jta.append(line + System.lineSeparator());
                }
    
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?