Java网络多线程

server/2025/3/14 12:55:46/

网络相关概念:

关于访问: IP+端口

因为一个主机上可能有多个服务, 一个服务监听一个端口,当你访问的时候主机通过端口号就能知道要和哪个端口发生通讯.因此一个主机上不能有两个及以上的服务监听同一个端口.

协议简单来说就是数据的组织形式

好像是两个人交流一样,要保证自己说的对方能够听懂, 网络传输协议就是规定了一种数据组织形式,发送数据按照这种形式组织数据, 接受数据方按照这种协议对应的方式来解析获取传输的数据.

相关类:

Socket:

TCP网络编程:

设置结束标记: socket.shutdownOutput()

服务器端在想客户端发送数据时, 如果不在outputStream之后设置结束标志,客户端就会一直等待,因为无法判断是否输入完成

而至于为什么在服务器端不返回给客户端信息的例子中在客户端不需要设置结束标志可能是因为客户端不需要接受数据,程序执行完毕, 服务器就结束读取.(文心一言的解释:当客户端程序结束时,连接的自然关闭将足以通知服务器所有数据都已发送完毕。)

在使用字符流传输数据时,首先将字节输出流转化成字符输出流,使用nextline()插入一个换行符作为结束标志, 这就要求接收数据方一定要使用readline()方法来读取数据,否则读不到结束标志.

文件上传示例:

在C:\Users\86150\Desktop\Java_c_a\net\giao_12_25中

TCP网络通信编程:

现在的windows中打不开dos控制台了, 在cmd控制台也能执行这个命令

netstat  -anb 可以查看是端口是哪个应用程序在监听(需要管理员权限)

UTP网络通讯编程:

作业3:

可以利用这种技术将文件都放在服务器的磁盘中, 然后对于接收端发送请求,服务端发送对应的文件,接收端对文件进行接收处理, 我想像一些歌曲视频播放的软件或网站应该就是这样实现的.(文件源放在服务器中, 接收端发送请求来获取文件).

作业的实现代码路径:C:\Users\86150\Desktop\Java_c_a\net\giao_12_25项目下的Homework3包下.

项目开发流程:

多用户及时通信系统:

项目地址:

项目整体分析:

简单来说,就是客户端和服务器端都有多个socket, 客户端的每个socket分别用于传输不同的信息(这样进行分类便于管理),一个客户端可以和服务器端有多个连接

客户端和服务器端都有多个线程, 每个线程中有一个socket, socket用集合hm来进行管理

serialVersionUID字段:

在传输过程中是使用Object,所以User和Message类要是能实现序列化, 即实现序列化接口,然后最好显式地声明serialVersionUID字段

Java官方强烈建议所有要序列化的类都显式地声明serialVersionUID字段

它主要用于在序列化和反序列化过程中进行版本校验,确保序列化的对象能够正确地被反序列化回原始对象或兼容的对象

项目模块:

整体实现思路:

对于客户端和服务端对于每个连接都建立一个线程, 也就是说,每个Socket用一个线程管理, 再建立一个集合用于管理线程

这个线程类要继承Thread, 里面有属性Socket

整个传输都是使用的类, 所以使用了ObjectInputStream和ObjectOutputStream

对于客户端和服务端都要实时读取Socket上的信息, 所以要使用一个死循环来一直执行run方法,在run方法里面时刻读取信息

针对读取到的信息的类型分别进行对应的处理

服务器有一点特殊的是,他要比客户端提前运行, 先建立连接,然后才能发送消息

所以需要服务端一开始就要有一个死循环来建立连接

建立连接后, 首先收到的信息是User,进行判断用户名和密码的正确性,然后将信息放在一个Message中返回去

因为此时已经建立连接了, 所以将此Socket放在线程中, 再将线程放在集合中,在执行线程的start方法,来时刻保持和客户端的通讯

对于客户端, 当与服务端建立连接并发送User时, 也要将此Socket放在线程中,将程序放在集合中,再启动线程的start方法来保持和用户端的通讯

对于信息的接收都是放在线程的run方法中的, 因为它是随时的,所以要使用死循环

对于信息的发送则是分布在很多的方法中,针对不同的需求编写不定的方法发送信息

1.登录模块:

首先要建立客户端和服务器是连接, 两个用于传输的类: User, Message

User: 用于做用户登录和注册判断, 包含用户名, 用户密码属性

Message: 用于传输信息,包含发送者,接收者, 消息类型, 消息内容

在登录判断中, 客户端传输User对象给服务端,服务端做判断后传输Message给客户端

客户端在线程中接收到Message后针对其内容进行相应的处理(登录成功/失败)

2.拉取在线用户:

这是客户端的一个请求, 在一个方法中发送Message, Message中声明的信息类型, 服务端针对信息类型得知是一个返回在线用户的请求, 然后通过集合获取所有在线用户,处理成String, 然后放在Message中通过ObjectOutputStream返回客户端.

3.无异常退出:

4.发送文件:

5.服务端推送消息:

在服务端专起一条线程用于做这个事

6.离线消息文件推送服务:

用一个集合存放离线信息, 待用户上线后发送

当服务器接收到sender的Message时先判断getter是否在线, 如果不在线则将信息存进集合.

实现思路: 在做判断用户登录成功后要发送登录成功或失败的信息给客户端, 如果是登陆成功的话, 则紧接着去集合中去找是否有发给这个用户的离线信息, 如果有就发给他,然后将此信息从集合中删除.

文章来源:https://blog.csdn.net/2301_79997310/article/details/144719803
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/server/174887.html

相关文章

汽车无钥匙启动系统不使用传统机械钥匙启动汽车

汽车无钥匙启动系统 定义 汽车无钥匙启动系统(Keyless Start System),启动车辆时不用掏拧钥匙,只需把钥匙放在包内或口袋里,按下车内按键或拧动导板即可使发动机点火。它无需插入钥匙,通过点按按键或旋转…

Github 2025-03-12 C开源项目日报Top5

根据Github Trendings的统计,今日(2025-03-12统计)共有5个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目5C++项目1Lean的LEDE源码:为国产龙芯LOONGSON SoC loongarch64/飞腾Phytium腾锐2000系列架构添加支持 创建周期:2338 天开发语言:C协议类…

JUnit 与 Mockito 组合测试 Controller 层-入门

文章目录 为什么要组合Mockito ?如何实现?导入依赖新建测试类类注解方法逻辑1. 定义替换逻辑2. 定义模拟操作3. 确保执行 完整示例 为什么要组合Mockito ? 答:隔离 Controller 层,保证单元测试纯粹性 具体来说&#…

版本号标识

Visual Studio 16 2019 是 Microsoft Visual Studio 2019 的版本号标识。具体来说: Visual Studio 是微软提供的一款集成开发环境(IDE),用于开发各种应用程序,如桌面软件、Web 应用、移动应用等,支持多种编…

后端主流数据库分析

一、关系型数据库(RDBMS) 1. MySQL:金融支付系统核心 行业场景:​ 金融支付:银行交易流水、支付订单(ACID事务保障)。​电商平台:商品库存管理、订单状态跟踪(高并发OLTP)。SaaS服务:多租户用户管理(分库分表隔离数据)。Python实战代码: # 金融交易事务操作(…

DataGear部署文档(基于openeuler)

目录 文章目录 目录安装JDK部署DataGear启用DataGear关于DataGear系统 安装JDK DataGear需要JDK 8的运行环境,所以我们需要预先在openeuler上安装好 可以点击这里进行下载:https://www.oracle.com/cn/java/technologies/downloads/#license-lightbox …

【原创】在高性能服务器上,使用受限用户运行Nginx,充当反向代理服务器[未完待续]

起因 在公共高性能服务器上运行OllamaDeepSeek,如果按照默认配置启动Ollama程序,则自己在远程无法连接你启动的Ollama服务。 如果修改配置,则会遇到你的Ollama被他人完全控制的安全风险。 不过,我们可以使用一个方向代理&#…

Mac java全栈开发环境配置

前言 由于最近手中的windows本子坏了,所以搞了一台m系列的macbookpro 作为一个开发者 面对新设备最先考虑的应该就是各种sdk、中间件服务、环境变量配置和工具了吧!!! 本文将带你手把手学习Mac搭建属于自己的本地开发环境 安装brew 什么是brew? ‌Brew(全称Homebrew)…