概述:网络通信协议下,不同计算机上运行的程序,可以进行数据传输
例如,A电脑中的飞秋,发送消息给B电脑中的飞秋,需要哪些条件才能发送嗯?
IP地址
端口
协议
ip:全称为:互联网协议地址,也称IP地址,是分配给上网设备的数字标签,常见的IP分类为:ipv4和ipv6
具体可以通过百度百科了解。
常用命令:
我们ping一下博客地址,其中47.106.67.159就是我服务器电脑的ip了。可以检测当前电脑与服务器之间是否畅通,同时确定服务器的IP。
特殊IP地址:
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress供我们使用
InetAddress:此类表示Internet协议(IP)地址
具体查看JDK的官方API文档
端口:要用程序在设备中的唯一标识
端口号:用两个字节表示的数据,它的取值范围是0~65535,其中0~1023之间的端口号用于一些知名的网络服务或者应用。我们自己使用1024以上的端口号
注意:一个端口号只能被一个应用程序使用。
协议:计算机网络中,连接和通信的规则被称为网络通信协议
网络编程:就是让两台计算机进行数据交互
网络编程三要素
步骤:
代码示例。
public class ClientDemo {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
//设置要传输的数据,并转化为byte类型,不能直接穿字符串
String s = "你家孩子被录取了";
byte[] bytes = s.getBytes();
//创建主机且命名为localhost
InetAddress address = InetAddress.getByName("localhost");
//设置端口
int port = 1000;
//保存进箱子
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
socket.send(packet);
socket.close();
}
}
运行结果为空白,我们没有设置接收端,UDP协议只管发,收不收得到都不管。
步骤:
public class ServeDemo {
public static void main(String[] args) throws IOException {
//表示从1000端口接受数据
DatagramSocket socket = new DatagramSocket(1000);
//给箱子设置一个byte数组进行接收
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
socket.receive(packet);
//在控制台打印数据
System.out.println(new String(bytes));
//我们也可以通过getData()方法将箱子里的数据重新拿出,一般不需要
byte[] data = packet.getData();
System.out.println(new String(data));
//记得释放资源
socket.close();
}
}
我们运行起来,发现程序正在运行,但是没有打印出任何东西。
这很正常,因为我们并没有发送数据给它呀,这时我们保持接收端不动,去运行前面已经写好的发送端,他们端口都是1000。
我们看到效果已经出现了!
System.out.println(new String(bytes,0,packet.getLength()));
需求:
public class Serve {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(996);
while (true) {
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
socket.receive(packet);
System.out.println(new String(bytes, 0, packet.getLength()));
}
}
}
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true) {
String s = sc.nextLine();
if ("886".equals(s)){
break;
}
byte[] bytes = s.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 996;
DatagramPacket packet = new DatagramPacket(bytes,bytes.length,address,port);
socket.send(packet);
}
socket.close();
}
}
组播地址:224.0.0.0~239.255.255.255
其中224.0.0.0~224.0.0.255为预留的组播地址
组播的发送端跟单播类似,也就是跟我们已经演示过的代码类似。但是在单播中,我们是发给指定IP的电脑,在组播中,是发给组播地址。
我们可以看到下面的代码中,我们开头创建了MulticastSocket对象并传入了端口,后面再加入组IP接收数据。这就是组播的接收端示例代码:
public class Serve2 {
public static void main(String[] args) throws IOException {
MulticastSocket multicastSocket = new MulticastSocket(10000);
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//把当前计算机绑定一个组播地址,表示添加到这一组中
//注意,这里要跟发送端设置的IP一样
multicastSocket.joinGroup(InetAddress.getByName("224.0.1.0"));
multicastSocket.receive(packet);
System.out.println(new String(bytes,0,packet.getLength()));
}
}
发送端:
public class Client2 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
String s = "我是乐心湖啊";
byte[] bytes = s.getBytes();
//设置IP
InetAddress address = InetAddress.getByName("224.0.1.0");
int port = 10000;
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
socket.send(packet);
socket.close();
}
测试,只要你的小伙伴都设置了这个IP和端口(即使用了示例中的接收端),你运行发送端就可以发送 “我是乐心湖啊” 给他们了。
广播地址:255.255.255.255 (必须)
接收端跟单播没有两样。
public class Serve3 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(10000);
byte[] bytes = new byte[1024];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
socket.receive(packet);
System.out.println(new String(bytes, 0, packet.getLength()));
socket.close();
}
}
public class Client3 {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
String s = "是广播哦";
byte[] bytes = s.getBytes();
//设置IP
InetAddress address = InetAddress.getByName("255.255.255.255");
int port = 10000;
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
socket.send(packet);
socket.close();
}
}
步骤:
此时运行客户端必然报错,因为我们没有写服务端,而TCP协议通信之前必须要建立连接
public class Client4 {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 996);
OutputStream outputStream = socket.getOutputStream();
outputStream.write("hello,leixnhu".getBytes());
outputStream.close();
socket.close();
}
}
步骤:
public class Serve4 {
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(996);
Socket accept = socket.accept();
InputStream inputStream = accept.getInputStream();
int a;
while ((a = inputStream.read())!=-1){
System.out.print((char) a);
}
inputStream.close();
socket.close();
}
}