Java聊天程序(一对一)简单版

news2024/11/27 0:41:15

我们首先要完成服务端,不然出错,运行也要先运行服务端,如果不先连接服务端,就不监听,那客户端不知道连接谁

服务端

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class FWD extends JFrame implements ActionListener,KeyListener {
	//1.窗体组件
	
	//文本域
	 private JTextArea wby;
	 //滚动条
	 private JScrollPane gdt;
	 //输入面板
	 private JPanel mb;
	 //文本框
	private JTextField wbk;
	//按钮
	private JButton an ;
	//输出流
	private BufferedWriter BW=null;
	
	public FWD() {
		
		//将组件初始化
		wby=new JTextArea();
		//设置文本域不可编辑
		wby.setEditable(false);
		//要将文本域放到滚动条中,实现滚动效果
		gdt=new JScrollPane(wby);
		//面板
		mb=new JPanel();
		wbk=new JTextField(10);
		an=new JButton("发送");
		//文本框和按钮要放到面板中
		mb.add(wbk);
		mb.add(an);
		//将滚动条和面板放到窗体中
		this.add(gdt,BorderLayout.CENTER);//将文本内容也就是滚动条放到窗体的中间
		this.add(mb,BorderLayout.SOUTH);//将输入面板放到窗体的底(南)部
		
		//窗体属性
		setTitle("服务端");//标题
		setSize(400,400);//窗体大小
		setLocation(250,200);//位置
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭方式
		setVisible(true);//是否显示
		
		//发送事件
		
		an.addActionListener(this);
		wbk.addKeyListener(this);
		
		try {
			//创建套接字
			ServerSocket s=new ServerSocket(8998);
			Socket sk = s.accept();
			
			
				//获取输入流(读取文本框的数据)
				//使用BufferedReader的readLine()方法,为了一行一行读取
				
				BufferedReader r=new BufferedReader(new InputStreamReader(sk.getInputStream()));
				//获取输出流(输出数据)也是一行一行的
				//BufferedWriter的newLine()方法
				 BW=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
				
				//循环获取数据,并拼接到文本域中
				String line=null;
				while((line=r.readLine())!=null) {
					//将读取的数据拼接到文本域中
					wby.append(line+"\n");
				}
				
				//关闭
				s.close();
				sk.close();
				
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		
		
	}
	
	public void sx() {
		//获取文本框的数据
				String text=wbk.getText();
				//拼接要发送的内容
				text="服务端:"+text;
				//服务端面板显示
				wby.append(text+"\n");
				
				try {
					//发送
					BW.write(text);
					//换行
					BW.newLine();
					
					//刷新
					BW.flush();
					//让文本框为空
					wbk.setText("");
					
				
				}catch(IOException e1) {
					e1.printStackTrace();
				}
	}
	public static void main(String[] args) {
		new FWD();

	}


	@Override//按钮事件
	public void actionPerformed(ActionEvent e) {
		sx();
	}
	//回车事件
@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_ENTER) {
			sx();
		}
		
	}


	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}


	

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

}





客户端

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class KHD extends JFrame implements ActionListener,KeyListener{
	//1.窗体组件
	
		//文本域
		 private JTextArea wby;
		 //滚动条
		 private JScrollPane gdt;
		 //输入面板
		 private JPanel mb;
		 //文本框
		private JTextField wbk;
		//按钮
		private JButton an ;
		
		private BufferedWriter BW=null;
		public KHD() {
			
			//将组件初始化
			wby=new JTextArea();
			//设置文本域不可编辑
			wby.setEditable(false);
			//要将文本域放到滚动条中,实现滚动效果
			gdt=new JScrollPane(wby);
			//面板
			mb=new JPanel();
			wbk=new JTextField(10);
			an=new JButton("按钮");
			//文本框和按钮要放到面板中
			mb.add(wbk);
			mb.add(an);
			//将滚动条和面板放到窗体中
			this.add(gdt,BorderLayout.CENTER);//将文本内容也就是滚动条放到窗体的中间
			this.add(mb,BorderLayout.SOUTH);//将输入面板放到窗体的底(南)部
			
			//窗体属性
			setTitle("客户端");//标题
			setSize(400,400);//窗体大小
			setLocation(800,200);//位置
			setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭方式
			setVisible(true);//是否显示
			
			
			//绑定一个发送的监听事件
			
			an.addActionListener(this);
			wbk.addKeyListener(this);
			try {
			//创建客户端的套接字(尝试连接)
			Socket sk=new Socket("127.0.0.1",8998);
			//获取Socket的输入流
			BufferedReader r=new BufferedReader(new InputStreamReader(sk.getInputStream()));
			//获取Socket的输出流
			 BW=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));

			
			
			//循环获取数据,并拼接到文本域中
			String line=null;
			while((line=r.readLine())!=null) {
				//循环读取
				wby.append(line+"\n");
			}
			
			//关闭Socket通道
			sk.close();
			
			}catch(IOException e) {
				e.printStackTrace();
				
				};
			
		}
		public void sx() {
			//获取文本框的数据
			String text=wbk.getText();
			//拼接要发送的内容
			text="客户端:"+text;
			//服务端面板显示
			wby.append(text+"\n");
			
			try {
				//发送
				BW.write(text);
				//换行
				BW.newLine();
				//刷新
				BW.flush();
				//让文本框为空
				wbk.setText("");
			
			}catch(IOException e1) {
				e1.printStackTrace();
			}
		
		}
		public static void main(String[]args) {
			new KHD();
		}
		@Override
		public void actionPerformed(ActionEvent e) {
			sx();
			
		}
		@Override
		public void keyPressed(KeyEvent e) {
			if(e.getKeyCode()==KeyEvent.VK_ENTER) {
			sx();
			}
			}
		@Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		@Override
		public void keyReleased(KeyEvent e) {
			// TODO Auto-generated method stub
			
		}
		
		
		
		
}

结果:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见数据同步工具之实时同步

实时数据同步是现代数据处理中非常重要的一环。在常见的数据同步工具中,Flume、Flink CDC和DataX都是非常受欢迎的选择。它们各自有自己的工作原理、优势和劣势。 Flume主要用于日志传输,简单易用但对特定数据源可能有限;Flink CDC基于CDC技术…

jQuery ajax读取本地json文件 三级联动下拉框

步骤 1:创建本地JSON文件 {"departments": [{"name": "会计学院","code": "052"},{"name": "金融学院","code": "053"},{"name": "财税学院",&qu…

基于若依的ruoyi-nbcio流程管理系统支持支持定时边界事件和定时捕获事件

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 1、定时边界事件 <template><div class"panel-tab__content"><!--目前只处理定…

【Java系列】详解多线程(一)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】 本专栏旨在分享学习Java的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、背景引入二、线程…

解决git提交完代码后切换到自己分支pull拉错远程分支

&#x1f979;MD 我是猪&#xff01;拉代码的时候净想着干饭了&#xff0c;一下给拉错了&#x1f624; &#x1f338;方法一&#xff1a;打印日志&#xff0c;然后回退版本 &#x1f338;方法二&#xff1a; 舍弃本地修改 git checkout .直接把冲突的文件提交到自己的分支&a…

Linux内核上游提交完整流程及示例

参考博客文章&#xff1a; 向linux内核提交代码 - 知乎 一、下载Linux内核源码 通过git下载Linux内核源码&#xff0c;具体命令如下&#xff1a; git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 实际命令及结果如下&#xff1a; penghaoDin…

【华为网络-配置-025】- 同 VLAN 下不同网段通信(启用 Sub 地址)

要求&#xff1a; 1、各接口配置 VLAN 后配置 Sub 地址使 PC1 与 PC3 通信。 一、sub 地址配置 [LSW1]vlan 10 [LSW1]port-group group-member GigabitEthernet 0/0/1 to GigabitEthernet 0/0/2 [LSW1-port-group]port link-type access [LSW1-port-group]port default vla…

掌握接口测试全流程,让你成为专业接口测试大师!

扫盲内容 1.为什么要做接口测试&#xff1f; 2.怎样做接口测试&#xff1f; 3.接口测测试点是什么&#xff1f; 4.接口测试都要掌握哪些知识&#xff1f; 5.其他相关知识&#xff1f; 一.为什么要做接口测试&#xff1f; ①.越底层发现bug&#xff0c;它的修复成本是越低…

Adobe XD学习攻略:成为设计大师的捷径!

Adobexd是什么软件&#xff1f;Adobexd是一站式UI/UX设计平台&#xff0c;结合设计和建立原型功能。用户可以使用Adobexd进行网页设计、移动应用程序设计和原型图绘制&#xff0c;也可以使用Adobexd软件更高效、更准确地完成静态编译和框架图到交互原型的转换。 然而&#xff…

ubuntu22.04 显卡驱动最简单的安装方法

1.拉取可选择安装的显卡驱动版本 sudo apt-get purge nvidia* #apt 的 update 和 upgrade 的区别 #apt update 命令只会获得系统上所有包的最新信息&#xff0c;并不会下载或者安装任何一个包。 #apt upgrade 命令来把这些包下载和升级到最新版本。 2.sudo apt update 3.安装…

如何批量给文件名加文字?

如何批量给文件名加文字&#xff1f;在我们的日常生活和工作中&#xff0c;经常会面临大量文件需要分类整理&#xff0c;并且可能需要在文件名后面添加一串文字作为备注。如果只是少量文件&#xff0c;我们可以手动逐个添加备注&#xff0c;但如果涉及上千甚至上万个文件&#…

vue项目下npm或yarn下安装echarts多个版本

最近在大屏展示的时候&#xff0c;用到了百度的echarts图表库&#xff0c;看完效果图后&#xff0c;又浏览了一下echarts官网案例&#xff0c;大同小异。但是搬砖过程中发现实际效果和demo相差甚远&#xff0c;一番折腾发现&#xff0c;项目中安装的是echarts4.x版本&#xff0…

重估拼多多,TEMU带给拼多多的不止是市值增量

监制 | 何玺 排版 | 叶媛 谁也没有想到&#xff0c;中国电商的格局改变居然如此之快。 12月29日&#xff0c;拼多多市值超越多年雄踞国内电商头把交椅的阿里巴巴&#xff0c;成为美股市值最大中概股。从此时开始&#xff0c;中国电商开始“拼”时代。 拼多多凭什么能超越阿里…

FFmpeg之将视频转为16:9(横屏)或9:16(竖屏)(三十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

3、Linux_系统用户管理

1.Linux 用户管理 1.1概述 Linux系统是一个多用户多任务的操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。root用户是系统默认创建的管理员账号。 1.2添加用户 语法 useradd […

Kubernetes入门笔记——(2)k8s设计文档

​k8s最初源自谷歌的Brog项目&#xff0c;架构与其类似&#xff0c;主要包括etcd、api server、controller manager、scheduler、kubelet和kube-proxy等组件 etcd&#xff1a;分布式存储&#xff0c;保存k8s集群的状态 api server&#xff1a;资源操作的唯一入口&#xff0c;…

如何用docker在自己服务器上部署springboot项目

一、将springboot项目打包 1、maven clean项目 2、maven package项目 打包成功之后生成jar文件&#xff08;在target目录下&#xff09; 3、为Java创建Dockerfile 引入jdk8的Docker镜像 FROM openjdk:8 为了使运行其余命令时更容易&#xff0c;让我们设置映像的工作目录。这将…

LLM之RAG实战(一):使用Mistral-7b, LangChain, ChromaDB搭建自己的WEB聊天界面

一、RAG介绍 如何使用没有被LLM训练过的数据来提高LLM性能&#xff1f;检索增强生成&#xff08;RAG&#xff09;是未来的发展方向&#xff0c;下面将解释一下它的含义和实际工作原理。 ​ 假设您有自己的数据集&#xff0c;例如来自公司的文本文档。如何让ChatGPT和其他…

响应式编程又变天了?看JDK21虚拟线程如何颠覆!

本文解释为啥会有响应式编程&#xff0c;为什么它在开发者中不太受欢迎&#xff0c;以及引入 Java 虚拟线程后它可能最终会消失。 命令式风格编程一直深受开发者喜爱&#xff0c;如 if-then-else、while 循环、函数和代码块等结构使代码易理解、调试&#xff0c;异常易追踪。然…

基于gitlab的webhook集成jenkins,并在gitlab流水线中展示jenkins的job状态信息

文章目录 1. 环境信息2. gitlab 部署3. jenkins部署4. gitlab集成jenkins4.1 jenkins的凭据上保存gitlab的账号信息4.2 jenkins中配置gitlab的连接信息4.3 编写jenkins上pipeline文件4.4 jenkins上创建pipeline项目4.5 gitlab上配置webhooks事件4.6 测试 1. 环境信息 gitlab服…