一对一聊天程序

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(); // 连接服务器
    }
}
相关推荐
jjjxxxhhh1232 分钟前
RSA加密解密代码
开发语言·c++
Sun_gentle9 分钟前
java.lang.RuntimeException: Could not load wrapper properties from ‘C:\Users\
java·开发语言·安卓
键盘鼓手苏苏20 分钟前
Flutter for OpenHarmony:git 纯 Dart 实现的 Git 操作库(在应用内实现版本控制) 深度解析与鸿蒙适配指南
开发语言·git·flutter·华为·rust·自动化·harmonyos
橙露21 分钟前
面向对象编程思想:Java 与 Python 的封装、继承与多态对比分析
java·开发语言·python
ShineWinsu35 分钟前
对于C++:模版进阶的解析
开发语言·c++·面试·笔试·求职·进阶·模版
啊哈哈121381 小时前
Python基本语法复盘笔记1(输入输出/字符串/列表)
开发语言·笔记·python
qq_150841992 小时前
3天基于VS2026的C#编程入门及动态调用CH341DLLA64读写I2C从机
开发语言·c#
Tony Bai2 小时前
Go 1.26 :go mod init 默认行为的变化与 Go 版本管理的哲学思辨
开发语言·后端·golang
xyq20242 小时前
WebForms SortedList 深度解析
开发语言
Hx_Ma162 小时前
测试题(三)
java·开发语言·后端