用Java实现一对一聊天

目录

服务端

 客户端


服务端

package 一对一用户;
import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;public class fuwuchuangkou extends JFrame {private JTextArea ta_info;private ServerSocket server; // 声明ServerSocket对象private Socket socket; // 声明Socket对象socketprivate Vector<Socket> vector = new Vector<Socket>();// 用于存储连接到服务器的客户端套接字对象public void createSocket() {try {server = new ServerSocket(1978);while (true) {ta_info.append("等待新客户连接......\n");socket = server.accept();// 创建套接字对象vector.add(socket);// 将套接字对象添加到向量对象中ta_info.append("客户端连接成功。" + socket + "\n");new ServerThread(socket).start();// 创建并启动线程对象}} catch (IOException e) {e.printStackTrace();}}class ServerThread extends Thread {Socket socket;public ServerThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 创建输入流对象while (true) {String info = in.readLine();// 读取信息for (Socket s : vector) {// 遍历所有客户端套接字对象if (s != socket) {// 如果不是发送信息的套接字对象PrintWriter out = new PrintWriter(s.getOutputStream(), true);// 创建输出流对象out.println(info);// 发送信息out.flush();// 刷新输出缓冲区}}}} catch (IOException e) {ta_info.append(socket + "已经退出。\n");vector.remove(socket);// 移除退出的客户端套接字}}}public static void main(String args[]) {fuwuchuangkou frame = new fuwuchuangkou();frame.setVisible(true);frame.createSocket();}/*** Create the frame*/public fuwuchuangkou() {super();setTitle("一对一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}
}

 客户端

package 一对一用户;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class kehuchuangkou extends JFrame {private JTextArea ta_info;private JTextField tf_send;PrintWriter out;// 声明输出流对象/*** Launch the application* * @param args*/public static void main(String args[]) {EventQueue.invokeLater(new Runnable() {public void run() {try {kehuchuangkou frame = new kehuchuangkou();frame.setVisible(true);frame.createClientSocket();} catch (Exception e) {e.printStackTrace();}}});}public void createClientSocket() {try {Socket socket = new Socket("127.0.0.1", 1978);// 连接本地1978端口out = new PrintWriter(socket.getOutputStream(), true);// 创建输出流对象new ClientThread(socket).start();// 创建并启动线程对象} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}class ClientThread extends Thread {Socket socket;public ClientThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 创建输入流对象while (true) {String info = in.readLine();// 读取信息ta_info.append(info + "\n");// 在文本域中显示信息if (info.equals("88")) {break;// 结束线程}}} catch (IOException e) {e.printStackTrace();}}}private void send() {String info = tf_send.getText();// 获得输入的信息if (info.equals("")) {return;// 如果没输入信息则返回,即不发送}if (info.equals("88")) {System.exit(0);// 如果没输入信息是88,则退出}out.println(info);// 发送信息out.flush();// 刷新输出缓冲区tf_send.setText(null);// 清空文本框}public kehuchuangkou() {  //创建面板super();setTitle("一对一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JPanel panel = new JPanel();getContentPane().add(panel, BorderLayout.SOUTH);final JLabel label = new JLabel();label.setText("输入聊天内容:");panel.add(label);tf_send = new JTextField();tf_send.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});tf_send.setPreferredSize(new Dimension(180, 25));panel.add(tf_send);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});button.setText("发  送");panel.add(button);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}}

 

package 一对一用户;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class kehu1 extends JFrame {private JTextArea ta_info;private JTextField tf_send;PrintWriter out;// 声明输出流对象/*** Launch the application* * @param args*/public static void main(String args[]) {EventQueue.invokeLater(new Runnable() {public void run() {try {kehuchuangkou frame = new kehuchuangkou();frame.setVisible(true);frame.createClientSocket();} catch (Exception e) {e.printStackTrace();}}});}public void createClientSocket() {try {Socket socket = new Socket("127.0.0.1", 1978);// 连接本地1978端口out = new PrintWriter(socket.getOutputStream(), true);// 创建输出流对象new ClientThread(socket).start();// 创建并启动线程对象} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}class ClientThread extends Thread {Socket socket;public ClientThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 创建输入流对象while (true) {String info = in.readLine();// 读取信息ta_info.append(info + "\n");// 在文本域中显示信息if (info.equals("88")) {break;// 结束线程}}} catch (IOException e) {e.printStackTrace();}}}private void send() {String info = tf_send.getText();// 获得输入的信息if (info.equals("")) {return;// 如果没输入信息则返回,即不发送}if (info.equals("88")) {System.exit(0);// 如果没输入信息是88,则退出}out.println(info);// 发送信息out.flush();// 刷新输出缓冲区tf_send.setText(null);// 清空文本框}public kehu1() {  //创建面板super();setTitle("一对一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JPanel panel = new JPanel();getContentPane().add(panel, BorderLayout.SOUTH);final JLabel label = new JLabel();label.setText("输入聊天内容:");panel.add(label);tf_send = new JTextField();tf_send.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});tf_send.setPreferredSize(new Dimension(180, 25));panel.add(tf_send);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});button.setText("发  送");panel.add(button);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}}

运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263342.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch CIFAR10图像分类 Swin Transformer篇

Pytorch CIFAR10图像分类 Swin Transformer篇 文章目录 Pytorch CIFAR10图像分类 Swin Transformer篇4. 定义网络&#xff08;Swin Transformer&#xff09;Swin Transformer整体架构Patch MergingW-MSASW-MSARelative position biasSwin Transformer 网络结构Patch EmbeddingP…

NMOS管的工作状态及漏极电流与漏源电压、栅源电压之间的关系

NMOS管的工作状态及漏极电流与漏源电压、栅源电压之间的关系 以NMOS为例进行说明&#xff0c;PMOS管与NMOS管类似&#xff0c;只是正负极符号需要做些调整。 工作区域 对于NMOS管&#xff0c;根据 V g s V_{gs} Vgs​和 V d s V_{ds} Vds​大小的不同&#xff0c;MOS管可工作…

【牛牛送书 | 第三期】《一本书讲透Java线程:原理与实践》带你深入JAVA多线程

目录 摘要&#xff1a; 多线程对于Java的意义 为什么Java工程师必须掌握多线程 Java多线程使用方式 如何学好Java多线程 参与方式&#x1f947; 摘要&#xff1a; 互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#x…

Kubernetes实战(九)-kubeadm安装k8s集群

1 环境准备 1.1 主机信息 iphostname10.220.43.203master10.220.43.204node1 1.2 系统信息 $ cat /etc/redhat-release Alibaba Cloud Linux (Aliyun Linux) release 2.1903 LTS (Hunting Beagle) 2 部署准备 master/与slave主机均需要设置。 2.1 设置主机名 # master h…

layui日历插件

layui日历插件: 在已开源的layui日历插件的基础上的改版&#xff08;原版插件地址&#xff1a;https://gitee.com/smalldragen/lay-calender-mark&#xff09;https://gitee.com/tangmaozizi/layui-calendar-plugin.gitjava后台代码并没有把项目完整结构上传上去&#xff0c;因…

解决electron修改主进程后需要重启才生效

nodemon 是一种工具&#xff0c;可在检测到目录中的文件更改时通过自动重新启动节点应用程序来帮助开发基于 node.js 的应用程序 nodemon 特性 自动重新启动应用程序。检测要监视的默认文件扩展名。默认支持 node&#xff0c;但易于运行任何可执行文件&#xff0c;如 python、…

3DMAX关于显示驱动问题的解决方法大全

3DMAX与显卡驱动有关的问题主要有以下几种情况&#xff1a; 1.3DMAX启动弹出这样的界面&#xff1a; 2.主工具栏按钮不显示&#xff0c;或者鼠标移上去才显示&#xff08;刷新问题&#xff09;。 3&#xff0e;视口菜单不显示或显示不全。 问题分析&#xff1a; 首先&#x…

【解密考研英语:Python数据分析与可视化】

解密考研英语&#xff1a;Python数据分析与可视化 背景数据集技术选型功能实现创新点 大家好&#xff0c;欢迎阅读我的CSDN博客&#xff01;今天我将分享一项有关考研英语真题的数据分析与可视化项目&#xff0c;希望对考研学子提供更有针对性的复习帮助。 背景 作为考研学子…

cache教程 4.一致性哈希(hash)

本章节是单节点走向分布式节点的一个重要部分。 一致性哈希(consistent hashing)的原理以及为什么要使用一致性哈希。实现一致性哈希代码&#xff0c;添加相应的测试用例 1.多节点部署遇到的问题 上一章节完成了一个单节点的缓存服务器。那对于一个单节点来说&#xff0c;读…

【MATLAB】基于EEMD分解的信号去噪算法(基础版)

代码操作 【MATLAB】基于EEMD分解的信号去噪算法&#xff08;基础版&#xff09; 代码的主要内容 基于EEMD&#xff08;集合经验模态分解&#xff09;的信号去噪算法通常可以结合相关系数、信号的熵值或者方差贡献率来完成去噪处理。这些指标可以用于确定阈值&#xff0c;从而…

【视频笔记】古人智慧与修行

古人的智慧 相由心生、老子悟道、佛祖成佛 多一些思考&#xff0c;多一些精神修炼。 除非我们今天能够产生与人类科技发展相并行的精神变革&#xff0c;否则永远可能也无法跳脱出历史的轮回。 视频来源

Spring Cloud Gateway + Nacos + LoadBalancer实现企业级网关

1. Spring Cloud Gateway 整合Nacos、LoadBalancer 实现企业级网关 前置工作&#xff1a; 创建 SpringBoot 多模块项目创建网关&#xff08;gateway-service&#xff09;、用户&#xff08;user-service&#xff09;模块用户模块添加 Nacos discovery 支持以及 Spring Web&am…