java多人聊天

服务端

package 多人聊天;



import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class Gserver implements Runnable {
	private int Port = 9999;
	private ServerSocket SS;
	private Socket socket;
	private ArrayList clients = new ArrayList();  //保存客户端线程
	public Gserver(){
		try{			
			SS = new ServerSocket(Port);
			new Thread(this).start();
		}catch(Exception ex){		
		}		
	}
	public void run(){
		try{
			while(true){
				socket = SS.accept();
				ChatThread ct = new ChatThread(socket);
				clients.add(ct);
				ct.start();
			}			
		}catch(Exception ex){	
		}
	}
	class ChatThread extends Thread{
		private Socket s;
		private InputStream is;
		private OutputStream os;
		private BufferedReader br;
		private PrintStream ps;
		public ChatThread(Socket socket) throws Exception{
			this.s = socket;
			is = this.s.getInputStream();
			os = this.s.getOutputStream(); 
			br = new BufferedReader(new InputStreamReader(is));
			ps = new PrintStream(os);
		}
		public void run(){
			try{
				while(true){
					String str = br.readLine();	
					sendMessage(str);
				}
			}catch (Exception ex){
			}
		}
		public void sendMessage(String str){
			for(int i=0; i<clients.size(); i++){
				ChatThread ct = (ChatThread)clients.get(i);
				ct.ps.println(str);
			}
		}
	}
	public static void main(String[] args){
		new Gserver();
	}
}

客户端

package 多人聊天;




import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Gclient extends JFrame implements ActionListener, Runnable {
	private Socket socket;
	private int Port = 9999;
	private InetAddress ip;
	private String name;
	
	private JTextArea area = new JTextArea("以下是聊天内容:\n");
	private JTextField field = new JTextField("");
	
	public Gclient(){
		this.setTitle("客户端");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.add(field,BorderLayout.NORTH);
		field.addActionListener(this);
		this.add(area, BorderLayout.CENTER);		
		this.setSize(240, 260);
		this.setVisible(true);
		name = JOptionPane.showInputDialog("输入昵称:");
		try{
			ip = InetAddress.getByName("Localhost");
			socket = new Socket(ip,Port);
			JOptionPane.showMessageDialog(this, "连接成功");
			this.setTitle("客户端:" + name);
			new Thread(this).start();
		}catch (Exception ex){			
		}
	}
	public void run(){
		try{
			while(true){
				InputStream is = socket.getInputStream();
				BufferedReader bf = new BufferedReader(new InputStreamReader(is));
				String str = bf.readLine();
				area.append(str + '\n');
			}
		}catch (Exception ex){	
		}
	}
	public void actionPerformed(ActionEvent e){
		try{
			OutputStream os = socket.getOutputStream();
			PrintStream ps = new PrintStream(os);
			ps.println(name + "说:" + field.getText());
			field.setText("");
		}catch (Exception ex){			
		}
	}
	public static void main(String[] args) {
		new Gclient();
	}
}

 结果

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用 Bytebase 做数据库 schema 迁移

数据库 schema 迁移指修改管理数据库结构的变更&#xff0c;包括为数据库添加视图或表、更改字段类型或定义新约束。Bytebase 提供了可视化 GUI 方便迁移数据库 schema&#xff0c;本教程将展示如何使用 Bytebase 为 schema 迁移配上 SQL 审核&#xff0c;自定义审批流&#xf…

解决Could not establish connection to : XHR failed

解决Could not establish connection to : XHR failed 问题描述 用vscode用远程连接服务器时总报上面的错误&#xff0c;用xshell和Xftp和vscode终端都可以连上&#xff0c;但是用vscode的ssh连接缺总报错&#xff0c;导致无法连接服务器进行代码调试 一、原因 原因可能是在…

Python tkinter 之文件对话框(filedialog)

文章目录 1 文件1.1 获取单个文件名称&#xff1a;askopenfilename()1.2 获取多个文件名称&#xff1a;askopenfilenames()1.3 获取单个文件属性&#xff1a;askopenfile()1.4 获取多个文件属性&#xff1a;askopenfiles()1.5 获取保存文件的路径&#xff1a;asksaveasfilename…

树莓派4B iio子系统 mpu6050

编写基于iio的mpu6050 遇到的问题&#xff0c;在读取数据时&#xff0c;读出来的数据不能直接拼接成int类型 需要先将其转换成short int&#xff0c;再转换成int 效果如图所示 注&#xff1a;驱动是使用的modprobe加载的 简单画的思维导图 设备树修改部分&#xff1a; …

大模型发展对教育领域的巨大影响

摘要&#xff1a; 教育是一个复杂而微妙的领域;有效的教学涉及对学生认知的推理&#xff0c;并应反映学生的学习目标。基础模型的性质在这里提出了在人工智能教育领域尚未实现的承诺&#xff1a;虽然教育中的某些许多数据流单独地过于有限&#xff0c;无法训练基础模型&#xf…

【linux系统编程】编辑器gcc/g++

目录 Linux下的编辑器 介绍&#xff1a; 1&#xff0c;编辑器gcc/g 1-1&#xff0c;系统的编译过程 1-2&#xff0c;预处理过程 1-3&#xff0c;编译过程 1-4&#xff0c;汇编过程 1-5&#xff0c;链接过程 Linux下的编辑器 介绍&#xff1a; Linux系统下可支持很多高…

祝大雪节气安康,大雪动态表情包图片带字祝福大全,大雪快乐暖心问候祝福语

1、大雪节气&#xff0c;送你防寒秘笈&#xff1a;1、天寒地冻防路滑;2、寒风呼啸防感冒;3、寒气袭人防哮喘;4、戴上耳套防冻耳;5、戴上手套防冻手;6、穿上棉鞋防冻脚;7、多喝开水防上火。8、加强锻炼防疾患。祝健康快乐。 2、奉天承运&#xff0c;皇帝诏曰&#xff1a;大雪节气…

STM32CubeMx+MATLAB Simulink串口输出实验

STM32CubeMxMATLAB Simulink串口输出实验 &#x1f4cc;《STM32CubeMxMATLAB Simulink点灯程序》&#x1f4cd;相关篇《MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试》&#x1f516;需要的软件支持包&#xff1a;Embedded Coder Support Package fo…

Spingboot 之spring-boot-starter-parent与spring-boot-dependencies区分

在创建spring boot工程时&#xff0c;spring-boot-starter-parent 和 spring-boot-dependencies是二选一的关系&#xff0c;在pom中引入其中一个就可以了。 那么什么时候用spring-boot-starter-parent 和 spring-boot-dependencies呢&#xff1f;从字面名称上看&#xff0c;如…

「Verilog学习笔记」根据状态转移写状态机-二段式

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 和三段式相比&#xff0c;就是将输出块和次态切换块合并。 timescale 1ns/1nsmodule fsm2(input wire clk ,input wire rst ,input wire data ,output reg flag );//****…

利器|一款集成的BurpSuite漏洞探测插件

本着市面上各大漏洞探测插件的功能比较单一&#xff0c;因此与TsojanSecTeam成员决定在已有框架的基础上修改并增加常用的漏洞探测POC&#xff0c;它会以最少的数据包请求来准确检测各漏洞存在与否&#xff0c;你只需要这一个足矣。 1、加载插件 2、功能介绍 &#xff08;1&a…

『VUE3后台—硅谷甄选』

一、准备前期 pnpm create vite

计算机操作系统3

1.虚拟机 VM 两类虚拟机的对比&#xff1a; 2.进程 进程的特征&#xff1a; 进程状态的转换&#xff08;五大状态&#xff09; 3.进程控制原语的作用 4.线程 ​​​​​线程的属性 实现方式 5.调度算法的评价指标

python-sql-spark常用操作

数据抽取提速&#xff1a; 1. 不要把rdd或者df展示出来&#xff0c;只有第一遍跑流程的时候看看中间结构&#xff0c;后面就只保存不展示。 2. 尽量使用spark.sql&#xff0c;而不是rdd。sql处理groupby会快很多。基本上10min的rdd&#xff0c;sql只需2min。所以基本除了复杂…

深度探索Linux操作系统 —— 构建内核

系列文章目录 深度探索Linux操作系统 —— 编译过程分析 深度探索Linux操作系统 —— 构建工具链 深度探索Linux操作系统 —— 构建内核 文章目录 系列文章目录前言一、内核映像的组成 前言 内核的构建系统 kbuild 基于GNU Make&#xff0c;是一套非常复杂的系统。 对于编译内核…

用 C 写一个卷积神经网络

用 C 写一个卷积神经网络 深度学习领域最近发展很快&#xff0c;前一段时间读transformer论文《Attention Is All You Need》时&#xff0c;被一些神经网络和深度学习的概念搞得云里雾里&#xff0c;其实也根本没读懂。发现深度学习和传统的软件开发工程领域的差别挺大&#xf…

19、XSS——HTTP协议安全

文章目录 一、Weak Session IDs(弱会话IDs)二、HTTP协议存在的安全问题三、HTTPS协议3.1 HTTP和HTTPS的区别3.2 SSL协议组成 一、Weak Session IDs(弱会话IDs) 当用户登录后&#xff0c;在服务器就会创建一个会话&#xff08;Session&#xff09;&#xff0c;叫做会话控制&…

tomcat配置管理员And配置访问静态资源

配置管理员 打开 tomcat\conf\tomcat-users.xml <tomcat-users xmlns"http://tomcat.apache.org/xml"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://tomcat.apache.org/xml tomcat-users.xsd"version&qu…

openai 1.3.x 版本 openai.APITimeoutError: Request timed out. 解决

问题描述 openai 1.3.x 版本 请求出现 Request timed out File "E:\Python\Python312\Lib\site-packages\openai\_base_client.py", line 920, in _request return self._retry_request( ^^^^^^^^^^^^^^^^^^^^ File "E:\Python\Python312\L…

python爬虫零基础学习之简单流程示例

文章目录 爬虫基础爬虫流程常用库爬虫示例关于Python爬虫技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 爬虫基础 网络爬…