文章导航
什么是网络编程?
老丁的电脑将本地数据进行打包
,通过网络将包扔出去
,网络另一端的小红的电脑将数据包解开
,达到通信(眉目传情)的效果。
老丁通过微信发了一条消息给小红,可能觉得凉的不够快,又通过qq给小红的闺蜜发了一条,顺便还浏览一个不可描述的网页,这样小红的微信和闺蜜的qq几乎同时收到了老丁的信息,老丁也打开了浏览器的相关页面。
嗯,我们发现,网络通信其实是两个进程之间的通信。
- 找到对方
IP
- 数据要发送到对方指定的应用程序上
端口
- 定义通信规则,通常被称为
协议
网络模型
数据一层一层,从上到下进行封装,最终发送到对端,由对端网络模型一层一层进行解析。
OSI | TCP/IP |
---|---|
应用层 | 应用层 |
表示层 | |
会话层 | |
传输层 | 传输层 |
网络层 | 网络层 |
数据链路层 | |
物理层 | 主机至网络层 |
网络三要素
IP地址
java对象:InetAddress
InetAddress localhost = InetAddress.getLocalHost(); System.out.println(localhost.toString());
端口
为了标识这些发送和接收消息的应用程序,所以给这些应用程序用数字标识,这些数字叫做端口。
传输协议
UDP
不需要建立连接
将数据和源和目的地封装成数据包(Max:64K)
面向无连接,速度快,不可靠协议
通常:(速度快)(不需要保存,可以丢包)
聊天室:feiq
屏幕共享
网络视频会议
邮寄快递,对讲机
TCP
建立连接,形成传输数据通道
在连接中进行大数据传输
三次握手完成连接,可靠的通信
相率相对低
打电话
三次握手:
老师:张三你在么?
张三:我在。
老师:我知道了。
Socket
- 为网络服务提供的一种机制
- 通信两端都有socket
- 网络通信其实就是socket间的通信
- 数据在两个socket间io传输
UDP发送数据
对象: DatagramSocket
发送和接收数据包DatagramPacket
数据包
发送数据流程:
1.建立udp socket服务
2.提供数据,并将数据封装到数据包中
3.通过socket服务的发送功能将数据包发出
4.关闭资源
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSend {
public static void main(String[] args)throws Exception {
//1.建立socket服务
DatagramSocket dSocket = new DatagramSocket();
byte[] buf = "hello udp".getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port=10000;
//2.将数据封包
DatagramPacket dPacket = new DatagramPacket(buf, buf.length, address, port);
//3.发送数据
dSocket.send(dPacket);
//4.关闭资源
dSocket.close();
}
}
UDP接收数据
对象:
DatagramSocket
发送和接收数据包DatagramPacket
数据包
接收流程:
1.定义udp socket 服务
通常监听一个端口,方便明确哪些数据过来应用程序可以处理
2.定义一个数据包,用于存储接收到的字节数据
3.通过socket服务的receive方法,将接受到的数据放入定义好的数据包中
4.通过数据包对象的特有功能,将不同的数据取出
5.关闭资源
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceive {
public static void main(String[] args) throws Exception {
//1、定义udp socket服务,并监听端口
DatagramSocket dSocket = new DatagramSocket(10000);
//2、定义数据包对象,用于存放数据
byte[] buf = new byte[1024];
DatagramPacket p =new DatagramPacket(buf, buf.length);
//3、接收数据
dSocket.receive(p);
//4、获取数据
String string = new String(buf,0,buf.length);
System.out.println(string);
//5、关闭资源
dSocket.close();
}
}