一对一聊天程序

java 复制代码
package untitled1.src;

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

public class MyServer extends JFrame{
    private ServerSocket server; // 服务器套接字
    private Socket socket; // 客户端套接字
    private BufferedReader reader;
    private PrintWriter writer;// 根据套接字字节流创建的字符输出流
    // = new PrintWriter("D:\\word.txt")
    private JTextArea area = new JTextArea();// 展示信息的文本域
    private JTextField text = new JTextField(); // 发送信息的文本框

    void start() {// 启动服务器
        try {
            server = new ServerSocket(8998); // 服务器启用8998端口
            area.append("服务器套接字已经创建成功\n");
            while (true) {
                area.append("等待客户端的连接\n");
                socket = server.accept(); // 服务器监听客户端连接
                // 根据套接字字节流创建字符输入流
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                writer = new PrintWriter(socket.getOutputStream(), true);
                while (true) {// 循环接受信息
                    String message = reader.readLine();// 读取一行文本
                    if ("exit".equals(message)) {// 如果客户端发来的内容为"exit"
                        System.out.println("客户端退出");
                        break;// 停止接受信息
                    }
                    area.append("客户端:" + message + "\n");
                }
                reader.close(); // 关闭流
                socket.close(); // 关闭套接字
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public MyServer() throws FileNotFoundException {
        setTitle("向客户端送数据");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane(); // 主容器
        JScrollPane scrollPane = new JScrollPane(area);// 滚动面板
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        c.add(text, "South"); // 将文本框放在窗体的下部

        text.addActionListener(new ActionListener() {// 文本框触发回车事件
            public void actionPerformed(ActionEvent e) {
                if (text.getText() != null){
                    writer.println(text.getText().trim()); // 将文本框中的信息写入流
                }
                area.append(text.getText() + '\n'); // 将文本框中的信息显示在文本域中
                text.setText(""); // 将文本框清空
            }
        });
    }

    public static void main(String[] args) throws FileNotFoundException {
        MyServer tcp = new MyServer();
        tcp.setSize(500, 300); // 窗体大小
        tcp.setVisible(true); // 显示窗体
        tcp.start(); // 启动服务器
    }
}
java 复制代码
package untitled1.src;

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

public class MyClient extends JFrame {
    private BufferedReader reader;
    private PrintWriter writer;// 根据套接字字节流创建的字符输出流
    Socket socket; // 客户端套接字
    private JTextArea area = new JTextArea();// 展示信息的文本域
    private JTextField text = new JTextField(); // 发送信息的文本框

    public MyClient() {
        setTitle("向服务器送数据");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container c = getContentPane(); // 主容器
        JScrollPane scrollPane = new JScrollPane(area);// 滚动面板
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        c.add(text, "South"); // 将文本框放在窗体的下部

        text.addActionListener(new ActionListener() {// 文本框触发回车事件
            public void actionPerformed(ActionEvent e) {
                writer.println(text.getText().trim()); // 将文本框中的信息写入流
                area.append(text.getText() + '\n'); // 将文本框中的信息显示在文本域中
                text.setText(""); // 将文本框清空
            }
        });
    }

    private void connect() { // 连接服务器方法
        area.append("尝试连接\n"); // 文本域中提示信息
        try {
            socket = new Socket("127.0.0.1", 8998); // 连接本地计算机的8998端口
            writer = new PrintWriter(socket.getOutputStream(), true);
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            area.append("完成连接\n");
            while (true) {// 循环接受信息
                String message = reader.readLine();// 读取一行文本
                if ("exit".equals(message)) {// 如果服务端发来的内容为"exit"
                    System.out.println("服务端退出");
                    break;// 停止接受信息
                }
                area.append("服务器:" + message + "\n");
            }
            reader.close(); // 关闭流
            socket.close(); // 关闭套接字
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        MyClient clien = new MyClient();
        clien.setSize(500, 300); // 窗体大小
        clien.setVisible(true); // 显示窗体
        clien.connect(); // 连接服务器
    }
}
相关推荐
咚为13 小时前
Rust 错误处理的工程化演进:从 Result 到系统级边界设计
开发语言·后端·rust
qq_4061761413 小时前
深入剖析JS中的XSS与CSRF漏洞:原理、攻击与防御全指南
服务器·开发语言·前端·javascript
Lv117700814 小时前
Visual Studio中的二维数组和交错数组
ide·笔记·c#·visual studio
qq_124987075314 小时前
基于Java的心理测试系统的设计与实现(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·计算机毕设·计算机毕业设计
写代码的【黑咖啡】14 小时前
Python中的Statsmodels:统计建模与假设检验
开发语言·python
福楠14 小时前
C++ | 红黑树
c语言·开发语言·数据结构·c++·算法
Jaxson Lin14 小时前
Java编程进阶:智能仿真无人机项目1.0
java·开发语言
weixin_4331793314 小时前
python - 函数 function
开发语言·python
江君是实在人14 小时前
java 面试题 redis 处理大key问题
java·开发语言·redis
进击的小头15 小时前
创建型模式:单例模式(C语言实现与实战)
c语言·开发语言·单例模式