IP
定位主机
单播(单对单)
组播(单对多): 224.0.1.0 ~ 239.255.255.255
广播(单对全部): 255.255.255.255
端口
1024 ~ 65535
定位主机中的应用
InetAddress
网络协议类
方法 | 返回值 | 说明 |
---|---|---|
InetAddress.getByName(String str) | 构造方法 | str可以是主机名,也可以是IP |
getHostName() | String | 获取主机名 |
getHostAddress() | String | 获取IP地址 |
UDP:
不建立连接的传输协议
只发送 不能确定对方是否收到
DatagramPacket
数据包
方法 | 返回值 | 说明 |
---|---|---|
DatagramPacket(byte[] bs, int i1, InetAddress ia, int i2) | 构造方法 | 创建发送数据包(发送 bs ,长度为 i1 ,发送到 ia 的 i2 端口号) |
DatagramPacket(byte[] bs, int i) | 构造方法 | 创建接受数据包 |
getLength() | int | 获取数据长度 |
getData() | byte[] | 获取数据 |
DatagramSocket
数据包收发器
方法 | 返回值 | 说明 |
---|---|---|
DatagramSocket() | 构造方法 | 创建数据收发器,并将其绑定任意可用端口号 |
DatagramSocket(int i) | 构造方法 | 创建数据收发器,并将其绑定 i 端口号 |
send(DatagramPacket d) | void | 发送数据 |
receive(DatagramPacket d) | void | 等待接收数据(若没接收则一直等待) |
close() | void | 关闭数据收发器,释放资源 |
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Demo {
public static void main(String[] args) throws Exception {
new Demo1().start(); //开启接收端线程
InetAddress ia = InetAddress.getByName("192.168.36.122"); //我的IP地址
byte[] bs = "随风奔跑自由是方向".getBytes("UTF-8");
DatagramPacket data = new DatagramPacket(bs, bs.length, ia, 8008); //对方用此端口接收
DatagramSocket ds = new DatagramSocket(8118); //用此端口发送
ds.send(data);
Thread.sleep(2000);
ds.close();
}
}
class Demo1 extends Thread {
@Override
public void run() {
try {
byte[] bs = new byte[1024 * 1024];
DatagramPacket data = new DatagramPacket(bs, bs.length);
DatagramSocket ds = new DatagramSocket(8008);
ds.receive(data);
byte[] bytes = data.getData();
int length = data.getLength();
System.out.println(new String(bytes, 0, length, "UTF-8"));
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
随风奔跑自由是方向
MulticastSocket
组播收发器
方法 | 返回值 | 说明 |
---|---|---|
MulticastSocket() | 构造方法 | 创建组播数据收发器,并将其绑定任意可用端口号 |
MulticastSocket(int i) | 构造方法 | 创建组播数据收发器,并将其绑定 i 端口号 |
joinGroup(InetAddress ia) | void | 添加到组 ia 中的 IP 需为组播地址 |
close() | void | 关闭数据收发器,释放资源 |
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
public class Demo {
public static void main(String[] args) throws Exception {
new Demo1().start();
new Demo1().start(); //开启接收端线程
InetAddress ia = InetAddress.getByName("234.234.234.234"); //组播地址
byte[] bs = "追逐雷和闪电的力量".getBytes("UTF-8");
DatagramPacket data = new DatagramPacket(bs, bs.length, ia, 8008);
MulticastSocket ds = new MulticastSocket(8118);
ds.joinGroup(ia); //加入组
ds.send(data);
Thread.sleep(2000);
ds.close();
}
}
class Demo1 extends Thread {
@Override
public void run() {
try {
InetAddress ia = InetAddress.getByName("234.234.234.234");
byte[] bs = new byte[1024 * 1024];
DatagramPacket data = new DatagramPacket(bs, bs.length);
MulticastSocket ms = new MulticastSocket(8008);
ms.joinGroup(ia); //加入组
ms.receive(data);
byte[] bytes = data.getData();
int length = data.getLength();
System.out.println(new String(bytes, 0, length, "UTF-8"));
ms.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果
追逐雷和闪电的力量
追逐雷和闪电的力量
TCP:
三次握手,四次挥手
比较可靠的传输协议
Socket
客户端
方法 | 返回值 | 说明 |
---|---|---|
Socket(String str, int i) | 构造方法 | 创建一个客户端对象,str:地址,i:端口 |
getOutputStream() | OutputStream | 创建一个字节输出流 |
getInputStream() | InputStream | 创建一个字节输入流 |
shutdownOutput() | void | 仅关闭字节输出流, 若使用 字节流.close() 关闭会导致Socket一起关闭 |
shutdownInput() | void | 仅关闭字节输入流 |
close() | void | 关闭数据收发器,释放资源 |
ServerSocket
服务器端
方法 | 返回值 | 说明 |
---|---|---|
ServerSocket(int) | 构造方法 | 创建一个服务器端对象,i:端口 |
accept() | Socket | 等待捕获客户端连接 (未捕获到则等待) |
close() | void | 关闭数据收发器,释放资源 |
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Demo {
public static void main(String[] args) throws Exception {
new Demo1().start();
Socket s = new Socket("192.168.36.122", 8008); //向我的主机 8008端口 获取连接
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
out.write("瓦蓝蓝的天上飞老鹰".getBytes("UTF-8")); //发送信息
out.flush();
byte[] bs = new byte[1024 * 1024];
int a = in.read(bs);
System.out.println(new String(bs, 0, a, "UTF-8")); //接收信息
s.close();
}
}
class Demo1 extends Thread {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(8008);
Socket s = serverSocket.accept();
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
byte[] bs = new byte[1024 * 1024];
int a = in.read(bs);
System.out.println(new String(bs, 0, a, "UTF-8")); //接收信息
out.write("我在高岗眺望北京".getBytes("UTF-8")); //发送信息
out.flush();
s.close();
serverSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果:
瓦蓝蓝的天上飞老鹰
我在高岗眺望北京