【东软实训Day2】用Java实现客户端与服务器交互

news2025/1/22 19:03:00

一、客户端-服务器编程模型

1个应用 = 1个服务器进程 + 1…N个客户端进程,其中服务器管理资源,并通过操作这种资源为客户端服务。

客户端-服务器模型中的基本操作是事务(transaction)(注:不同于数据库中的transaction)。
一个客户端-服务器事务
Step1:客户端向服务器发送一个请求,发起一个事务;

Step2:服务器收到请求后,进行解释,并以适当的方式操作它的资源;

Step3:服务器给客户端发送一个响应,并等待下一个请求;

Step4:客户端收到响应并处理。

二、Java客户端和服务端建立连接的过程

Java客户端和服务端建立连接的过程可以分为以下几个步骤:

1.创建Socket对象

要实现一个需随时待命的服务器应用,因为不知道客户端什么时候会发来请求,此时,我们需要使用ServerSocket用来等待客户端的请求。一旦获得一个连接请求,就创建一个Socket对象来与服务器进行通信。

ServerSocket ss = new ServerSocket(port);
Socket s = ss.accept();

2. 创建套接字

在Java中,Socket是用于建立网络连接的基本类。服务器客户端需要创建一个Socket对象,一个Socket类代表一个客户端套接字,以便与服务端建立连接。

Socket socket = new Socket("服务器IP地址", 服务器端口);

3. 获取输入输出流

客户端需要获取Socket对象的输入输出流,以便向服务端发送请求和接收服务端的响应。

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

4. 发送请求

客户端向服务端发送请求,可以通过输出流将请求数据发送给服务端。

os.write("请求数据".getBytes());

5. 接收响应

服务端接收到客户端的请求后,会返回相应的数据。客户端可以通过输入流接收服务端的响应。

byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
	System.out.println(new String(buffer, 0, len));
}

6. 关闭连接

客户端在完成请求和响应后,需要关闭与服务端的连接。

socket.close();

三、服务器Server与客户端Client的代码示例:

1. Server代码

public class Server {
    public static void main(String[] args) {
        // 创建服务器
        // 创建ServerSocket对象
        try {
            // 启动服务器
            System.out.println("原神,启动!");
            ServerSocket ss = new ServerSocket(8888);
            // 等待客户,如果有可断来访问,就创建一个
            // 针对该客户端的一个Socket对象
            Socket s = ss.accept();

            // 每个socket都是一个io对象
            // 输入读取客户端发送过来的请求
            InputStream is = s.getInputStream();
            byte[]bytes = new byte[1024];
            int len = 0;
            len = is.read(bytes);
            String req = new String(bytes, 0, len, "utf-8");
            System.out.println(req);

            // 响应服务器
            OutputStream os = s.getOutputStream();
            String resp = "请求已收到,这是返回响应";
            os.write(resp.getBytes("utf-8"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

2. Client代码

public class Client {
    public static void main(String[] args) throws IOException {
        // 创建套接字对象访问服务器端口
        Socket s = new Socket("127.0.0.1", 8888);

        OutputStream os = s.getOutputStream();
        os.write("这里是客户端,收到请回答".getBytes("utf-8"));

        InputStream is = s.getInputStream();
        int len = 0;
        byte[]bytes = new byte[1024];
        len = is.read(bytes);
        System.out.println(new String(bytes, 0, len, "utf-8"));
    }
}

四、结合实际

现阶段的服务器大多都不会是1对1,而是为多个客户端提供服务,面向更多的用户,则需要使用多线程以及网络编程。代码示例如下:

ServerSocket ss = new ServerSocket(8888);
// 等待创建套接字
while (true) {
	Socket s = ss.accept();
	new ServerThread(s).start();
}

编写线程类,传递Socket对象,要实现的功能,就通过run方法调用,或者直接写在run方法中。

@Override
public void run() {
	try {
		// 文件的保存位置
		String uuid = UUID.randomUUID().toString();
		FileOutputStream fos = new FileOutputStream("img/" + uuid);
		// 读取客户端发送的文件
		byte[]bytes = new byte[1024];
		int len = 0;
		len = s.getInputStream().read(bytes);
		fos.write(bytes, 0, len);
		fos.close();
		File file = new File("img/" + uuid);
		file.renameTo(new File("img/" + uuid + ".png"));
	} catch (FileNotFoundException e) {
		throw new RuntimeException(e);
	} catch (IOException e) {
		throw new RuntimeException(e);
	}
}

五、注意事项

在Java客户端和服务端建立连接的过程中,需要注意以下几点:

1. IP地址和端口号

客户端需要知道服务端的IP地址和端口号,才能与服务端建立连接。IP地址是服务端的唯一标识符,端口号是服务端程序的监听端口。

2. 输入输出流的关闭

在使用输入输出流时,需要注意及时关闭流,否则会导致资源泄露。

3. 异常处理

在建立连接的过程中,可能会出现各种异常。客户端需要对异常进行适当处理,以保证程序的稳定性。

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

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

相关文章

软考-高级-信息系统项目管理第四版(完整24章全笔记)

《信息系统项目管理师教程》(第4版)是由全国计算机专业技术资格考试办公室组织编写的考试用书,根据2022年审定通过的《信息系统项目管理师考试大纲》编写,对信息系统项目管理师岗位所要求的主要知识及应用技术进行了阐述。 《信息…

ubuntu 20.04 通过 samba 共享文件夹到 windows

前言 ubuntu 与 windows 共享,有两条路,一是 windows 的目录共享给 ubuntu,比如使用 VM Ware 虚拟机,直接通过 VMWare 虚拟机共享文件夹的方式,windows 上的目录就共享给了 ubuntu ubuntu 如何把目录共享给 windows 呢…

zemax坐标断点实现光束偏移

简单来说就是将前面的坐标打断,实现新的坐标设置 基础设置: 对表面进行旋转: 系统自动插入坐标断点面 此时设置的旋转角度为0,我们将这个设置为变量: 在评价函数编辑器中选择REAY,控制光线高度 执行优化&a…

指针-矩阵变换

任务描述 给定一个矩阵,请编程将其按照以下约定的操作方式变换后输出。 相关知识 参考之前的关卡。 编程要求 根据提示,在右侧编辑器的Begin-End区域内补充代码。 测试说明 输入:第一行三个正整数 n,m 和 q 分别表示矩阵 A…

时间旅行的Bug 奇怪的输入Bug

故事一:时间旅行的Bug 在一个普通的工作日,程序员小明正在开发一个时间旅行的应用程序。这个应用程序可以让用户选择一个特定的日期和时间,然后将用户的意识传送到过去或未来的那个时刻。小明对这个项目非常兴奋,他认为这将是一个…

2023年9月8日

1> 自行封装一个栈的类&#xff0c;包含私有成员属性&#xff1a;栈的数组、记录栈顶的变量 成员函数完成&#xff1a;构造函数、析构函数、拷贝构造函数、入栈、出栈、清空栈、判空、判满、获取栈顶元素、求栈的大小 #include <iostream>using namespace std;class…

使用docker创建minio镜像并上传文件,提供demo

使用docker创建minio镜像并上传文件&#xff0c;提供demo 1. 整体描述2. 环境搭建2.1 windows环境搭建2.2 docker部署 3. spring集成3.1 添加依赖3.2 配置文件3.3 创建config类3.4 创建minio操作类3.5 创建启动类3.6 测试controller 4. 测试操作4.1 demo运行4.2 页面查看4.3 上…

GoogLeNet 08

一、发展 1989年&#xff0c;Yann LeCun提出了一种用反向传导进行更新的卷积神经网络&#xff0c;称为LeNet。 1998年&#xff0c;Yann LeCun提出了一种用反向传导进行更新的卷积神经网络&#xff0c;称为LeNet-5 AlexNet是2012年ISLVRC 2012&#xff08;ImageNet Large Sca…

[docker]笔记-存储管理

1、docker数据存储分为非永久性存储和永久性存储。 非永久性存储&#xff1a;容器创建会默认创建非永久性存储&#xff0c;该存储从属于容器&#xff0c;生命周期与容器相同&#xff0c;会随着容器的关闭而消失&#xff08;可理解为内存中数据&#xff0c;会随关机而消失&…

【jmeter】连接mysql无法使用executeQuery()

Can not issue data manipulation statements with executeQuery(). 翻译为&#xff1a; 在这里插入图片描述 看一下JDBC Request里的Query Type 改为Prepared Updata Statement&#xff0c;改完再试一下

CMake+CLion+Qt配置

在这里我下载MSVC的工具包&#xff0c;并没有下载Visual Studio。 配置编译环境 下载Visual Studio&#xff0c;其中有MSVC编译工具&#xff0c;下载MSVC工具包&#xff0c; 工具包下载链接&#xff1a;https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/ …

结构方程模型SEM、路径分析房价和犯罪率数据、预测智力影响因素可视化2案例...

原文链接&#xff1a;http://tecdat.cn/?p25044 在本文&#xff0c;我们将考虑观察/显示所有变量的模型&#xff0c;以及具有潜在变量的模型&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 1 简介 第一种有时称为“路径分析”&#xff0c;而后者有时称为“测…

2023国赛数学建模C题思路代码 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c; 大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c; 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

【Linux】工具Gdb调试轻度使用(C++)

目录 一、Gdb背景 二、Gdb基本命令 【2.1】list | l 【2.2】break | b 【2.5】delete | d 【2.6】disable 【2.7】enable 【2.3】info 【2.4】info locals 【2.6】run | r 【2.7】next | n 【2.8】step | s 【2.9】 continue | c 【2.10】bt 【2.11】finish 三…

idea报错“Static methods in interface require -target:jvm-1.8”

如题&#xff0c;在 idea 中跑 java 、scala 混编代码时&#xff0c;出现上面的错误。 问题的原因很明显是 idea 中的 jdk 版本设置有问题&#xff0c;针对性作如下排查&#xff1a; 检查项目的 java 版本 在File-> Project Settings中&#xff0c;检查检查idea的 java 版本…

SQL Server 跨库/服务器查询

这里写目录标题 1 SQL Server 跨库/服务器查询1.1 跨库查询1.2 跨服务器查询1.2.1 创建链接服务器1.2.2 跨库查询 1.3 拓展&#xff1a;SQL Server 中所有权和用户与架构的分离 1 SQL Server 跨库/服务器查询 1.1 跨库查询 在同一服务器下的跨库查询较为简单&#xff0c;示例…

QT Creator更改主题和编辑器风格(附几款黑色主题)

适用于qtcreator 一、使用自带主题与编辑器风格 打开Qt选择"工具"->"选项"&#xff1b; 2. 选择"环境"->"Theme"切换不同的主题风格 这里切换的是外边框的风格&#xff0c;如果编辑器中有同名的风格&#xff0c;编辑器的风格也…

【计算机基础知识9】前端设计模式与常见类型

目录 一、前言 二、设计模式的基本概念和原则 三、创建型设计模式 四、结构型设计模式 五、行为型设计模式 六、MVC和MVVM框架中的设计模式 七、实际应用案例分析 一、前言 在软件开发领域&#xff0c;设计模式是一种解决常见问题的最佳实践&#xff0c;它可以帮助开发…

手敲Cocos简易地图编辑器:人生地图是一本不断修改的书,每一次编辑都是为了克服新的阻挡

引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》&#xff0c;欢迎大家关注分享收藏订阅。 在上一篇文章&#xff0c;笔者给大家讲解了在Cocos独立游戏开发框架中&#xff0c;如何自定义实现Tile地图管理器&#xff0c;成功地在游戏中优化加载一张特大的地图。接下来…

持久层框架之Mybatis

概述 MyBatis是apache的一个开源项目iBatis,2010年改名为MyBatis,2013年11月迁移到GithubMyBatis是一款优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结…