栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

chat聊天程序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

chat聊天程序

服务端:

package cs;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Properties;


public class Server extends Jframe implements ActionListener, KeyListener {
    //文本域
    private Jtextarea jta;
    //滚动条
    private JScrollPane jsp;
    //面板
    private JPanel jp;
    //文本框
    private JTextField jtf;
    //按钮
    private JButton jb;
    //输出流
    private BufferedWriter bw = null;
    //服务端的端口号
    private static int serverPort;

    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileReader("chat.properties"));
            //赋值
            serverPort = Integer.parseInt(properties.getProperty("serverPort"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Server() {
       //初始化组件
        jta = new Jtextarea();
        //文本域默认不可编辑
        jta.setEnabled(false);
        //将文本域添加到滚动条中实现滚动
        jsp = new JScrollPane(jta);
        jp = new JPanel();
        jtf = new JTextField(20);
        jb = new JButton("发送");
        //将文本框和按钮添加到面板中
        jp.add(jtf);
        jp.add(jb);
        //将滚动条和面板添加到窗体中
        this.add(jsp, BorderLayout.CENTER);//放中间位置
        this.add(jp,BorderLayout.SOUTH);//放于底部
        //设置标题,大小,位置,关闭,可见
        this.setTitle("服务端");
        this.setSize(400,400);
        this.setLocation(300,300);
        this.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);//窗体关闭则退出
        this.setVisible(true);

        
        //给发送按钮绑定监听事件,需要继承ActionListener接口
        jb.addActionListener(this);
        //给文本框绑定一个回车键事件,KeyListener接口
        jtf.addKeyListener(this);
        try {
            //1.创建Socket
            ServerSocket serverSocket = new ServerSocket(serverPort);
            //2.等待客户端连接
            Socket socket = serverSocket.accept();
            //3.获取输入流,读数据
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //4.获取输出流,写数据
            OutputStream os = socket.getOutputStream();
            bw = new BufferedWriter(new OutputStreamWriter(os));
            //循环读取数据
            String line = null;
            while ((line = br.readLine())!=null){
                //将读取到的数据置于文本域中
                jta.append(line+System.lineSeparator());//内容后面接上换行
            }

            //5.关闭Socket通道
            serverSocket.close();

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

        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        sendData();
    }


    @Override
    public void keyPressed(KeyEvent e) {
        //回车键
        if (e.getKeyCode()==KeyEvent.VK_ENTER){
            //发送数据到socket通道中
            sendData();

        }
    }
    @Override
    public void keyTyped(KeyEvent e) {
        
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
    public void sendData(){
        //1.获取文本框中发送的内容
        String text = jtf.getText();
        //2.拼接发送的数据内容
        text = "服务端: "+text;
        //3.在服务端文本域中显示
        jta.append(text+System.lineSeparator());
        //4.发送数据
        try {
            bw.write(text);
            bw.newline();//换行
            bw.flush();//刷新
            //5.清空文本框内容
            jtf.setText("");
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

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

客户端:

package cs;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
import java.net.Socket;
import java.util.Properties;


public class Client extends Jframe implements ActionListener, KeyListener {
    //文本域
    private Jtextarea jta;
    //滚动条
    private JScrollPane jsp;
    //面板
    private JPanel jp;
    //文本框
    private JTextField jtf;
    //按钮
    private JButton jb;
    //输出流
    private BufferedWriter bw = null;
    //客户端的ip , 端口号
    private static String clientIP;
    private static int clientPort;
    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileReader("chat.properties"));
            clientIP = properties.getProperty("clientIP");
            clientPort = Integer.parseInt(properties.getProperty("clientPort"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Client() {
        //初始化组件
        jta = new Jtextarea();
        //文本域默认不可编辑
        jta.setEnabled(false);
        //将文本域添加到滚动条中实现滚动
        jsp = new JScrollPane(jta);
        jp = new JPanel();
        jtf = new JTextField(20);
        jb = new JButton("发送");
        //将文本框和按钮添加到面板中
        jp.add(jtf);
        jp.add(jb);
        //将滚动条和面板添加到窗体中
        this.add(jsp, BorderLayout.CENTER);//放中间位置
        this.add(jp,BorderLayout.SOUTH);//放于底部
        //设置标题,大小,位置,关闭,可见
        this.setTitle("客户端");
        this.setSize(400,400);
        this.setLocation(700,300);
        this.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);//窗体关闭则退出
        this.setVisible(true);

        
        //发送按钮绑定监听事件
        jb.addActionListener(this);
        //给文本框绑定回车键事件
        jtf.addKeyListener(this);
        try {
            //1.创建Socket
            Socket socket = new Socket(clientIP, clientPort);
            //2.获取输入流,读数据
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            //3.获取输出流,写数据
            OutputStream os = socket.getOutputStream();
            bw = new BufferedWriter(new OutputStreamWriter(os));
            //循环读取数据
            String line = null;
            while ((line = br.readLine())!=null){
                jta.append(line+System.lineSeparator());
            }

            //4.关闭Socket通道
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
       sendData();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_ENTER){
            sendData();
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    public void sendData(){
        //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();
        }
    }

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

运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324762.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号