一对一聊天程序

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(); // 连接服务器
    }
}
相关推荐
量子炒饭大师6 小时前
【C++ 进阶】Cyber霓虹掩体下的代码拟态——【面向对象编程 之 多态】一文带你搞懂C++面向对象编程中的三要素之一————多态!
开发语言·c++·多态
何以解忧唯有撸码7 小时前
玩转控件:封装个带图片的Label控件
c#·winform·自定义控件·封装控件·控件扩展
xiaoshuaishuai87 小时前
C# 实现百度搜索算法逆向
开发语言·windows·c#·dubbo
yuan199977 小时前
使用模糊逻辑算法进行路径规划(MATLAB实现)
开发语言·算法·matlab
深兰科技7 小时前
深兰科技与淡水河谷合作推进:矿区示范加速落地
java·人工智能·python·c#·scala·symfony·深兰科技
蒸汽求职7 小时前
北美求职身份过渡:Day 1 CPT 的合规红线与安全入职指南
开发语言·人工智能·安全·pdf·github·开源协议
YuanDaima20488 小时前
二分查找基础原理与题目说明
开发语言·数据结构·人工智能·笔记·python·算法
fox_lht8 小时前
7.3.结构体-方法
开发语言·后端·rust
chenbin___8 小时前
检查hooks依赖的工具(转自千问)
开发语言·前端·javascript·react native·react.js
久爱@勿忘8 小时前
vue/uniapp H5页面截图
开发语言·前端·javascript