协议:通信规则。只有具有了相同规则,才能通信。
TCP/IP 协议,国际通用协议,可以用于广域网,也可用于局域网。
如果局域网,不想用如此高的规则,则可安装新规则。比如几个人设置了局域网玩游戏,设置了特有规则,别人就进不来。
网络参考模型:
OSI: 七层:应用层,表示层,会话层,传输层,网络层,数据链路层.物理层
每个层都有自己的协议,每层给数据加入(接受是减去)自己特有的数据。
前四层在给应用层数据封装,TCP协议在传输层。
网络层给数据IP地址,即告诉数据往哪去,IP地址协议就在网络层,
数据链路层:底层标准
物理层:看得见,摸得着的,如 网线就是标准的物理层
TCP/IP参考模型:四层,每个曾都有自己的协议 应用层,传输层,网际层,主机至网络层
我们现在玩的编程是在传输层和网际层,以后学的Javaweb开发玩到了应用层。
传输层:TCP、UDP
网际层:最常见的是IP协议
应用层:HTTP协议
网络通信要素
IP地址InetAddress网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
端口号:
用于标识进程的逻辑地址,不同进程的标识。
有效端口:0~65535,其中0~1024系统使用或保留端口。
常见默认端口
web服务端口:80
tomcat服务器端口:8080
mysql数据库端口:3306
传输协议
通讯的规则
常见协议:TCP、UDP
Socket
Socket就是为网络服务提供的一种机制
通信两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
网络通信概述
网络通信基本流程
1.找到对方IP
2.找到指定端口。
数据要发送到对方指定的应用程序上。为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识 。为了方便称呼这些数字,就叫做端口。逻辑端口。
3.定义通讯规则。这个通讯规则成为协议。
国际组织定义了通用协议TCP/IP。
TCP和UDP
UDP
不需要建立连接,将数据及源和目的封装成数据包中。
每个数据包的大小限制在64k以内
因为无连接,是不可靠协议
不需要建立连接,速度快
常见UDP协议应用
视频会议、聊天、共享桌面。
TCP
三次握手建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率低。
telent、FTP、多线程下载等
TCP传输
TCP传输分为客户端和服务器
Socket和ServerSocket
Socket客户端
1.建立Socket客户端服务,指定连接主机和端口。
2.获取Socket网络输入输出流进行读写操作,如果是多次读写用while循环,写数据可以用PrintWriter。
因为PrintWriter构造函数即可以接受字节流又可以接受字符流而且可以接受boolean值指定自动刷新所以比 BufferedWrter在写文本数据时更方便代码更简洁。
3.关闭客户端资源。
ServerSocket服务端
1.建立ServerSocket服务,监听一个端口。
2.获取与服务端连接的Socket客户端对象。
3.获取与服务端连接的Socket客户端网络输入输出流。
4.进行读写操作,如果是多次读写用while循环,写数据可以用PrintWriter。
因为PrintWriter构造函数即可以接受字节流又可以接受字符流而且可以接受boolean值指定自动刷新所以比 BufferedWrter在写文本数据时更方便代码更简洁。
5.关闭Socket客户端,关闭服务端(可选)。
UDP传输
UDP发送
1.创建UDP服务,通过DatagramSocket对象。
2.确定数据,并封装成数据包。DatagramPacket(byte[] buf,int length,InetAddress address,in port)
3.通过socket服务send方法将数据包发出去。
4.关闭udp资源。
UDP接收
1.定义udpsocket服务,监听端口。
其实就 给这个接受网络应用程序定义数字标识。
方便与明确哪些数据过来,该应用程序可以处理。
2.定义一个数据包,接受数据。
因为要存储接受到的字节数据。
数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3.通过udpsocket服务的receive方法将接受到的数据存入已定义好的数据包中。
可以通过while(true)方法一直监听端口。
注意:udpsocket对象要在while循环外创建否则会出现BindException绑定异常。
4.通过数据包对象的特有功能,将这些不同的数据取出,对数据进行处理。
5.关闭资源。
服务器处理客户端的并发连接
前面的服务端程序有个局限性,当A客户端连上以后,被服务端获取到,服务端执行具体流程。
这时B客户端连接,只有等待。
因为服务端还没有处理完A客户的请求,还没有循环回来执行下次accept方法,所以 暂时获取不到B客户端对象。
为了可以让多客户端同时被并发访问服务器,服务器最好就是将每一个客户端封装到一个单独的线程中,这样就可以同时处理多个客户请求。