一对一聊天程序

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(); // 连接服务器
    }
}
相关推荐
wn5317 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
Hello-Mr.Wang19 分钟前
vue3中开发引导页的方法
开发语言·前端·javascript
救救孩子把22 分钟前
Java基础之IO流
java·开发语言
WG_1723 分钟前
C++多态
开发语言·c++·面试
时光追逐者25 分钟前
分享6个.NET开源的AI和LLM相关项目框架
人工智能·microsoft·ai·c#·.net·.netcore
宇卿.30 分钟前
Java键盘输入语句
java·开发语言
Amo Xiang39 分钟前
2024 Python3.10 系统入门+进阶(十五):文件及目录操作
开发语言·python
friklogff1 小时前
【C#生态园】提升C#开发效率:深入了解自然语言处理库与工具
开发语言·c#·区块链
重生之我在20年代敲代码2 小时前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
爱上语文2 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring