Java作业四

要求:编写带图形界面的聊天程序,实现让客户可以持续地发送消息给服务器,服务器也可以即时看到客户端发送的消息,并回消息给客户端。 程序运行界面如下:

老师写的:

 1、客户端

package Demo02;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;

//客户端程序
public class MyClient extends JFrame implements ActionListener {
	JButton jb;
	JTextArea jta;
	JTextField jtf;
	JPanel jp;
	Socket socket;
	DataOutputStream out;
	DataInputStream in;

	public MyClient() {
		jta = new JTextArea();
		jtf = new JTextField(15);
		jb = new JButton("发送");
		jp = new JPanel();

		jp.add(jtf);
		jp.add(jb);

		JScrollPane jsp = new JScrollPane(jta);
		this.add(jsp, BorderLayout.CENTER);
		this.add(jp, BorderLayout.SOUTH);

		jb.addActionListener(this);
		jtf.addActionListener(this);

		// 展现
		this.setTitle("客户端");
		this.setSize(300, 200);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);

		try {
			// 建立连接
			socket = new Socket("127.0.0.1", 9000);
			out = new DataOutputStream(socket.getOutputStream());
			in = new DataInputStream(socket.getInputStream());

			while (true) {
				// 接受服务器发送数据
				String str = in.readUTF();
				// 显示在多行文本框
				jta.append("服务器说:" + str + "\r\n");
			}

		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new MyClient();
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == jb || e.getSource() == jtf) {
			// 向服务器发送数据
			try {
				out.writeUTF(jtf.getText());
			} catch (IOException e1) {
				e1.printStackTrace();
			}

			// 显示在多行文本框
			jta.append("客户端说:" + jtf.getText() + "\r\n");
			// 清空单行文本框
			jtf.setText("");
		}
	}
}

2、服务器

package Demo02;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class MyServer extends JFrame implements ActionListener {
	JTextArea jta;
	JTextField jtf;
	JButton jb;
	JPanel jp;
	ServerSocket ss;
	Socket socket;
	DataOutputStream out;
	DataInputStream in;

	public MyServer() {
		jta = new JTextArea();
		jtf = new JTextField(15);
		jb = new JButton("发送");
		jp = new JPanel();

		jp.add(jtf);
		jp.add(jb);

		JScrollPane jsp = new JScrollPane(jta);
		this.add(jsp, BorderLayout.CENTER);
		this.add(jp, BorderLayout.SOUTH);

		jb.addActionListener(this);
		jtf.addActionListener(this);

		// 展现
		this.setTitle("服务器");
		this.setSize(300, 200);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);

		// 开放端口
		try {
			ss = new ServerSocket(9000);
			System.out.println("等待连接");
			socket = ss.accept();
			System.out.println("已连接");

			out = new DataOutputStream(socket.getOutputStream());
			in = new DataInputStream(socket.getInputStream());
			while (true) {
				// 接受客户端发送数据
				String str = in.readUTF();
				// 显示多行文本框中
				jta.append("客户端说:" + str + "\r\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		new MyServer();
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == jb || e.getSource() == jtf) {
			// 向客户端发送数据
			try {
				out.writeUTF(jtf.getText());
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			// 向多行文本框输入历史聊天记录信息
			jta.append("服务器说:" + jtf.getText() + "\r\n");
			// 清空单行文本框内容
			jtf.setText("");

		}
	}
}

我写的:

1、客户端

package Demo01;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
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 Clinet implements ActionListener {
	JFrame jf;
	JScrollPane jp;
	JTextArea ta;
	JPanel panel;
	JTextField text;
	JButton but;
	String s;
	BufferedReader br;
	PrintStream ps;
	
	Clinet() throws IOException {
		// 实例化
		jf = new JFrame("客户端");
		jf.setLayout(new BorderLayout());
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panel = new JPanel();
		ta = new JTextArea();
		jp = new JScrollPane(ta);
		text = new JTextField(15);
		but = new JButton("发送");

		// 窗体加入组件
		jf.add(jp, BorderLayout.CENTER);
		panel.add(text);
		panel.add(but);
		jf.add(panel, BorderLayout.PAGE_END);
		jf.setBounds(0, 0, 400, 200);
		jf.setVisible(true);

		// 事件处理
		but.addActionListener(this);
		text.addActionListener(this);

		Socket socket = new Socket("127.0.0.1", 8888);

		InputStream is = socket.getInputStream();
		OutputStream io = socket.getOutputStream();

		br = new BufferedReader(new InputStreamReader(is));
		ps = new PrintStream(io);

		while (true) {
			

			String line = br.readLine();
			ta.append("服务器说:" + line + "\n");
			// System.out.println("服务器说:" + line);
		}
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == but || e.getSource() == text) {
			s = text.getText();
			ps.println(s);
			ta.append("客户端说:" + s + "\n");
			// System.out.println("客户端说:" + s);
			text.setText("");
		}
	}

	public static void main(String[] args) throws IOException {
		new Clinet();
	}

}

2、服务器

package Demo01;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
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 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 Server implements ActionListener {
	JFrame jf;
	JScrollPane jp;
	JTextArea ta;
	JPanel panel;
	JTextField text;
	JButton but;
	String s;
	BufferedReader br;
	PrintStream ps;

	Server() throws IOException {
		// 实例化
		jf = new JFrame("服务器");
		jf.setLayout(new BorderLayout());
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panel = new JPanel();

		ta = new JTextArea();
		jp = new JScrollPane(ta);
		text = new JTextField(15);
		but = new JButton("发送");

		// 窗体加入组件
		jf.add(jp, BorderLayout.CENTER);
		panel.add(text);
		panel.add(but);
		jf.add(panel, BorderLayout.PAGE_END);
		jf.setBounds(0, 0, 400, 200);
		jf.setVisible(true);

		// 事件处理
		but.addActionListener(this);
		text.addActionListener(this);

		ServerSocket server = new ServerSocket(8888);

		Socket socket = server.accept();

		InputStream is = socket.getInputStream();
		OutputStream io = socket.getOutputStream();

		br = new BufferedReader(new InputStreamReader(is));
		ps = new PrintStream(io);

		while (true) {
				String line = br.readLine();
				ta.append("客户端说:" + line + "\n");
				// System.out.println("客户端说:" + line);
		}
	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == but || e.getSource() == text) {
			s = text.getText();
			ps.println(s);
			ta.append("服务器说:" + s + "\n");
			// System.out.println("服务器说:" + s);
			text.setText("");
		}
	}

	public static void main(String[] args) throws IOException {
		new Server();
	}

}

成果展示

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

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

相关文章

Redis面试题:Redis的数据过期策略有哪些?

目录 面试官:Redis的数据过期策略有哪些 ? 惰性删除 定期删除 面试官:Redis的数据过期策略有哪些 ? 候选人: 嗯~,在redis中提供了两种数据过期删除策略 第一种是惰性删除,在设置该key过期时间后,我们…

避免客户开发信被限制的方法与策略

开发信是外贸或者出海企业常用的一种开发客户的方式。相较于其他的获客方式,开发信能够更加精准地投放到客户中,并且只需承担较低的成本。但是,由于一些限制管制要求,外贸人员可能会遇到开发新被限制的情况。今天,小编…

五大自动化测试的 Python 框架

1、Selenium: Selenium 是一个广泛使用的自动化测试框架,用于测试Web应用程序。它支持多种浏览器,并通过模拟用户在浏览器中的操作来进行测试。Selenium 的 Python 客户端库是 Selenium WebDriver,它提供了一组API来编写测试脚本&#xff0c…

SpringBoot校验List失效解决方法

文章目录 SpringBoot校验List失效解决方法附:校验基本数据类型和String类型的方法参数时也需要在类上加Validated SpringBoot校验List失效解决方法 失效场景示例代码: RestController RequestMapping("/v1/jx/flowSummary") Slf4j public cl…

【Hadoop】分布式文件系统 HDFS

目录 一、介绍二、HDFS设计原理2.1 HDFS 架构2.2 数据复制复制的实现原理 三、HDFS的特点四、图解HDFS存储原理1. 写过程2. 读过程3. HDFS故障类型和其检测方法故障类型和其检测方法读写故障的处理DataNode 故障处理副本布局策略 一、介绍 HDFS (Hadoop Distribute…

itop4412移植lrzsz工具踩坑笔记

4412开发板在传输文件一直用的都是tftp文件传输,但这样效率有点慢,平常在linux上习惯用lrzsz工具来传输文件,特此记录下,因为不熟悉linux编译 踩坑了很多地方 在操作前 我们的虚拟机要线安装好编译环境 下载lrzsz源码&#xff0…

轻松实现文件按数量平均分类,高效整理并自动新建文件夹保存“

你是否曾经因为文件数量过多,整理起来繁琐而感到烦恼?是否曾经为了新建文件夹而手动一个一个进行创建,费时又费力?现在,我们的智能文件管理工具将为你解决这些问题! 首先第一步,我们要进入文件…

整顿国产剧流水线“村花”?给三次元一点小小的美女震撼!

演员部分不符合角色的形象就用配角来补充说明,在国产剧里,短时间出现了两次。 演员的美从直观的肉眼可见,变成了配角用台词传达的结果。 (图:宁安如梦) 就像《以爱为营》里,女主的闺蜜随口就是…

【李宏毅-元学习】

一、基本概念 1、元学习:学习如何学习,超参数调整 2、机器学习和元学习 机器学习:定义函数(未知参数)-定义损失函数-优化(最小化损失函数) 3、什么是元学习 机器学习通过三个步骤找到了学习算…

Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式

By: Ailson Jack Date: 2023.11.26 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/165.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…

数据库基础教程之数据库的创建(二)

双击打开Navicat,点击:文件-》新建连接-》PostgreSQL 在下图新建连接中输入各参数,然后点击:连接测试,连接成功后再点击确定。 创建数据表   3.1 方法1   3.1.1.双击你的数据库-》双击public-》双击选中表-》右键-》新建表-》常规 3.1.2.设置字段信息   双击选中创建…

Leetcode 1727. 具有重排的最大子矩阵

题目要求: 给定一个大小为 m x n 的二进制矩阵,并且允许您以任意顺序重新排列矩阵的列。 对列进行最佳重新排序后,返回矩阵中每个元素都为 1 的最大子矩阵的面积。 输入:矩阵 [[0,0,1],[1,1,1],[1,0,1]] 输出:4 说明…

【领域驱动设计 学习目标及大纲】从CRUD到架构设计

从2018年至今,已工作了5年有余,回望这5年的工作历程,虽然一直在学习、一直在积累,但其实都在术的层面上停留,也就是具体的技术点。这5年多的时间里其实也不是没有窥道的想法: 一次是2018年刚工作的时候&am…

理解国外大佬用Web做出来跨窗口渲染动画效果

今天刷抖音看见国外一个大佬用Web做出来一个可以跨多浏览器窗口实时互动的渲染动画效果,觉得非常新奇,我就去看了一下源码,作者还写了一个非常好的例子帮助理解,我自己也仿写了作者的例子加深理解 **GitHub预览地址**麻烦帮忙点亮星星谢谢哈哈哈~ 整体思路是监听visibilityStat…

hdlbits系列verilog解答(exams/m2014_q4f)-47

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路: 二、verilog源码 module top_module (input in1,input in2,output out);assign out in1 & (~in2);endmodule三、仿真结果 转载请注明出处!

java Swing UI设置统一字体大小

编写一个遍历组件设置字体大小的方法 public static void setUIFont() {Font f new Font("宋体", Font.PLAIN, 18);String names[] {"Label", "CheckBox", "PopupMenu", "MenuItem", "CheckBoxMenuItem", &quo…

函数的防抖与节流

一、函数防抖 (一)防抖的理解 防抖就是将所有的触发都取消,在规定的时间结束过后才会执行最后一次,也就是说连续快速的触发只会执行最后一次结果。 也可以理解为游戏里的回城按钮,每点一下就会重新刷新回城进度&…

java学习part13Object类和常用方法

1.Object 2.常用方法 2.1clone() clone()就是深拷贝,创建一个同内容新对象。需要实现接口 2.2finalize()已废弃 类似于析构函数,在GC回收之前调用。 System.gc()强制调用gc,然后就能看到finalize()的输出 2.3equals() 对于引用类型可用。…

WIFI模块(esp-01s)获取网络时间与天气信息

目录 一、硬件连接 二、获取网络时间 1、AT指令集 2、具体操作 三、获取天气信息 1、心知天气注册 2、AT指令集 3、具体操作 4、json格式检查 一、硬件连接 WiFi模块的RX连接TTL模块的TX, WiFi模块的TX连接TTL模块的RX,电源与地接对。 插入电脑…

文心一言 VS 讯飞星火 VS chatgpt (143)-- 算法导论12.1 3题

三、用go语言,设计一个执行中序遍历的非递归算法。(提示:一种容易的方法是使用栈作为辅助数据结构;另一种较复杂但比较简洁的做法是不使用栈,但要假设能测试两个指针是否相等。) 文心一言,代码正常运行: …