javaTCP协议实现一对一聊天

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

服务端

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 fwq 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
			
		}
		
		
		
		
}

运行结果:

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

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

相关文章

ncnn模型部署——使用VS2019把项目打包成DLL文件

一、项目打包成DLL文件 1.创建动态链接库DLL项目 创建完成,项目中包含源文件dllmain.cpp, pch.cpp,头文件framework.h, pch.h 2.编写和配置DLL项目 (1)配置pch.h文件,在头文件pch.h中定义宏,宏的作用的是…

gma 空间绘图实战(1):绘制多个子图,连接并展示局部放大区域

安装 gma:pip install gma 本文基于:gma 2.0.3,Python 3.10 本文用到的矢量数据为:CTAmap 1.12。来源于 https://www.shengshixian.com/ 。(感谢锐多宝) 绘图目标 参考代码 import matplotlib.pyplot as p…

电子秤ADC芯片CS1237技术资料问题合集

问题11:实际应用中,多个称重传感器应该怎么与ADC连接? 解答:如果传感器是测量同一物体(例如:厨房垃圾处理器),一般建议使用并联的方式。则相同类型的信号线连接在一起。对于传感器的…

MySQL - 并发控制与事务的隔离级别

目录 第1关:并发控制与事务的隔离级别 第2关:读脏 第3关:不可重复读 第4关:幻读 第5关:主动加锁保证可重复读 第6关:可串行化 第1关:并发控制与事务的隔离级别 任务描述 本关任务&#…

Java第二十一章 :网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封装成不同的类,用户只要创建这些类的对象,使用相应的方法,即使不具备有关的网络支持,也可以编写出高质量的网络通信程…

十六、FreeRTOS之FreeRTOS队列集

本节需要掌握以下内容: 1,队列集简介(了解) 2,队列集相关API函数介绍(熟悉) 3,队列集操作实验(掌握) 一、队列集简介(了解) 一个…

硬件基础:差模和共模

一直以来,都难以理解差模和共模这两个概念,什么差分信号、差模信号、共模信号,差模干扰、共模干扰……虽然看了一些资料,但貌似说法还挺多的,理解起来仍然是一头雾水。所以,专门用一篇文章来好好研究下这个…

Anisble中剧本的应用

1.什么是playbook及playbook的组成 1. Playbook 的功能 playbook 是由一个或多个 play 组成的列表 Playboot 文件使用 YAML 来写的 2. YAML 简介: 是一种表达资料序列的格式 , 类似 XML Yet Another Markup Language 3. 特点 可读性好 和脚本语言…

Java+Swing: 登录和重置按钮的点击事件 整理6

1. 在Login类中给按钮添加事件 // 按钮添加鼠标点击事件loginButton.addActionListener();resetButton.addActionListener(); 2. 创建一个事件处理的类, 该类实现了ActionListener package com.handler;/*** Author:xiexu* Date:2023/12/7 13…

Python面向对象③:封装【侯小啾Python基础领航计划 系列(二十一)】

Python面向对象③:封装【侯小啾Python基础领航计划 系列(二十一)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

simulink enable模块——使能子系统案例仿真分析

1.案例分析 仍以一个简单的乘法增益案例分析 分析:可以看到,在满足条件性才条用使能子系统,在t1s和3s时刻,进行增益操作,这和上篇博客中的触发trigger子系统相同的作用。 simulink trigger模块使用——多种调用案例分…

Pixyz Studio 和 Pixyz Scenario Processor 使用入门

介绍 Pixyz产品官网 下载、安装与技术文档 官网介绍:Pixyz 支持超过 45 种工业文件格式,包括 CATIA、JT、STEP、IFC、PVZ、NWD、USD 及 glTF。包括 CAD、曲面细分/网格模型、点云等。Unity 中的资产将实时关联到原始数据,可自动更新文件的修…

HL7/FHIR 是什么

如果你对上面 2 个单词不熟悉的话,那就需要先脑补下了。 HL7 HL7 可以认为是一个标准化的组织,这个组织主要对标准进行控制。 如果你希望在医疗系统中对数据进行交换,通常 HL7 现在就是事实上的标准了。 FHIR FHIR – Fast Health Inter…

华清远见嵌入式学习——QT——作业1

作业要求&#xff1a; 代码&#xff1a; ①&#xff1a;头文件 #ifndef LOGIN_H #define LOGIN_H#include <QWidget> #include <QLineEdit> //行编辑器类 #include <QPushButton> //按钮类 #include <QLabel> //标签类 #include <QM…

Java 实现TCP一对一聊天,UDP协议实现群聊

用TCP编程实现一对一式聊天&#xff0c;并用多线程解决了处于同一线程中的问题。 客户端代码&#xff1a;mport java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.ut…

c++ - 警告 : treating ‘c-header‘ input as ‘c++-header‘ when in C++ mode, 此行为已弃用

一、问题出现 在进行多文件编译的时候报错 二、原因 我们多文件编译的时候加了头文件 三、解决办法 去掉头文件&#xff0c;只编译源文件

流星雨效果

文章目录 html css实现jscanvas实现 html css实现 对于 HTML 来说&#xff0c;:root 表示 元素&#xff0c;除了优先级更高之外&#xff0c;与 html 选择器相同。带有前缀 – 的属性名&#xff0c;比如 --example–name&#xff0c;表示的是带有值的自定义属性&#xff0c;其…

Threejs项目实战之一:汽车外观换肤效果三维展示

目录 最终效果1 创建项目2 安装插件3 编写代码3.1 准备工作3.2 代码编写3.2.1 在template标签中构建html页面3.2.2 在style标签中构建页面样式文件3.2.3 在script标签中编写js代码 最终效果 先看下最终实现的效果 接下来&#xff0c;我们就从创建项目开始&#xff0c;一步一步…

ChatGPT/GPT4科研实践篇: AI绘图+论文写作+编程

1、熟练掌握ChatGPT提示词技巧及各种应用方法&#xff0c;并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告&#xff0c;提供写作能力及优化工作 3、熟练掌握ChatGPT融合相关插件的应用&#xff0c;完成数据分析、编程以及深度学习等相关科研项目。 4、…

【Windows本地端口占用脚本自动化】

本地启动多个Java微服务&#xff0c;因为停电或者内存回收原因&#xff0c;IDEA直接退出&#xff1b;再次启动各个服务会提示端口占用。 每次都cmd输入命令手动Kill比较繁琐&#xff0c;可以把此脚本放在桌面上作为一个小工具&#xff0c;运行即可。 代码(核心部分是chatGPT自…