网络相关概念:
关于访问: 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是否在线, 如果不在线则将信息存进集合.
实现思路: 在做判断用户登录成功后要发送登录成功或失败的信息给客户端, 如果是登陆成功的话, 则紧接着去集合中去找是否有发给这个用户的离线信息, 如果有就发给他,然后将此信息从集合中删除.