web方向:少用
android:常用
一、网络通讯三要素:
1、IP:32位的二进制数据,切成4分,每份8位(192.168.1.1),0~255
2、端口:标识该消息给哪个应用程序处理的标识符,0~65535,
3、协议
IP地址
IP地址=网络号+主机号(192.168.1 +1)
IP地址分类:
1、A类地址 = 一个网络号+三个主机号 2^24 政府单位
2、B类地址 = 两个网络号+两个主机号 2^16 事业单位
3、C类地址 = 三个网络号+一个主机号 2^8 私人
1、IP类 InetAddress
常用方法:
(1)返回主机的IP地址对象,静态方法,没有构造方法
getLocalHost();
(2)返回IP地址的字符串表示形式
getHostAddress();
(3)返回主机名
getHostName();
(4)根据主机名或者IP地址的字符串形式确定IP地址对象
getByName();
(5)返回IP地址的数组形式
getAllByName();
2、端口
范围:0~65535
0~1023:系统紧密绑定的服务
1024~65535:可以使用
3、协议:
(1)UDP:飞秋,游戏
(2)TCP
在Java中网络通信也称为Socket(套接字/插座),要求都安装了Socket,不同的协议就有不同的Socket
二、UDP通讯协议
1、特点
(1)将数据源及其目的封装为数据包,面向无连接
(2)数据包限制在64K
(3)不可靠
(4)速度快
(5)UDP不分服务端与客户端,只分发送端与接收端
UDP协议下的Socket:
(1)DatagramSocket:UDP插座服务,发送和接收数据包的套接字
(2)DatagramPacket:数据包类
DatagramPacket(buf, length, address, port); // buf发送的内容;length发送数据内容大小;address发送目的IP地址对象;port端口号
2、发送端步骤
(1)建立UDP服务
(2)准备数据,把数据封装到数据包中,发送端要IP地址和端口号
(3)调用UDP发送数据
(4)关闭资源
3、接收端步骤
(1)建立UDP服务,监听端口
(2)准备空的数据包
(3)调用UDP服务接收数据
(4)关闭资源
每个程序都有自己处理的特定数据格式,接收到的数据不符合指定格式,那么就被丢弃
飞秋格式
版本号:时间:发送人:IP:发送标识符(32):真正内容
在UDP协议中有个IP地址为广播地址,主机号为255的地址
给广播IP地址发送消息时,同一网络段的主机都可以接收到消息
1 // UDP发送端 2 public static void sendUDPMsg() throws IOException { 3 // 建立UDP服务 4 DatagramSocket datagramSendSocket = new DatagramSocket(); 5 // 把数据封装到数据包中 6 String data = "UDP测试数据"; 7 // 建立数据包 8 DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(), data.getBytes().length, InetAddress.getLocalHost(), 9090); 9 // 调用UDP的服务发送数据包 10 datagramSendSocket.send(datagramPacket); 11 // 关闭资源 12 datagramSendSocket.close(); 13 }
1 public static void reveiveUDPMsg() throws IOException{ 2 // 建立UDP服务,监听端口 3 DatagramSocket datagramReceiveSocket = new DatagramSocket(9090); 4 // 建立新的数据包用于存放数据 5 byte[] buf = new byte[1024]; 6 DatagramPacket datagramReceivePacket = new DatagramPacket(buf, buf.length); 7 // 调用UDP服务接收数据存放在数据包的buf中 8 datagramReceiveSocket.receive(datagramReceivePacket); 9 System.out.println("接收到的数据:"+new String(buf, 0, datagramReceivePacket.getLength())); 10 // 关闭资源 11 datagramReceiveSocket.close(); 12 }
1 // 群聊接收端 2 public class WeChatSender extends Thread{ 3 4 @Override 5 public void run() { 6 // 不能直接抛出异常,Thread 7 try { 8 // 建立UDP服务 9 DatagramSocket datagramSendSocket = new DatagramSocket(); 10 // 准备数据,封装到数据包中,用BufferedReader封装可以逐行读取 11 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); 12 // 发送数据 13 String line = null; 14 DatagramPacket datagramSendPacket = null; 15 while((line = bufferedReader.readLine())!=null) { 16 // 把数据封装到数据包中然后发送 17 datagramSendPacket = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("192.168.1.255"), 9090); 18 // 发送数据 19 datagramSendSocket.send(datagramSendPacket); 20 } 21 // 关闭资源 22 datagramSendSocket.close(); 23 } catch (IOException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } 27 } 28 }
1 // 群聊接收端 2 public class WeChatReveiver extends Thread{ 3 4 @Override 5 public void run() { 6 try { 7 // 建立UDP服务,监听端口 8 DatagramSocket datagramReveiveSocket = new DatagramSocket(9090); 9 // 准备空的数据包存储数据 10 byte[] buf = new byte[1024]; 11 DatagramPacket datagramReveivePacket = new DatagramPacket(buf, buf.length); 12 // 调用UDP接收数据 13 boolean flag = true; 14 while(flag) { 15 datagramReveiveSocket.receive(datagramReveivePacket); 16 System.out.println(datagramReveivePacket.getAddress().getHostAddress()+":"+new String(buf, 0, datagramReveivePacket.getLength())); 17 } 18 // 关闭资源 19 datagramReveiveSocket.close(); // 要是判断条件直接为true会永远执行不到 20 } catch (IOException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 } 25 }