概念
- 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();
}
}
}
}