一对一聊天程序

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(); // 连接服务器
    }
}
相关推荐
hez20104 小时前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr
雨落倾城夏未凉6 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
唐青枫7 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫8 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m6258 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902118 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠8 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫10 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech11 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf12 天前
C#摸鱼实录——IoC与DI案例详解
c#