概念
IP地址:所有主机都会分配一个IP地址( 不重复) ipv4 4位组成0-255,网关,子掩码。端口(port):为了确定主机上的应用程序。0-65535 能是用的端口1024-65535域名:在万维网上注册的网站名称。通过域名解析变成IP地址TCP和UDP 1.TCP:面向连接(需要建立连接,打电话),可靠的(不会丢失,有顺序),没有大小限制 2.UDP:面向无连接(不需要建立连接,发短信),不可靠的(可能丢失,可能无序),一个包64KB
特殊IP 127.0.0.1 : 本机 192.168.1.1: 网关 192.168.1.255: 广播地址
UDP DatagramSocket:用来接收和发送scoket DatagramPacket:数据报
广播-》对所有机器发送 单播-》对一台机器发送 组播-》对一组机器发送 BindException:端口已经被占用(系统端口或者程序未关闭)udp发包 //建立一个监听7777端口上的数据报的scoket DatagramScoket scoket = new DatagramScoket(); //发送的信息 String msg = “发送信息”; //发送的地址 InetSocketAddress address = new InetScoketAddress(“192.168.18.249”,7777); //封装的数据报,必须给地址,才能发送出去 DatagramPacket datagramPacket = new DatagramPacket(msg.getByte( ), msg.getByte( ).length, address) //怎么去发一个数据包 //已经发送出去 socket.send(datagramPacket);
udp收包 DatagramScoket socket = new DatagramScoket(7777); //一个包的最大长度 byte[ ] buf = new byte[128]; //创建用于接收的数据报 DatagramPacket packet = new DatagramPacket( buf, buf.length); System.out.println(“等待接收报”); Scoket.receive(packet); //阻塞式方法 //程序走到了这一步,代表接收到信息 System.out.println(“信息收到了”); //消除空格 String msg = new String(packet.getData(),0,packet.getLength);
工具类 1.package udp_Demo1;
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException;
public class UdpUtils extends Thread { // DatagramSocket用于在程序之间建立传送数据报的通信连接 DatagramSocket socket;
// 网络上的两个程序通过一个双向的通信连接实现数据的交换, // 这个连接的一端称为一个socket // port(计算机的)端口 /** * shift+alt+z 快捷鍵while循環 * * @param port * 监听的端口 Berlin 2017.07.11 */ public UdpUtils(int port) { try { socket = new DatagramSocket(port); } catch (SocketException e) { e.printStackTrace(); } } // 接报 因为接收包是阻塞式方法,所以去开启新的线程去等待,否则线程就终止了 @Override public void run() { byte[] buf = new byte[1024]; DatagramPacket packet = new DatagramPacket(buf, 1024); while (true) { // 接收包工作 try { // 每次收完包,程序又会回到这里,继续监听下一个包 socket.receive(packet); System.out.println(new String(packet.getData(), 0, packet .getLength())); } catch (IOException e) { e.printStackTrace(); } } } // 发报 public void send(String content, String ip, int port) { InetSocketAddress address = new InetSocketAddress(ip, port); DatagramPacket packet = new DatagramPacket(content.getBytes(), content.getBytes().length, address); try { socket.send(packet); } catch (IOException e) { e.printStackTrace(); } }}
test1
package udp_Demo1;public class Test1 {
public static void main(String[] args) { UdpUtils udpUtils = new UdpUtils(7777); //线程开始工作 udpUtils.start(); for (int i = 0; i < 100; i++) { udpUtils.send("数据"+i, "127.0.01", 7777); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }}
