在网络通信协议下,不同计算机上运行的程序,进行的数据传输。
![](https://i-blog.csdnimg.cn/blog_migrate/3e62c6315ee0c3d7d04b58f477fe8218.png)
![](https://i-blog.csdnimg.cn/blog_migrate/de4a8cc7e34184b94f816617e1d36534.png)
网络编程三要素:
![](https://i-blog.csdnimg.cn/blog_migrate/6237d00fbdb545c9921e931030096c50.png)
IP:
![](https://i-blog.csdnimg.cn/blog_migrate/b994246830507025e3f35b18644332e7.png)
IPv4:全称: Internet Protocol version 4,互联网通信协议第四版。采用32位地址长度,分成4组;平时表示是是点分十进制 4位都是0~255
IPv4的地址分类形式:公网地址(万维网使用)和私有地址(局域网使用)。
192.168.开头的就是私有址址,范围即为192.168.0.0--192.168.255.255,专门为组织机构内部使用,以此节省IP
特殊IP地址:127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也称本机IP,永远只会寻找当前所在本机。发送数据给自己的时候发送这个地址是不用经过路由器再找。
![](https://i-blog.csdnimg.cn/blog_migrate/0c5d6913f43796069ebfa332558a2c81.png)
IPv6:采用128位地址长度,分成8组。冒分十六进制(0位压缩表示法:中间连续的0可以压缩了)
InetAddress:
表示ip的对象
子类Inet4Address对应ipv4
![](https://i-blog.csdnimg.cn/blog_migrate/5464d67314eb388efe78252655b41fef.png)
//获取对象
InetAddress address=InetAddress.getByName("地址192.168.1.100");
端口号:
![](https://i-blog.csdnimg.cn/blog_migrate/9f494919e916799ea35def8045d14e8a.png)
协议:
![](https://i-blog.csdnimg.cn/blog_migrate/c688749a13ee88c5c74075710d2739a1.png)
UDP协议:
用户数据报协议(User Datagram Protocol)UDP是面向无连接通信协议。
速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据
面向无链接:发送数据的时候不会检查网络是否畅通,但是会快一点
TCP协议:
传输控制协议TCP(Transmission Control Protocol)TCP协议是面向连接的通信协议。
速度慢,没有大小限制,数据安全。
UDP通信程序:
发送数据:
创建发送端的DatagramSocket对象;数据打包(DatagramPacket);发送数据;释放资源
DatagramSocket ds=new DatagramSocket();//参数是绑定端口,用这个端口往外发送数据,
空参就是可用端口中随机一个
//打包数据
String name="";
byte[] bytes=name.getBytes();
InetAddress address=InetAddress.getByName("192.168.1.100");
int port=10086;
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
//port发送的端口 address发送地址
ds.sent(dp);
ds.close();
接受数据:
创建接收端的DatagramSocket对象;接收打包好的数据;解析数据包;释放资源
DatagramSocket ds=new DatagramSocket(10086);
//接收的时候一定要绑定端口,端口和发到的端口一样
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
//堵塞的,会等发送端发送数据再执行下面的
ds.receive(dp);
//解析数据包
byte[] data=dp.getDate();
dp.getLength();dp.getAddress();//获得地址
dp.getPort();//获得对方的端口
ds.close();
UDP的三种通信方式:
单播:一对一
组播:一对一组
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.255为预留的组播地址
//发送
MulticastSocket ms=new MulticastSocket();
String name="";
byte[] bytes=name.getBytes();
InetAddress address=InetAddress.getByName("224.0.0.1");//此时地址应该是组播地址
int port=10086;
DatagramPacket dp=new DatagramPacket(bytes,bytes.length,address,port);
//port发送的端口 address发送地址
ms.sent(dp);
ms.close();
//接受
MulticastSocket ms=new MulticastSocket();
InetAddress address=InetAddress.getByName("224.0.0.1");
ms.joinGroup(address);//将当前本机加入到224.0.0.1这一组中
//需要多个就用多个接收端都来加入到这一组中
//接收的时候一定要绑定端口,端口和发到的端口一样
byte[] bytes=new byte[1024];
DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
//堵塞的,会等发送端发送数据再执行下面的
ms.receive(dp);
//解析数据包
byte[] data=dp.getDate();
dp.getLength();dp.getAddress();//获得地址
dp.getPort();//获得对方的端口
ms.close();
广播:对局域网中所有电脑
广播地址:255.255.255.255
代码只要修改地址为广播地址就可以了
TCP通信程序:
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象通信之前要保证连接已经建立。通过Socket产生IO流来进行网络通信
![](https://i-blog.csdnimg.cn/blog_migrate/662434d8b84243d8512ef37e4e726980.png)
//客户端发送数据 创建对象的时候链接不上会报错的
Socket socket=new Socket("127.0.0.1",10000);
OutputStream os=socket.getOutpuStream();
os.write();
os.close();socket.close();
//服务端 接受端
ServiceSocket ss=new ServiceSocket(10000);//端口要一致
//监听客户端的连接
Socket socket=ss.accept();
//从连接通道读取数据
InputStream is=socket.getInputStream();
//读中文要把is转换成字符流
//InputStreamReader isr=new InputStreamReader(is);
int b;
while(b=is.read()!=-1){}
socket.close();
ss.close()
细节:要先运行服务端,要不然客户端找不到;服务端会停止在监听,直到客户端连接;
客户端底层会通过三次握手协议保证连接的建立
断开的时候会通过四次挥手协议保证通道内数据处理完才断开通道
三次握手:
![](https://i-blog.csdnimg.cn/blog_migrate/197e814ec3710222bf0ecab80193a12c.png)
四次挥手:
![](https://i-blog.csdnimg.cn/blog_migrate/1eb810d6b9f56d3de405e777a996cb75.png)
其他:
手动结束标记
socket.shutdownOutput();//在客户端中写完后服务端会结束读取