![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
计算机网络
伊颦伊笑
人的悲欢并不相通
展开
-
网络多线程——多用户即时通信系统(13)——服务端推送新闻
服务端 服务端 推送消息/新闻,本质其实就是群发消息 在服务器启动一条独立线程,专门负责推送新闻 在服务器端添加 Utility 工具类 在服务端新建 SendNewsToAllService 类 package com.qqserver.service; import com.qqcommon.Message; import com.utils.Utility; import java.io.IOException; import java.io.ObjectOutputStream; im原创 2021-10-20 16:37:07 · 185 阅读 · 1 评论 -
网络多线程——多用户即时通信系统(12)——发文件
客户端 客户端 先把文件 a.jpg 读取到客户端,字节数组 把文件对应的字节数组封装到 message 对象【包含文件内容、sender、getter】 将 message 对象发送给服务端 在接收到包含有文件的消息后,将将该文件保存到磁盘 服务端 服务端 接收到 message 对象 拆解 message 对象的 getterId,获取该用户的通信线程 把 message 对象转发给指定用户. 在服务端和客户端进行“消息”扩展 MessageType 接口: Message 类: 在客户端新原创 2021-10-20 16:07:22 · 195 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(11)——群聊代码实现
QQView: 在服务端和客户端添加新的消息类型 MessageClientService 中添加新方法 /** * @param content 内容 * @param senderId 发送者 */ public void sendMessageToAll(String content, String senderId){ // 构建 Message Message message = new Message();原创 2021-10-19 20:46:19 · 163 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(10)——私聊代码实现
客户端 接收用户希望给某个其它在线用户聊天的内容。 将消息构建成 Message 对象,通过对应的 socket 发送给服务器 在他的线程(通信线程中),读取到发送的 message 消息,并显示即可 服务端 可以读取到客户端发送给某个客户的消息 从管理线程的集合中,根据 message 对象的 getterId 获取到对应线程的 socket 然后将 message 对象转发给指定客户 QQView 创建 MessageClientService 类,来提供和消息相关的方法 package原创 2021-10-19 16:17:32 · 318 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(9)——无异常退出系统
客户端 在客户端的 UserClientService 类中编写 logout 方法 // 1. 验证用户登录 .... // 2. 向服务器端请求在线用户列表 .... // 3. 编写方法,退出客户端,并给服务端发送一个退出系统的 Message 对象 public void logout(){ Message message = new Message(); message.setMesType(MessageType.M.原创 2021-10-14 21:05:10 · 146 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(8)——拉取在线用户列表:服务端
在 ManageServerConnectClientThread 中编写方法,返回在线用户列表 // 编写方法,返回在线用户列表 public static String getOnlineUser(){ // 通过 keySet() 方法进行遍历 Set<String> keys = map.keySet(); String onlineUserList = ""; for (String key : key原创 2021-10-14 19:25:02 · 180 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(7)——拉取在线用户列表:客户端
在客户端和服务端的 MessageType 中添加几个新类型 String MESSAGE_COMM_MES = "3"; // 普通信息报 String MESSAGE_GET_ONLINE_FRIEND = "4"; // 获取在线用户列表 String MESSAGE_RETURN_ONLINE_FRIEND = "5"; // 返回在线用户列表 String MESSAGE_CLIENT_EXIT = "6"; // 客户端请求退出 客户端部分:拉取在线用原创 2021-10-14 18:50:19 · 197 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(6)——设计可登录用户集合
启动多个客户端: 在 QQServer 中创建一个集合,存放多个用户,如果是这些用户登录,就认为是合法的 // 创建一个集合,存放多个用户,如果是这些用户登录,就认为是合法的 // HashMap 没有处理线程安全,因此在多线程下是不安全的 // ConcurrentHashMap 实现了同步处理,多线程下是安全的 // private static HashMap<String, User> validUsers = new HashMap<>(原创 2021-10-14 16:12:09 · 166 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(5)——服务端
QQServer package com.qqserver.service; import com.qqcommon.Message; import com.qqcommon.MessageType; import com.qqcommon.User; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocke.原创 2021-10-14 15:14:55 · 187 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(4)——客户端线程管理部分
UserClientService package com.qqclient.service; import com.qqcommon.Message; import com.qqcommon.MessageType; import com.qqcommon.User; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Ine原创 2021-10-14 14:09:26 · 145 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(3)——客户端线程部分
设计客户端部分的线程,线程持有 Socket 对象 UserClientService package com.qqclient.service; import com.qqcommon.Message; import com.qqcommon.MessageType; import com.qqcommon.User; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutput原创 2021-10-14 11:31:17 · 172 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(2)——客户端界面部分
客户端 复制一份 Utility.java 工具类到 com.qqclient.utils 包下: Utility 代码: package com.qqclient.utils; /** 工具类的作用: 处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。 */ import java.util.*; /** */ public class Utility { //静态属性。。。 private static Scanner scanner = new S原创 2021-10-14 11:28:23 · 412 阅读 · 0 评论 -
网络多线程——多用户即时通信系统(1)——公共部分
需求分析 用户登录 拉取在线用户列表 无异常退出(服务端、客户端) 私聊 群聊 发文件 服务器推送新闻 通信系统示意图 客户端和服务端共有的类:Message、User User 类: package com.qqcommon; import java.io.Serializable; /** * @Author: Gin * @Description: 表示一个用户 / 客户信息 * @Modified By: Gin * @Date: Created in 15:04 2021/1原创 2021-10-14 10:21:27 · 181 阅读 · 0 评论 -
网络多线程——网络编程练习
TCP 练习 使用字符流的方式,编写一个客户端程序和服务器端程序,客户端发送 “name”,服务器端接收到后,返回 "我是nova ",nova是你自己的名字 客户端发送 “hobby”,服务器端接收到后,返回 “编写java程序” 不是这两个问题,回复 “你说啥呢” 服务端 package net.udp; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * @Author: Gin *原创 2021-10-12 17:16:38 · 346 阅读 · 0 评论 -
网络多线程——UDP网络通信编程
基本介绍 类 DatagramSocket【数据报套接字】 和 DatagramPacket【数据包 / 数据报】 实现了基于 UDP协议网络程序。 UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。 DatagramPacket 对象封装了 UDP 数据报,在数据报中包含了发送端的 IP 地址和端口号以及接收端的 IP 地址和端口号。 UDP 协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方原创 2021-10-12 15:03:01 · 638 阅读 · 0 评论 -
网络多线程——TCP网络通讯不为人知的秘密
TCP网络通讯不为人知的秘密 当客户端连接到服务端后,实际上客户端也是通过一个端口和服务端进行通讯的,这个端口是 TCP/IP 来分配的原创 2021-10-09 23:47:48 · 66 阅读 · 0 评论 -
网络多线程——netstat
netstat 指令 netstat -an:可以查看当前主机的网络情况,包括端口监听情况和网络连接情况 netstat -an | more:可以分页显示,按 空格键 以逐页显示 netstat -anb:使用管理员权限开启 dos 控制台,输入此指令可以查看每个端口被哪个应用所监听 说明: LISTENING 表示某个端口在监听 如果有一个外部程序(客户端)连接到该端口,就会显示一条连接信息 可以输入 ctrl + c 退出指令 ...原创 2021-10-09 19:56:54 · 519 阅读 · 0 评论 -
网络多线程——网络上传文件
应用案例:客户端上传一张图片到服务端 编写一个服务端,和一个客户端 服务器端在 8888 端口监听 客户端连接到服务端,发送一张图片:e:\baidu.png 服务器端接收到客户端发送的图片,保存到 src 下,发送 “收到图片” 再退出 客户端接收到服务端发送的 “收到图片”,再退出 分析: 设计一个 StreamUtils 工具类 package net; import java.io.*; /** * @Author: Gin * @Description: * @Modified原创 2021-10-09 19:35:54 · 216 阅读 · 0 评论 -
网络多线程——TCP网络通信编程
应用案例 1 (使用字节流) 编写一个服务器端和一个客户端 服务器端在9999端口监听 客户端连接到服务器端,发送 “hello,server”,然后退出 服务器端接收到客户端发送的信息,输出,并退出 代码实现 服务端代码 package net; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /** * @Author原创 2021-10-09 14:36:08 · 287 阅读 · 0 评论 -
网络多线程——Socket
Socket 基本介绍 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准。 通信的两端都要有 Socket,是两台机器间通信的端点 网络通信其实就是 Socket 间的通信。 Socket 允许程序把网络连接当成一个流,数据在两个 Socket 间通过 IO 传输。 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端 TCP网络通信编程基本介绍 基于 客户端-服务端 的网络通信 底层使用的是 TCP/IP 协议 应用场景举例:客户端发送数据,服务端接受并显示控制台 基原创 2021-10-09 12:32:02 · 129 阅读 · 0 评论 -
网络多线程——InetAddress
InetAddress 类 相关方法 获取本机 InetAddress 对象:getLocalHost 根据指定主机名/域名获取 ip 地址对象:getByName 获取 InetAddress 对象的主机名:getHostName 获取InetAddress对象的地址:getHostAddress package net; import java.net.InetAddress; import java.net.UnknownHostException; /** * @Author: Gin原创 2021-10-09 11:23:27 · 122 阅读 · 0 评论 -
网络多线程——TCP 和 UDP
TCP 和UDP TCP协议:传输控制协议 使用TCP协议前,须先建立TCP连接,形成传输数据通道 传输前,采用 “三次握手” 方式,是可靠的 TCP 协议进行通信的两个应用进程:客户端、服务端 在连接中可进行大数据量的传输 传输完毕,需释放己建立的连接,效率低 UDP协议:用户数据协议 将数据、源、目的封装成数据包,不需要建立连接 每个数据包的大小限制在 64K 内,不适合传输大量数据 因无需连接,故是不可靠的 发送数据结束时无需释放资源(因为不是面向连接的),速度快 举例:发短信 ...原创 2021-10-09 11:02:20 · 162 阅读 · 0 评论 -
网络多线程——网络通信协议
协议(TCP/IP) TCP/IP(Transmission ControlProtocol/lnternet Protocol)的简写中文译名为传输控制协议 / 因特网互联协议,又叫网络通讯协议,这个协议是 Internet最基本的协议、Internet国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。 协议的理解 总的来说就是一句话:数据的组织形式,就是协议 如下图:用户数据通过多个协议,最后封装为以太网帧 ...原创 2021-10-09 10:50:01 · 231 阅读 · 0 评论 -
网络多线程——域名和端口
域名 www.baidu.com 好处:为了方便记忆,解决记 ip 的困难 概念:将 ip 地址映射成域名,这里怎么映射上,HTTP协议 端口号 概念:用于标识计算机上某个特定的网络程序 表示形式:以整数形式表示,端口范围:0 ~ 65535【 2 个字节表示端口:0 ~ 2^16-1】 0 ~ 1024 号端口已经被占用,比如:ssh 22,ftp 21,smtp 25,http 80 常见的网络程序端口号:tomcat:8080,mysql:3306,oracle,1521,sqlserver:1原创 2021-10-09 10:41:55 · 85 阅读 · 0 评论 -
网络多线程——ip 地址
ip 地址 概念:用于唯一标识网络中的每台计算机 / 主机 查看 ip 地址:ipconfig ip 地址的表示形式:点分十进制:xxx.xxx.xxx.xxx 每一个十进制数的范围:0 ~ 255 ip 地址的组成 = 网络地址 + 主机地址,比如:192.168.16.69 IPv6 是互联网工程任务组设计的用于替代 IPv4 的下一代 IP 协议,其地址数量号称可以为全世界的每一粒沙子编上一个地址 由于 IPv4 最大的问题在于网络地址资源有限,严重制约了互联网的应用原创 2021-10-09 10:35:21 · 173 阅读 · 0 评论