Java作业四

news2024/11/28 0:33:43

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

老师写的:

 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();
	}

}

成果展示

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

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

相关文章

VM虚拟机中Ubuntu14.04安装VM tools后仍不能全屏显示

1、查看Ubuntu所支持的分辨率大小。 在终端处输入: xrandr,回车 2、输入你想设置的分辨率参数。 我设置的为1360x768,大家可以根据自己的具体设备设置。 在终端输入:xrandr -s 1360x768 注意:这里1360后边是字母 x 且…

C语言-内存函数详解

文章目录 1. memcpy使用和模拟实现2. memmove使用和模拟实现3. memset函数的使用4. memcmp函数的使用 1. memcpy使用和模拟实现 返回类型和参数: void * memcpy ( void * destination, const void * source, size_t num );1.函数memcpy从source的位置开始向后复制…

电子学会C/C++编程等级考试2023年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字字符求和 请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。 时间限制:1000 内存限制:65536输入 一行字符串,长度不超过100,字符串中不含空格。输出 字符串中所有数字字符作为数…

【Mybatis】预编译/即时sql 数据库连接池

回顾 Mybatis是一个持久层框架.有两种方式(这两种方式可以共存) 1.注解 2.xml 一.传递参数 以使用#{} 来接受参数为例 (以上两种方式一样适用的) 1)传递单个参数 #{} 可以为任意名称 2)多个参数 默认的参数名称就是接口方法声明的形参 3)参数为对象 默认给每个对象的每个属性都…

探索 Linux vim/vi 编辑器:介绍、模式以及基本操作演示

💐作者:insist-- 💐个人主页:insist-- 的个人主页 理想主义的花,最终会盛开在浪漫主义的土壤里,我们的热情永远不会熄灭,在现实平凡中,我们终将上岸,阳光万里 ❤️欢迎点…

笔记(三)maxflow push relabel与图像分割

笔记(三)maxflow push relabel与图像分割 1. Push-Relabel算法思想2.Push-Relabel算法原理示意图3.Push-Relabel算法具体实例4. push relabel与图割 1. Push-Relabel算法思想 对于一个网络流图: 该算法直观可以这样理解,先在源节点处加入充足…

2018年1月22日 Go生态洞察:Hello, 中国!

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Java毕业设计 SpringBoot 车辆充电桩系统

Java毕业设计 SpringBoot 车辆充电桩系统 SpringBoot 车辆充电桩系统 功能介绍 首页 图片轮播 登录注册 充电桩展示 搜索充电桩 充电桩报修 充电常识 个人中心 我的收藏 后台管理 登录 首页 个人中心 维修员管理 用户管理 电桩类别管理 充电桩管理 充电桩报修管理 维修回复管…

DBS note4:Buffer Management

目录 1、介绍 2、缓冲池 3、处理页面请求 4、LRU替换和时钟策略 1)顺序扫描性能 - LRU 5、最近最常使用替换策略(MRU Replacement) 1)Sequential Scanning Performance - MRU 6、练习题 1)判断真假 2&#xf…

HCIP-十、BGP基础

十、BGP基础 实验拓扑实验需求及解法1.R1 属于 AS100,R2/3/4 属于 AS200,R5 属于 AS3002.AS200 内运行 OSPF3.建立 IBGP 邻居4.建立 EBGP 邻居5.BGP 发布路由6.路由黑洞 实验拓扑 实验需求及解法 本实验模拟 ISP 网络拓扑,运行 BGP。如图所示…

python中模块的创建及引用(import as,import,from)

模块(module)简介: 1.模块化,模块化指将一个完整的程序分解为一个一个的小模块, 通过将模块组合,来搭建出一个完整的程序 2.不采用模块化就是统一将所有的代码编写到一个文件中,采用 模块化就是…

chrome driver 截图和填表

昨天突然有一个需求(自己的),想把某个网站题目主体部分翻译并保存成图片,开始时用了国内网站的翻译(人工、简单翻译),后来发现很多地方翻译的不尽人意,于是只好用翻译插件对原始网站…

【H5 Canvas】【平面几何】特殊图形绘制(【带旋转】箭头/正多边形/正多尖角形等)

文章目录 直线/弧线 箭头 直线/弧线 箭头 // startX,startY 起始坐标 // endX,endY 结束坐标 // radian 圆弧角度,取值[0,PI]; 0表示画直线箭头,否则画圆弧箭头 CanvasRenderingContext2D.prototype.drawArrow function(startX,startY,endX,endY,radia…

【Spring篇】spring核心——AOP面向切面编程

目录 想要彻底理解AOP,我觉得你的先要了解框架的模块化思想,为此先记录框架在讲AOP 什么是java框架?为什么要出现框架? 我总结以下七点来讲述和帮助理解java框架思想 什么是AOP? 如何理解上面这句话呢&#xff1…

HarmonyOS安装三方库遇到的问题

使用开发电脑系统为:MacOS, 开发工具为:DevEco-Studio版本号3.1.1 Release。在控制栏使用终端工具输入命令:ohpm install ohos/lottie遇到的第一个问题如下图。 解决方案: 1、在首选项中找到ohpm的安装路径。 2、打开bash_profil…

电子学会C/C++编程等级考试2022年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

pyhon数据分析A股股票策略实际买卖总结(每月末更新数据)

简介 本篇文章主要记录python数据分析a股股票选股后实际买卖的记录。 选股策略 低位寻股&#xff0c;筛选出低位股价股票已经做过调整的股票&#xff0c;做短线交易&#xff08;不超过7天&#xff09;&#xff0c;不贪&#xff0c;小赚即走。分三个时段&#xff0c;开盘三十…

SSM企业风向管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 企业风向管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/…

决策树(第四周)

一、决策树基本原理 如下图所示&#xff0c;是一个用来辨别是否是猫的二分类器。输入值有三个&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;&#xff08;耳朵形状&#xff0c;脸形状&#xff0c;胡须&#xff09;&#xff0c;其中x1{尖的&#xff0c;圆的}&#xf…

***利用SecureCRT上传、下载文件(使用sz与rz命令)

使用SecureCrt连接到服务器。 1、上传文件&#xff1a;rz命令 输入“rz”&#xff0c;回车&#xff0c;在弹窗的文件选择框中选择本地磁盘中需要上传的文件&#xff0c;点击【Add】按钮&#xff0c;再点击传输指令即可。 注意&#xff08;如果没有权限不可能成功&#xff0c;…