JavaSwing实现网络聊天程序

运行截图:
在这里插入图片描述

代码
客户端:

package Socket_Thread.heimaLiaotian;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
//此时,该类被称为窗体类
//1,定义组件
//2,初始化组件
public class Client extends JFrame implements ActionListener{
    public static void main(String[] args){
        new Client();
    }
    // 说明:一个类需要页面的显示,则那个类要继承JFrame。
    // 属性
    // 文本域
    private JTextArea jta;
    // 滚动条
    private JScrollPane jsp;
    // 面板里面是文本框和按钮
    private JPanel jp;
    private JTextField jtf;
    private JButton jb ;
    //输出流
    private BufferedWriter bw = null;

    // 构造器
    public Client(){

        // 初始化上面的属性
        jta = new JTextArea();

        // 将文本域添加到滚动条中
        jsp = new JScrollPane(jta);
        jp = new JPanel();
        jtf =new JTextField(15);
        jb = new JButton("send");

        // 把按钮和文本框添加到面板中
        jp.add(jtf);
        jp.add(jb);

        // 把滚动条和面板添加到JFrame中去。因为这个类继承了窗体,所以我就是窗体,所以this就是窗体
        this.add(jsp,BorderLayout.CENTER); //这个设置在中间
        this.add(jp,BorderLayout.SOUTH); //南

        this.setTitle("client");
        this.setSize(500,500);
        this.setLocation(200, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        //这个this,去掉也可以
        jb.addActionListener(this);

        // 回车点击事件

        jtf.addKeyListener(new KeyAdapter() {
            public void keyTyped(KeyEvent e) {
                if((char)e.getKeyChar()==KeyEvent.VK_ENTER) {
                    useVoid01();
                }
            }
        });

        try{
            /*******客户端 TCP协议*********/
            // 1.创建一个客户端的套接字(尝试连接)
            Socket socket = new Socket("127.0.0.1",8888);

            // 2.获取socket通道的输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // 3 字符缓冲流(字符输出流(套接字输出数据))
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));


            //循环读取数据,并拼接到文本域中
            String line = null;
            while((line = br.readLine()) !=null){
                jta.append(line + "\n");
            }

            // 3. 获取输出流

            // 4.关闭流
            socket.close();

            /******************************/
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    //发送数据
    public void actionPerformed(ActionEvent e){
        useVoid01();
    }

    public void useVoid01(){
        // 1.获取文本框中需要发送的内容
        String text = jtf.getText();
        // 2. 拼接内容
        text = "client:" + text;

        // 3.自己显示
        jta.append(text + "\n");

        try{
            // 4.发送
            bw.write(text);
            bw.newLine(); // 换行
            bw.flush();  // 刷新
            // 5.清空
            jtf.setText("");

        }catch(IOException e1){
            e1.printStackTrace();
        }

    }
    //行为
}

服务器端:

package Socket_Thread.heimaLiaotian;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

//此时,该类被称为窗体类
//1,定义组件
//2,初始化组件
//3,使用网络编程完成数据传输(tcp、udp)
//4,发送按钮的监听点击事件
//
//在这个界面上,添加修改xml文件的内容,通过输入东西到对话框,然后进行修改

//在这个上面,添加
public class Server extends JFrame implements ActionListener{

    public static void main(String[] args){
        new Server();
    }

    // 说明:一个类需要页面的显示,则那个类要继承JFrame。
    // 属性
    // 文本域
    private JTextArea jta;
    // 滚动条
    private JScrollPane jsp;
    // 面板里面是文本框和按钮
    private JPanel jp;
    private JTextField jtf;
    private JButton jb;
    //输出流
    private BufferedWriter bw  = null;

    // 构造器
    public Server(){

        // 初始化上面的属性
        jta = new JTextArea();
        //设置文本域不可编辑
        jta.setEditable(false);
        // 将文本域添加到滚动条中
        jsp = new JScrollPane(jta);
        jp = new JPanel();
        jtf =new JTextField(15);
        jb = new JButton("send");

        // 把按钮和文本框添加到面板中
        jp.add(jtf);
        jp.add(jb);
        // 把滚动条和面板添加到JFrame中去
        this.add(jsp,BorderLayout.CENTER); //这个设置在中间
        this.add(jp,BorderLayout.SOUTH); //南

        this.setTitle("server");
        this.setSize(500,500);
        this.setLocation(200, 200);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        /***********TCP协议*************/
        jb.addActionListener(this);  // 这是按钮点击使用, 让当前对象去监听
        // 回车键的监听事件 在接口KeyListener中
        //jtf.addKeyListener(this);

        //给文本框绑定一个键盘绑定事件
        jtf.addKeyListener(new KeyAdapter() {   //键盘输入事件
            public void keyTyped(KeyEvent e) {
                //sout(e)观察其内容
                if((char)e.getKeyChar()==KeyEvent.VK_ENTER) {
                    useVoid();
                }
            }
        });

        try{
            // 1.创建一个服务端的套接字
            ServerSocket serverSocket = new ServerSocket(8888);
            //2.等待客户端的连接
            Socket socket = serverSocket.accept();
            // 3.获取socket通道的输入流(输入流的读取方式为一行一行的读取方式 ----> readLine())
            // InputStream in = socket.getInputStream();

            //字符缓冲(字符流(套接字接收数据))
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // 4.获取通道的输入流(也是一行一行的写出  BufferedWriter ->newLine())

            // 当用户点击“发送”按钮的时候才会,写出数据
            bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            //循环读取数据,并拼接到文本域中
            String line = null;
            while((line = br.readLine())!=null){
                // 将读取的数据拼接到文本域中显示
                jta.append(line + "\n");
            }
            // 5.关闭socket通道
            serverSocket.close();

        }catch(IOException e){
            e.printStackTrace();
        }
        /************************/
    }

    // 点击按钮所实现的方法,获取,发送
    public void actionPerformed(ActionEvent e){
        //按钮,用来获取文本内容,然后发送
        useVoid();
    }

    //sendDataToSocket()
    public void useVoid(){
        // 1.获取文本框中的内容
        String text = jtf.getText();

        text = "server:" + text;
        // 自己显示
        jta.append(text + "\n");

        // 2.发送
        try{
            // 4.发送,用bufferwrite去发,所以要将,局部变量变成成员变量
            bw.write(text);
            bw.newLine(); // 换行
            bw.flush();  // 刷新
            // 5.清空文本框
            jtf.setText("");
        }catch (IOException e1){
            e1.printStackTrace();
        }
    }

	/*public void KeyPressed(KeyEvent e){
		//回车键
		System.out.println("按钮数字");
	}

	public void KeyTyped(KeyEvent e){
	}

	public void KeyReleased(KeyEvent e){
	}*/
    //行为
}

参考链接:
demo1教程视频
demo1

https://www.cnblogs.com/yingjiehuang/p/11997278.html

https://blog.csdn.net/tuzongxun/article/details/51442940

这个是输入输出流的其中一种
Java DataOutputStream类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值