================
网络编程:不需要基于html页面就可以达到数据之间的传输
网页编程:需要基于html页面上进行数据的交互
网络通讯的三要素
1 IP地址 每个人的身份证
2 端口号 2个不同的软件,一个IP,那么传输数据的时候到底传给谁?就需要端口号,仅仅只是一个标识
3 协议 数据经过路由器的时候,会进行处理,然后发送到另一端,但是另一端的路由器不一样,
那么如何处理,所以就需要一个公共的协议
1
IP地址:由一个32位的二进制数据组成,为了方便记忆,把IP地址切成4分,每份8bit,那么2^8,这就是最大的范围
IP地址=网络号+主机号
经过路由器(非真实IP) 192.168.1.1
子网掩码 255.255.255.0
255就是表示上面的就是网络号192.168.1 而主机号就是1
IP地址的分类:
A类地址=一个网络号+三个主机号 2^24 政府单位
B类地址=2个网络号+2个主机号 2^16 事业单位(学校,银行)
C类地址=3个网络号+1个主机号 2^8 私人使用
2
端口号:没有类进行描述,因为它仅仅只是一个标识
端口号的范围:0-65535
0-1023:系统绑定于一些紧密的服务,不能用
1024-49151 系统绑定了一些松散的服务,有些可以用
3
网络通信协议:
udp通讯协议,将数据及其目的封装为数据包,不需要建立连接
每个数据包大小限制在64K中,因为无连接,所以不可靠,因为不需要建立连接,所以速度快
例:人说话,游戏
tcp通信协议
面向连接,基于IO流传输。有特有的通道,能传输大数据,通过三次握手机制连接,可靠协议,
因为必须通信前必须建立链接,所以效率稍低
例:电话,文件的传送
在java中网络通讯称为Socket(套接字),要求通信的俩台机器都必须安装Socket
UDP协议下的Socket:
DatagramSocket(套接字服务,用于发送和接受数据)
DatagramPacket(数据包类,用于包装和解包数据)
udp通讯不分服务端与客户端,只分发送端和接收端
每个网络程序都自己所处理的特定格式的数据,如果接收到的数据不符合特定指定的格式,那么就会
被变成垃圾数据丢弃,相当于加密,所以发送的过去要是指定的格式。就和我们的发送封包是一样的,格式肯定要对
例如飞Q接受的数据格式:(这个格式可以截取封包去看)
version:time:sender:ip:content
在udp协议中,有一个IP地址称为广播地址,广播地址就是主机号为255的地址
给广播IP地址发送消息的时候,在同一个网络段的机器都可以接受到信息
比如 InetAddress.getByName("192.168.1.255")给这个发送信息。这个局域网内所有的机子都会接受到信息
注意:
1 发送段关闭了端口,那么接收端就不需要
IntAddress类
static InetAddress[] getAllByName(String host)
在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
也可以给IP和域名,比如www.baidu.com,那么就会返回1个IP,但是这个IP有2台主机,所以会返回2个IP
[www.baidu.com/14.215.177.39, www.baidu.com/14.215.177.38]
getByName 参数可以是主机名也可以是ip地址
DatagramSocket类,带箭头的是常用方法
recevice 接受数据包,这是一个阻塞的方法,只有端口内有内容发送过来,才会通行
所以先开服务端再开接受端
DatagramPacket类
IP的基本操作
InetAddress address=InetAddress.getLocalHost(); //返回本地主机对象
System.out.println(address.getHostAddress()); //返回本机IP地址
System.out.println(address.getHostName()); //返回ip地址的主机名
//通过getByName获取主机对象,参数可以填ip或者主机名
InetAddress address2=InetAddress.getByName("100.65.44.219");
System.out.println(address2.getHostAddress());
System.out.println(address2.getHostName());
//获取主机名(域名)下的所有主机对象
InetAddress[] address3=InetAddress.getAllByName("www.baidu.com");
System.out.println(Arrays.toString(address3));
UDP发送端
class Test1
{
public static void main(String[] args) throws IOException
{
//创建Socket通信
DatagramSocket data = new DatagramSocket();
String value = getData("This is mine");
//构造包,端口是我们指定的
DatagramPacket pack = new DatagramPacket(value.getBytes(), value.getBytes().length,
InetAddress.getLocalHost(),9090);
//发送包过去
data.send(pack);
data.close();// 关闭端口
}
// 因为要指定的格式,所以下面是组建内容
public static String getData(String content) throws IOException
{
// 例如飞Q接受的数据格式:
// version:time:sender:ip:content
StringBuilder sb_1 = new StringBuilder();
sb_1.append("1.0:");
// ..........按照格式依次组建
return sb_1.toString();
}
}
UDP接收端
public class Test2
{
public static void main(String[] args) throws IOException
{
//接收也用Socket,因为是UDP,所以只要指定端口即可
DatagramSocket data_1 = new DatagramSocket(9090);
//构建接受包
byte[] buf = new byte[1024];
DatagramPacket pack_1 = new DatagramPacket(buf, buf.length);
//接收进包,这是阻塞的方法,
data_1.receive(pack_1);
System.out.println(new String(buf, 0, pack_1.getLength()));
data_1.close();
}
}