- 确定对方电脑IP地址。(设备在网络中的地址,唯一标识。)
- 确定接收数据的端口号。(应用程序在设备中的唯一标识)。
- 使用的协议是什么。(数据在网络中的传输规则)
IPV4 地址分类形式
- 公网地址(万维网使用) 和 私有地址(局域网使用)
- 192.168. 开头的就是私有地址 , 范围为 192.168.0.0--192.168.255.255 , 专门为组织机构内部使用,以此节省IP.
127.0.0.1 和 路由器分配的 IP 地址是不同的
InetAddress 类的使用
public static void main(String[] args) throws UnknownHostException {
// IP 对象
InetAddress address = InetAddress.getByName("192.168.6.100");
System.out.println(address);
InetAddress address1 = InetAddress.getByName("zhangmeng");
System.out.println(address1);
// 没有这台电脑 找不到的话 就会等十几秒 输出 IP地址
System.out.println(address.getHostName());
System.out.println(address1.getHostName());
}
udp 协议 (发送数据不检查网络 )
- 用户数据报协议。
- 面向无连接的通信协议。
- 速度快,有大小限制 一次最多发送64K,数据不安全,容易丢失数据。
- 应用举例 : 语音通话,在线视频。
TCP 协议 (发送数据会检查网络)
- 传输控制协议
- 面向连接的通信协议
- 速度慢,没有大小限制,数据安全。
- 应用举例 : 文字聊天,发送邮件,下载软件。
使用 udp 协议发送数据
public static void main(String[] args) throws IOException {
// 创建对象 : 空参 所有可用端口中随机一个进行使用
DatagramSocket datagramSocket = new DatagramSocket();
//发送数据
String msg = "你好!socket";
byte[] bytes = msg.getBytes();
InetAddress zhangmeng = InetAddress.getByName("zhangmeng");
int port = 10086;
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,zhangmeng,port);
// 发送数据
datagramSocket.send(datagramPacket);
// 释放资源
datagramSocket.close();
}
使用 udp 协议接收数据
public static void main(String[] args) throws IOException {
// 找快递公司
DatagramSocket datagramSocket = new DatagramSocket(10086);
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
// receive 是阻塞的方法 建议使用异步线程
datagramSocket.receive(datagramPacket);
// 解析数据包
InetAddress address = datagramPacket.getAddress();
System.out.println("从哪台电脑发来 ?" + address);
System.out.println("哪个端口号?" + datagramPacket.getPort());
System.out.println("发送的数据是: " + new String(datagramPacket.getData()));
System.out.println("ip + 端口号 " + datagramPacket.getSocketAddress());
}
udp 通信模拟多人聊天室
public class Receive {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(10086);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
DatagramPacket datagramPacket;
while (true) {
datagramPacket = new DatagramPacket(new byte[1024], 1024);
datagramSocket.receive(datagramPacket);
String msg = new String(datagramPacket.getData());
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
System.out.println( "从" + datagramPacket.getPort() + "发来的信息:" + msg);
}
datagramSocket.close();
}
}
public class Send {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket();
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String s = read.readLine();
// 给 10086 发送数据
byte[] bytes = s.getBytes();
InetAddress zhangmeng = InetAddress.getByName("zhangmeng");
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, zhangmeng, 10086);
datagramSocket.send(dp);
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
System.out.println(s);
if (s.equals("拜拜")) break;
}
datagramSocket.close();
}
}
UDP 通信方式
- 单播 :发送端只给一台电脑发送数据
- 组播 : 发送端 一个 ,但是接收端的电脑可以是一组。
- 广播 : 给局域网内所有电脑发送。(修改地址为 255.255.255.255 即可)
组播编写
- send.
public class MulticastSocketDemo {
public static void main(String[] args) throws IOException {
MulticastSocket multicastSocket = new MulticastSocket();
InetAddress multicastAddress = InetAddress.getByName("224.0.0.1");
// 将当前电脑添加到组播组中 加和不加都是组播
// multicastSocket.joinGroup(multicastAddress);
// 像一组电脑发送数据
String msg = "你好!socket";
byte[] bytes = msg.getBytes();
int port = 10086;
// 数据包 由单播地址 改为组播即可
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,multicastAddress,port);
// 发送数据
multicastSocket.send(datagramPacket);
// 释放资源
multicastSocket.close();
}
}
- receive1
public class MulticastSocketReceiveMessage {
public static void main(String[] args) throws IOException {
// 找快递公司
MulticastSocket datagramSocket = new MulticastSocket(10086);
InetAddress byName = InetAddress.getByName("224.0.0.2");
datagramSocket.joinGroup(byName);
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
datagramSocket.receive(datagramPacket);
// 解析数据包
InetAddress address = datagramPacket.getAddress();
System.out.println("从哪台电脑发来 ?" + address.getHostName());
System.out.println("哪个端口号?" + datagramPacket.getPort());
System.out.println("发送的数据是: " + new String(datagramPacket.getData()));
System.out.println("ip + 端口号 " + datagramPacket.getSocketAddress());
}
}
public class MulticastSocketReceiveMessage1 {
public static void main(String[] args) throws IOException {
// 找快递公司
MulticastSocket datagramSocket = new MulticastSocket(10086);
InetAddress byName = InetAddress.getByName("224.0.0.1");
datagramSocket.joinGroup(byName);
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
datagramSocket.receive(datagramPacket);
// 解析数据包
InetAddress address = datagramPacket.getAddress();
System.out.println("从哪台电脑发来 ?" + address.getHostName());
System.out.println("哪个端口号?" + datagramPacket.getPort());
System.out.println("发送的数据是: " + new String(datagramPacket.getData()));
System.out.println("ip + 端口号 " + datagramPacket.getSocketAddress());
}
}
public class MulticastSocketReceiveMessage2 {
public static void main(String[] args) throws IOException {
// 找快递公司
MulticastSocket datagramSocket = new MulticastSocket(10086);
InetAddress byName = InetAddress.getByName("224.0.0.1");
datagramSocket.joinGroup(byName);
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
datagramSocket.receive(datagramPacket);
// 解析数据包
InetAddress address = datagramPacket.getAddress();
System.out.println("从哪台电脑发来 ?" + address.getHostName());
System.out.println("哪个端口号?" + datagramPacket.getPort());
System.out.println("发送的数据是: " + new String(datagramPacket.getData()));
System.out.println("ip + 端口号 " + datagramPacket.getSocketAddress());
}
}
实验结果截图 。 同一组的电脑收到了 广播