实现简单通信 JAVA

news2025/6/17 18:33:33

创建服务端与客户端,再利用Java中socket编程传入传出数据

服务端

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class QqMain extends JFrame implements ActionListener{
	public static void main(String[] args){
		new QqMain();	
	}
	// 说明:一个类需要页面的显示,则那个类要继承JFrame。
	// 属性
	// 文本域
	private JTextArea jta;
	// 滚动条
	private JScrollPane jsp;
	// 面板里面是文本框和按钮
	private JPanel jp;
	private JTextField jtf;
	private JButton jb ;

	BufferedWriter bw  = null;
    
	// 构造器
	public QqMain(){
		
		// 初始化上面的属性
		jta = new JTextArea();
		
		// 将文本域添加到滚动条中
		jsp = new JScrollPane(jta);
		jp = new JPanel();
		jtf =new JTextField(15);
		jb = new JButton("发送");

		// 把按钮和文本框添加到面板中
        jp.add(jtf);
		jp.add(jb);

		// 把滚动条和面板添加到JFrame中去
		this.add(jsp,BorderLayout.CENTER); //这个设置在中间
		this.add(jp,BorderLayout.SOUTH); //南

		this.setTitle("远程通信 服务端");
		this.setSize(600,500);
		this.setLocation(200, 200);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

		/***********TCP协议*************/
		jb.addActionListener(this);  // 这是按钮点击使用
		// 回车键的监听事件 在接口KeyListener中
        //jtf.addKeyListener(this);


        jtf.addKeyListener(new KeyAdapter() {
	        public void keyTyped(KeyEvent e) {
		     if((char)e.getKeyChar()==KeyEvent.VK_ENTER) {
				 useVoid();
		     }
	       }
        });

		try{
		// 1.创建一个服务端的套接字
		ServerSocket serverSocket = new ServerSocket(999);

		//2.等待客户端的连接
		Socket socket = serverSocket.accept();

		// 3.获取socket通道的输入流(输入流的读取方式为一行一行的读取方式 ----> readLine())
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

		// 4.获取通道的输入流(也是一行一行的写出  BufferedWriter ->newLine())
        // 当用户点击“发送”按钮的时候才会,写出数据
		bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		String line = null;
		while((line = br.readLine()) !=null){
			// 将读取的数据拼接到文本域中显示
			jta.append(line + "\n");
		}

		
		// 5.关闭socket通道
		serverSocket.close();
        
		}catch(IOException e){
			e.printStackTrace();
		}

		/************************/


	}
	// 点击按钮所实现的方法
	public void actionPerformed(ActionEvent e){
		useVoid();
	}

	public void useVoid(){
		// 1.获取文本框中的内容
		String text = jtf.getText();
		text = "服务端对客户端说:" + text;
		// 自己显示
		jta.append(text + "\n");
		// 2.发送
		try{
			// 4.发送
			bw.write(text);
			bw.newLine(); // 换行 
			bw.flush();  // 刷新
			// 5.清空文本框
			jtf.setText("");
		}catch (IOException e1){
			e1.printStackTrace();
		}
	}

    
	/*public void KeyPressed(KeyEvent e){
		//回车键
		System.out.println("按钮数字");
	}
	
	public void KeyTyped(KeyEvent e){
	}
    
	public void KeyReleased(KeyEvent e){
	}*/
	//行为
}

客户端

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class QqFu extends JFrame implements ActionListener{
	public static void main(String[] args){
		new QqFu();	
	}
	// 说明:一个类需要页面的显示,则那个类要继承JFrame。
	// 属性
	// 文本域
	private JTextArea jta;
	// 滚动条
	private JScrollPane jsp;
	// 面板里面是文本框和按钮
	private JPanel jp;
	private JTextField jtf;
	private JButton jb ;

	BufferedWriter bw = null;
    
	// 构造器
	public QqFu(){
		
		// 初始化上面的属性
		jta = new JTextArea();
		
		// 将文本域添加到滚动条中
		jsp = new JScrollPane(jta);
		jp = new JPanel();
		jtf =new JTextField(15);
		jb = new JButton("发送");

		// 把按钮和文本框添加到面板中
        jp.add(jtf);
		jp.add(jb);

		// 把滚动条和面板添加到JFrame中去
		this.add(jsp,BorderLayout.CENTER); //这个设置在中间
		this.add(jp,BorderLayout.SOUTH); //南

		this.setTitle("远程聊天 客户端");
		this.setSize(500,500);
		this.setLocation(200, 200);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        jb.addActionListener(this);

		// 回车点击事件

		jtf.addKeyListener(new KeyAdapter() {
	        public void keyTyped(KeyEvent e) {
		     if((char)e.getKeyChar()==KeyEvent.VK_ENTER) {
                 useVoid01();			 
		     }
	       }
        });



        try{
		/*******客户端 TCP协议*********/
		// 1.创建一个客户端的套接字(尝试连接)
		Socket socket = new Socket("127.0.0.1",999);

		// 2.获取socket通道的输入流
		BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		// 3
        bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

		String line = null;
		while((line = br.readLine()) !=null){
			jta.append(line + "\n");
		}
		// 3. 获取输出流

		// 4.关闭流
		socket.close();

		/******************************/
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public void actionPerformed(ActionEvent e){
		useVoid01();
	}
	
	public void useVoid01(){
		// 1.获取文本框中需要发送的内容
		String text = jtf.getText();
		// 2. 拼接内容
		text = "客户端对服务端说:" + text;
		// 3.自己显示
		jta.append(text + "\n");
		try{
		// 4.发送
			bw.write(text);
			bw.newLine(); // 换行 
			bw.flush();  // 刷新
		// 5.清空
		    jtf.setText("");

		}catch(IOException e1){
			e1.printStackTrace();
		}
	}
	//行为
}

由于受到局域网的限制,两台电脑只能在一个WiFi下通信

在这里插入图片描述

代码来源:Java网络编程,一对一聊天

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

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

相关文章

CentOS7 安装远程桌面

换源 设置镜像源为清华源: sudo sed -e s|^mirrorlist|#mirrorlist|g \-e s|^#baseurlhttp://mirror.centos.org/centos|baseurlhttps://mirrors.tuna.tsinghua.edu.cn/centos|g \-i.bak \/etc/yum.repos.d/CentOS-*.repo详见 https://mirrors.tuna.tsinghua.edu.…

【无标题】echarts pieChart legend 图例文字颜色与图例一致

先看成图效果 首先是封装一个公用的函数 const renderPieEcharts (ele: HTMLDivElement,data: Record<string, any>[],color: string[],titleText: string, ) > {const legendData data.map((item, i) > ({name: item.name,textStyle: {color: color[i],},}))co…

【python】python将json字符串导出excel | pandas处理json字符串保存为csv

如何将json转为csv 1、通过json直接转为csv 在Python中&#xff0c;你可以使用pandas库来处理DataFrame&#xff08;数据帧&#xff09;和将JSON数据转换为CSV格式。下面是一个简单的示例代码&#xff0c;展示了如何使用pandas库将JSON数据转换为CSV文件&#xff1a; import p…

前段汇总之JS实现数据双向绑定

参考vue的关键字&#xff1a;v-model绑定值&#xff0c;{{}}&#xff0c;显示值 目录 简单实现双向绑定 使用Proxy优化双向绑定 动态更新值 简单实现双向绑定 新建html5模板&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta char…

Linux 文件编辑命令

一、三种模式介绍 命令模式 插入模式(编辑模式) 末行模式 二、模式切换 1.命令模式切换到插入模式 &#xff08;1&#xff09; a //进入到当前光标后开始编辑 &#xff08;2&#xff09; A //进入到当前光标所在行的行末开始编辑 &#xff08;3&#xff09;i //进入当前光…

P450进阶款无人机室内定位功能研测

在以往的Prometheus 450&#xff08;P450&#xff09;无人机上&#xff0c;我们搭载的是Intel Realsense T265定位模块&#xff0c;使用USB连接方式挂载到机载计算机allspark上&#xff0c;通过机载上SDK驱动T265运行并输出SLAM信息&#xff0c;以此来实现室内定位功能。 为进…

Grafana+Prometheus技术文档-进阶使用-监控spring-boot项目

阿丹&#xff1a; 之前已经实现了使用Prometheus来对服务器进行了监控和仪表盘的创建&#xff0c;现在就需要对这些监控方法使用在spring-boot中去。 实现思路&#xff1a; 1、集成Actuator 2、加入Prometheus的依赖 3、配置开放端口、以及开放监控 4、配置Prometheus中的配置…

Talk | ICCV‘23清华大学刘世隆:From Detection to Grounding-迈向更强的开集目标检测

本期为TechBeat人工智能社区第521期线上Talk&#xff01; 北京时间8月10日(周四)20:00&#xff0c;清华大学博士生—刘世隆的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “From Detection to Grounding-迈向更强的开集目标检测”&#xff0c;他分…

法规标准-ISO 17386标准解读(2010版)

ISO 17386是做什么的&#xff1f; ISO 17386全名为交通信息和控制系统-低速运行操纵辅助装置(MALSO)性能要求和试验程序&#xff0c;其中主要描述了低速运行操纵辅助装置的功能要求及试验方法 类别 低速运行操纵辅助装置根据其覆盖不同监测范围的能力进行分类。每个监测范围…

使用雅可比行列式方法求Henon映射的lyapunov exponent

雅可比行列式方法 计算Henon映射的Lyapunov exponent图谱,算法描述为: 0:初始化:初始化用到的值。参数a:[0,1.4],b:0.3,初始值x和y:1,迭代次数M:2000。 1:遍历参数a:计算不同a值所对应的Henon映射的Lyapunov exponent图谱。 2:迭代M次: 计算得到Henon映射的…

苍穹外卖系统07

哈喽&#xff01;大家好&#xff0c;我是旷世奇才李先生 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff0c;回复【项目】获取我为大家准备的项目 最近打算把我手里之前做的项目分享给大家&#…

【kubectl详解】

目录 一、陈述式资源管理方法二、基本信息查看1、查看 master 节点状态2、查看命名空间3、查看命名空间的所有资源4、创建命名空间app5、删除命名空间app6、在命名空间kube-public 创建副本控制器&#xff08;deployment&#xff09;来启动Pod&#xff08;nginx-dz&#xff09;…

用MariaDB创建数据库,SQL练习,MarialDB安装和使用

前言&#xff1a;MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。在存储引擎方面&#xff0c;使用XtraDB来代替MySQ…

【Java 集合框架API接口】Collection,List,Set,Map,Queue,Deque

博主&#xff1a;_LJaXi Or 東方幻想郷 专栏&#xff1a; Java | 从跨行业到跨平台 开发工具&#xff1a;IntelliJ IDEA 2021.1.3 Java集合框架 API接口 Collection接口List接口Set接口Map接口Queue接口Deque接口 Java集合API提供了一组功能强大的数据结构和算法, 具有以下作用…

React - useEffect函数的理解和使用

文章目录 一&#xff0c;useEffect描述二&#xff0c;它的执行时机三&#xff0c;useEffect分情况使用1&#xff0c;不写第二个参数 说明监测所有state&#xff0c;其中一个变化就会触发此函数2&#xff0c;第二个参数如果是[]空数组&#xff0c;说明谁也不监测3&#xff0c;第…

外贸路上那些哭笑不得的事情

前几天一个老顾客在软件上联系&#xff0c;说自己上次的订货体验很满意&#xff0c;货物的质量很好&#xff0c;而且服务和回复也很及时&#xff0c; 比起他之前的供货商要好很多&#xff0c;他之前的供货商虽然货物的质量也很好&#xff0c;但是每次询问问题都是要等好久才给…

C++内存管理(new与delete)

这篇文章的主要内容是new与delete的由来&#xff0c;使用new与delete对C堆内存进行管理&#xff0c;(malloc、free)与(new、delete)的区别。希望对C爱好者有所帮助&#xff0c;内容充实且干货&#xff0c;点赞收藏防止找不到&#xff01; 更多C优质内容跳转&#xff1a; 重生之…

问道管理:短线买入点看哪个指标?

在股市投资中&#xff0c;挑选适宜的买入点是至关重要的。短线投资者常常经过技能剖析来确认买入和卖出的时机。技能剖析中有许多目标可供挑选&#xff0c;但怎么挑选适合短线交易的买入点成为一个关键问题。本文将从多个视点剖析&#xff0c;讨论针对短线交易&#xff0c;应该…

C#/.NET/.NET Core优秀项目和框架每周精选开篇

前言 注意&#xff1a;排名不分先后&#xff0c;都是十分优秀的开源项目和框架&#xff0c;每周定期更新分享。 每周精选优秀的C#/.NET/.NET Core项目和框架&#xff0c;帮助开发者发现功能强大、性能优越、创新前沿、简单易用的项目和框架。无论你是寻找灵感、学习新技术、改进…

Redis复制

在Redis中&#xff0c;用户可以通过执行SLAVEOF命令或者设置slaveof选项&#xff0c;让一个服务器去复制(replicate) 另一个服务器&#xff0c;我们称呼被复制的服务器为主服务器(master)&#xff0c;而对主服务器进行复制的服务器则被称为从服务器(slave)&#xff0c;如下图所…