一.网络编程
A:网络编程三要素
1.ip地址(网络中设备的标识,不易记忆,可用主机名)
a:概述:ip地址就是给每一个连接在Internet上的主机分配的一个32bit地址
b:组成:IP地址 = 网络地址+主机地址
A类IP地址:第一段号码为网络地址,剩下的三段号码为本地计算机的号码
B类IP地址:前二段号码为网络地址,剩下的二段号码为本地计算机的号码
C类IP地址:前三段号码为网络地址,剩下的一段号码为本地计算机的号码
c:分类: A类 1.0.0.1---127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
(2)127.X.X.X是保留地址,用做循环测试用的。
B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。
C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D类 224.0.0.1---239.255.255.254
E类 240.0.0.1---247.255.255.254
d:特殊地址:
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
DOS命令 ipconfig:查看本机IP地址
xxx.xxx.xxx.255 广播地址
2.端口(用于标识进程的逻辑地址,不同进程的标识)
物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
a:每个网络程序都会有一个逻辑端口
b:用于标识进程的逻辑地址,不同进程的标识
c:有效端口:0~65535(两个字节),其中0~1024系统使用或保留端口。
3.协议(通讯的规则常见协议:TCP,UDP)
UDP
将数据源和目的封装成数据包中,不需要建立连接;
每个数据报的大小在限制在64k;
因无连接,是不可靠协议;
不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道;
在连接中进行大数据量传输;
需要连接所以是可靠协议;
必须建立连接,效率会稍低
二.InetAddress类的概述和使用
A:概述:为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用
此类表示互联网协议 (IP) 地址。
B:InetAddress类的常见功能
public static InetAddress getByName(String host)//确定主机的IP地址,给定主机名
public String getHostAddress()//获取IP
public String getHostName()//获取主机名
C:案例演示:
实现这些功能
测试类:
public class Test {
public static void main(String[] args) throws IOException {
//方式一 :使用主机名来创建对象
InetAddress address = InetAddress.getByName( "DESKTOP-FTNI8AJ");
//获取ip地址
String ip = address.getHostAddress();
//获取主机名
String hostName = address.getHostName();
System.out.println(ip);
System.out.println(hostName);
System.out.println("---------------------------------");
//方式二:使用ip地址来创建对象
InetAddress address2 = InetAddress.getByName("192.168.9.131");
//获取ip地址
String ip2 = address2.getHostAddress();
//获取主机名
String hostName2 = address2.getHostName();
System.out.println(ip2);
System.out.println(hostName2);
}
}
192.168.9.131
DESKTOP-FTNI8AJ
---------------------------------
192.168.9.131
DESKTOP-FTNI8AJ
三.Socket通信
A:Socket通信
B:Socket原理机制:
通信的两端都有Socket。网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
C:Socket通信的原理图
四.UDP协议发送数据
A:UDP协议发送接收数据的原理图
B:UDP发送数据(客户端)的步骤:
a: 创建UDP通讯客户端对象(DatagramSocket) public DatagramSocket()
b: 创建数据报包 public DatagramPacket(byte[] buf, int length, InetAddress address,int port)
c:发送数据 send();
d:释放资源
C:UDP接收数据(服务器端)的步骤:
a:创建UDP通讯协议服务器端对象(DatagramSocket) 注意要用有参数构造 指定端口号
public DatagramSocket(int port)
b:创建数据报包,作用用来接收数据 public DatagramPacket(byte[] buf, int length)
c:接收数据 receive(dp)
d:解析数据报包,拿出数据 dp.getData() ; dp.getLength()
e:释放资源
案例演示一:UDP协议发送端的数据是一句话
客户端:
public class UDPServer {
public static void main(String[] args) throws IOException {
// a:创建UDP通讯协议服务器端对象(DatagramSocket) 注意要用有参数构造 指定端口号
// public DatagramSocket(int port)
//
// b:创建数据报包,作用用来接收数据 public DatagramPacket(byte[] buf, int length)
// c:接收数据 receive(dp)
// d:解析数据报包,拿出数据 dp.getData() ; dp.getLength()
// e:释放资源
//1.创建一个UDP服务器对象,暴露端口号
DatagramSocket ds=new DatagramSocket(10001);
//2.创建数据报包
byte[]by=new byte[1024];
int length=by.length;
DatagramPacket dp = new DatagramPacket(by, length);
//3.接收数据
ds.receive(dp);//服务器在这里停着呢 等待接受数据
//4.解析数据
//获取数据
byte[] data = dp.getData();
//获取数据的长度
int length2 = dp.getLength();
//DatagramPacket中的方法getAddress()
//返回的IP地址的机器,这个数据包被发送或从收到的数据报。
InetAddress address = dp.getAddress();
//获取ip地址
String hostAddress = address.getHostAddress();
//将数据转换为字符串输出
String string = new String(data,0,length2);
System.out.println(address+"发送来的数据时"+string);
}
}
服务器端:
结果:
192.168.9.131发送来的数据时我是UDP,我来啦
案例演示二:UDP协议发送端的数据来自于键盘录入
客户端:只是修改客户端的代码,服务器端不变
public class UDPClient {
public static void main(String[] args) throws IOException {
//案例:UDP协议发送端的数据来自于键盘录入
//1.创建UDP对象
DatagramSocket ds=new DatagramSocket();
//2.键盘录入数据
BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
//获取IP地址的对象
InetAddress address = InetAddress.getByName("192.168.9.131");
while(true) {
System.out.println("请输入要发送的数据");
String string=bfr.readLine();
if(string.equals(886)) {
break;
}
byte[] by=string.getBytes();
int length=by.length;
//4.创建数据报包,发送数据
DatagramPacket dp=new DatagramPacket(by,length,address,10002);
ds.send(dp);
}
//5.释放数据
ds.close();
}
}