GDPU Java 天码行空13

news2024/11/8 18:11:10

(一)实验目的

1、掌握JAVA中与网络程序开发相关的知识点;
2、理解并掌握网络编程开发思想及方法;
3、熟悉项目开发的分包方法和依据;
4、实现聊天室中客服端和服务器端的实现方法;
5、熟悉多线程程序开发方法;
6、完善界面设计。

(二)实验内容和步骤

1、完成聊天程序的服务器端和客服端的界面设计;
2、完成优化聊天程序的服务器端多线程编码;
3、完成与优化聊天程序的客服端编码。

👨‍🏫 参考视频教程
👨‍🏫 代码参考 pxj 佬

💖 ServerChatOnline.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerChatOnline extends JFrame implements ActionListener
{
	private JTextArea jta;
	private JScrollPane jsp;
	private JPanel Jp;
	private JTextField jtf;
	private JButton jb;
	private BufferedWriter bw;

	private void create_windows()
	{
		jta = new JTextArea();
		// 编辑文本区域不可编辑
		jta.setEditable(false);
		// 将文本域丢到滑动条中
		jsp = new JScrollPane(jta);
		Jp = new JPanel();
		jtf = new JTextField(10);
		jb = new JButton("发送");

		Jp.add(jtf);
		Jp.add(jb);
		this.add(jsp, BorderLayout.CENTER);
		this.add(Jp, BorderLayout.SOUTH);
		this.setTitle("聊天室-服务器");
		this.setSize(300, 300);
		this.setLocation(300, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jta = new JTextArea();
		// 编辑文本区域不可编辑
		jta.setEditable(false);
		// 将文本域丢到滑动条中
		jsp = new JScrollPane(jta);
		Jp = new JPanel();
		jtf = new JTextField(10);
		jtf.addKeyListener(new KeyAdapter()
		{
			@Override
			public void keyPressed(KeyEvent e)
			{
				if (e.getKeyCode() == 10)
				{
					String text = jtf.getText();
					text = "s:" + text;
					jta.append(text + "\n");
					try
					{
						bw.write(text);
						bw.newLine();
						bw.flush();
						jtf.setText("");
					} catch (IOException ex)
					{
						ex.printStackTrace();
					}
				}
			}
		});
		jb = new JButton("发送");
		jb.addActionListener(this);
		Jp.add(jtf);
		Jp.add(jb);
		this.add(jsp, BorderLayout.CENTER);
		this.add(Jp, BorderLayout.SOUTH);
		this.setTitle("聊天室-服务器");
		this.setSize(300, 300);
		this.setLocation(300, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	private void work()
	{
		try
		{
			// 创建服务端套接字
			ServerSocket serverSocket = new ServerSocket(10086);
			// 等待链接
			Socket socket = serverSocket.accept();
			// 获取socket输入流
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			// 获取socket输出流
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			String line = null;
			// 循环读取数据,将其拼接到文本域中
			while ((line = br.readLine()) != null)
			{
				// 将传来的数据在文本域中显示出来
				jta.append(line + System.lineSeparator());
			}
			// 关闭socket
			serverSocket.close();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	public ServerChatOnline()
	{
		create_windows();
		work();
	}

	@Override
	public void actionPerformed(ActionEvent e)
	{
		String text = jtf.getText();
		text = "s:" + text;
		jta.append(text + "\n");
		try
		{
			bw.write(text);
			bw.newLine();
			bw.flush();
			jtf.setText("");
		} catch (IOException ex)
		{
			ex.printStackTrace();
		}
	}
}

💖 ServerChatOnline.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerChatOnline extends JFrame implements ActionListener
{
	private JTextArea jta;
	private JScrollPane jsp;
	private JPanel Jp;
	private JTextField jtf;
	private JButton jb;
	private BufferedWriter bw;

	private void create_windows()
	{
		jta = new JTextArea();
		// 编辑文本区域不可编辑
		jta.setEditable(false);
		// 将文本域丢到滑动条中
		jsp = new JScrollPane(jta);
		Jp = new JPanel();
		jtf = new JTextField(10);
		jb = new JButton("发送");

		Jp.add(jtf);
		Jp.add(jb);
		this.add(jsp, BorderLayout.CENTER);
		this.add(Jp, BorderLayout.SOUTH);
		this.setTitle("聊天室-服务器");
		this.setSize(300, 300);
		this.setLocation(300, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jta = new JTextArea();
		// 编辑文本区域不可编辑
		jta.setEditable(false);
		// 将文本域丢到滑动条中
		jsp = new JScrollPane(jta);
		Jp = new JPanel();
		jtf = new JTextField(10);
		jtf.addKeyListener(new KeyAdapter()
		{
			@Override
			public void keyPressed(KeyEvent e)
			{
				if (e.getKeyCode() == 10)
				{
					String text = jtf.getText();
					text = "s:" + text;
					jta.append(text + "\n");
					try
					{
						bw.write(text);
						bw.newLine();
						bw.flush();
						jtf.setText("");
					} catch (IOException ex)
					{
						ex.printStackTrace();
					}
				}
			}
		});
		jb = new JButton("发送");
		jb.addActionListener(this);
		Jp.add(jtf);
		Jp.add(jb);
		this.add(jsp, BorderLayout.CENTER);
		this.add(Jp, BorderLayout.SOUTH);
		this.setTitle("聊天室-服务器");
		this.setSize(300, 300);
		this.setLocation(300, 300);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
	}

	private void work()
	{
		try
		{
			// 创建服务端套接字
			ServerSocket serverSocket = new ServerSocket(10086);
			// 等待链接
			Socket socket = serverSocket.accept();
			// 获取socket输入流
			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			// 获取socket输出流
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			String line = null;
			// 循环读取数据,将其拼接到文本域中
			while ((line = br.readLine()) != null)
			{
				// 将传来的数据在文本域中显示出来
				jta.append(line + System.lineSeparator());
			}
			// 关闭socket
			serverSocket.close();
		} catch (IOException e)
		{
			e.printStackTrace();
		}
	}

	public ServerChatOnline()
	{
		create_windows();
		work();
	}

	@Override
	public void actionPerformed(ActionEvent e)
	{
		String text = jtf.getText();
		text = "s:" + text;
		jta.append(text + "\n");
		try
		{
			bw.write(text);
			bw.newLine();
			bw.flush();
			jtf.setText("");
		} catch (IOException ex)
		{
			ex.printStackTrace();
		}
	}
}

💖 ChatOnlineDemo.java

public class ChatOnlineDemo
{
	public static void main(String[] args)
	{
		new Thread(new Thread1()).start();
		new Thread(new Thread2()).start();
	}
}

class Thread1 implements Runnable
{
	@Override
	public synchronized void run()
	{
		ServerChatOnline S = new ServerChatOnline();
	}
}

class Thread2 implements Runnable
{
	@Override
	public synchronized void run()
	{
		ClientChatOnline C = new ClientChatOnline();
	}
}

🏆 运行结果

在这里插入图片描述

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

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

相关文章

第五届武汉纺织大学ACM程序设计竞赛 个人题解(待补完)

前言: 上周周日教练要求打的一场重现赛,时长五个小时,题目难度还行,除了部分题目前我还写不出来之外,大部分题都写完或补完了,这边给出比赛链接和我的代码(有些是队友的)和题解。 正…

工作中有哪些超级好用的C/C++程序库?

视频和讲义发布在这里: B站链接

Spring框架温习

Spring Spring是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。 Spring 特点: 轻量级、控制反转、面向切面、容器、框架集合 Spring 核心组件: Spring 常用模块&…

Leecode热题100---二分查找--4:寻找两个正序数组的中位数

题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解法1、暴力解法(归并) 思路: 合并 nums1,nums2 为第三个数组 排序第三个数…

亚马逊VC账号产品热销,在美国哪些智能小家电产品最好卖?

亚马逊VC账号产品在美国市场的热销,反映了消费者对于特定智能小家电产品的强烈需求。智能小家电产品因其实用性、便捷性和科技感,近年来在美国市场备受追捧。 以下是一些在亚马逊VC账号上热销的智能小家电产品: 智能扫地机器人 这类产品在美…

【传知代码】自监督高效图像去噪(论文复现)

前言:在数字化时代,图像已成为我们生活、工作和学习的重要组成部分。然而,随着图像获取方式的多样化,图像质量问题也逐渐凸显出来。噪声,作为影响图像质量的关键因素之一,不仅会降低图像的视觉效果&#xf…

STM32读写内部FLASH读取芯片id

文章目录 读写内部Flash接线程序编写测试效果补充 读取芯片id代码编写 读写内部Flash 接线 程序编写 首先使用ThisFlash.c来写入flash的基本操作,写入、读取、擦除,然后使用Store.c配合数组来进行主存与flash的交互 ThisFlash.c #include "stm32…

Spring Cloud Gateway 集成 Nacos、Knife4j

目录 1、gateway网关配置1.1 pom 配置2.2 配置文件1.3 yaml 配置 2、其他服务配置2.1 pom 配置2.2 配置文件2.3 yaml 配置 3、界面访问4、其他 官方文档地址:Spring Cloud Gateway集成Knife4j 官方完整源码:https://gitee.com/xiaoym/swagger-bootstrap-…

Redis篇 哈希表在redis中的命令

哈希命令 一.哈希表的基本认识二. 哈希表在redis中的命令1.hset,hget2.hdel3.hkeys,hvals4.hexists5.hgetall6.hmget7.hlen8.hincrby和hincrbyfloat 一.哈希表的基本认识 在JAVA数据结构中,我们就已经接触到了哈希表, 在当时,我们主要用到的哈…

第16章-超声波跟随功能 基于STM32的三路超声波自动跟随小车 毕业设计 课程设计

第16章-超声波跟随功能 无PID跟随功能 //超声波跟随if(HC_SR04_Read() > 25){motorForward();//前进HAL_Delay(100);}if(HC_SR04_Read() < 20){motorBackward();//后退HAL_Delay(100);}PID跟随功能 在pid.c中定义一组PID参数 tPid pidFollow; //定距离跟随PIDpidFol…

CISP难度将加大?还考不考啊...

最新消息&#xff1a;CISP即将调整知识体系大纲&#xff0c;更新题库&#xff0c;后续考试难度加大。 最近几年&#xff0c;CISP改版地比较频繁&#xff0c;难度也在不断上升&#xff0c;因此各位小伙伴有考CISP想法的尽早考。 随着《网络安全法》、《网络空间安全战略》、《…

牛客NC324 下一个更大的数(三)【中等 双指针 Java/Go/PHP/C++】参考lintcode 52 · 下一个排列

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/475da0d4e37a481bacf9a09b5a059199 思路 第一步&#xff1a;获取数字上每一个数&#xff0c;组成数组arr 第二步&#xff1a;利用“下一个排列” 问题解题方法来继续作答&#xff0c;步骤&#xff1a;利用lintc…

oracle12.1 rac 静默dbca教程(百分之百创建成功)

修改原响应文件 [oracleprimary1 database]$ cd response/ [oracleprimary1 response]$ ls dbca.rsp db_install.rsp netca.rsp [oracleprimary1 response]$ vi dbca.rsp 默认即可 数据库类型内存占比按需选择 运行静默创建实例脚本 [oracleprimary1 response]$ dbca -silen…

虚拟机改IP地址

使用场景&#xff1a;当你从另一台电脑复制一个VMware虚拟机过来&#xff0c;就是遇到一个问题&#xff0c;虚拟的IP地址不一样&#xff08;比如&#xff0c;一个是192.168.1.3&#xff0c;另一个是192.168.2.4&#xff0c;由于‘1’和‘2’不同&#xff0c;不是同一网段&#…

探索自动发邮件的奥秘:从配置到实现

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;邮件自动化的魅力 二、配置环境&#xff1a;选择适合的SMTP服务器 示…

【C++】模拟实现string类

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f38f;构建成员变量 &#x1f38f;实现string类默认成员函数 &#x1f4cc;构造函数 &#x1f4cc;析构函数…

React热更新异常

问题现象 本地一个react项目&#xff0c;当修改任意内容保存时本地编译会失败报错 解决方案 将dependencies中的react-scripts移至devDependencies中

Kafka原生API使用Java代码-生产者-分区策略-默认分区策略轮询分区策略

文章目录 1、代码演示1.1、pom.xml1.2、KafkaProducerPartitioningStrategy.java1.2.1、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况&#xff0c;不轮询1.2.2、ProducerConfig.LINGER_MS_CONFIG取 0 值得情况&#xff0c;轮询1.2.3、ProducerConfig.LINGER_MS_CONFIG取 1000…

英语学习笔记29——Come in, Amy!

Come in, Amy! 进来&#xff0c;艾米&#xff01; shut v. 关严 区别&#xff1a;shut the door 把门关紧 口语&#xff1a;Shut up! 闭嘴&#xff01;    态度强硬&#xff0c;不礼貌 例句&#xff1a;请不要把门关严。    Don’t shut the door, please. bedroom n. …

Android Studio无法改变Button背景颜色解决办法

大家好&#xff0c;我是咕噜铁蛋&#xff01;今天我来和大家探讨一个在Android开发中常见但可能让初学者感到困惑的问题——如何在Android Studio中改变Button的背景颜色。这个问题看似简单&#xff0c;但实际操作中可能会遇到一些意想不到的挑战。接下来&#xff0c;我将从多个…