• JAVA网络编程


     网络编程三要素,IP是电脑的地址,端口号是程序的标识,通过IP和端口确定网络传输对象,传输的内容需要遵从协议;

    IP

    IP是唯一的,IP表示采用IPV4,IPV6两种方法;

    IPV4

    采用32位地址长度,分成四组,采用点分十进制表示法,每组最大值为255,但最多只能容纳256*256*256*256=42亿,即最多只能容纳不到43亿的设备;容纳的设备数太少;鉴于此推出了IPV6

     

     IPV6采用128位地址长度,分成八组;可以容纳2^128个IP;采用冒分十六进制表示法;

     IPV4分为公网地址(万维网)和私有地址(局域网);以此实现多个设备共用一个IP,它的原理是多个设备共用一个公网地址,再通过路由器为每个设备分配局域网地址,因此在不同的地方,局域网是不同的。

    特殊IP:

     使用特殊IP,可以向本机传输信息,在任何场景下都正确。

    常见CMD命令

    ipconfig可以查看本机的IP地址,ping命令可以向其他设备传输信息

     

     最后一个图使用特殊地址向本机传输。

    InetAddress的使用

    使用静态方法getByName获取对象,参数为设备IP,或者设备名称,设备名称在系统->系统信息内的设备规格中查询

    1. InetAddress address= InetAddress.getByName("192.168.168.1");
    2. //参数为设备IP,或者设备名称,设备名称在系统->系统信息内的设备规格中查询

    使用getHostName,getHostAddress可以获取address对象的主机名,IP

    1. System.out.println(address.getHostName());
    2. System.out.println(address.getHostAddress());

    端口号

    端口号是程序在设备里的唯一标识;端口是由两个字节表示的整数,取值0~65535,其中0~1023的端口号用于一些知名的网络服务或应用,自己的则需要使用1024以上的端口号;一个端口号只能被一个应用程序使用。

    协议

    计算机网络中,传输数据的规则称为协议;

     OSI模型
     TCP/IP协议

    对osi做出了合并简化,分为应用层,传输层,网络层,物理链路层

    UDP协议

    UDP协议与TCP协议;

    UDP不会检查两个电脑是否连接,直接发送 ;应用于视频语音通话等,丢失数据的后果并不严重的场景,而TCP则用于传输文件等场景。

    使用UDP传输数据

     使用DatagramSocket对象作为发送载体;DatagramPacket将终端应用,发送内容打包,传给DatagramSocket对象,DatagramSocket对象调用send方法发送,

    发送内容应该是字节数组,程序流程如下:

    1. //发送内容
    2. String stl="abcdefghijklmn";
    3. byte[]bytes1=stl.getBytes();
    4. //发送终端,包括IP和端口,这里是接收方的值
    5. InetAddress address3=InetAddress.getByName("127.0.0.1");
    6. int port1=10087;
    7. //使用DatagramPacket打包,
    8. DatagramPacket dp1=new DatagramPacket(bytes1,bytes1.length,address3,port1);
    9. DatagramSocket ds2=new DatagramSocket();
    10. //使用DatagramSocket的send方法发送
    11. ds2.send(dp1) ;
    12. //释放资源
    13. ds2.close();
    使用UDP接收数据

    在运行时应该向运行接收端,在运行发送端;

    1. //接收时要绑定端口;不同于发送;
    2. DatagramSocket ds4=new DatagramSocket(10087);
    3. //接收数据包
    4. byte[]bytes3=new byte[1024];
    5. DatagramPacket dp2=new DatagramPacket(bytes3,bytes3.length);
    6. //开始接收
    7. ds4.receive(dp2);
    8. //解析数据包
    9. byte[]data=dp2.getData();
    10. int len=dp2.getLength();
    11. InetAddress address4=dp2.getAddress();
    12. int port3=dp2.getPort();
    13. System.out.println("接收到数据"+new String(data,data.length));
    14. System.out.println("该数据是从"+address4+"这台电脑中的"+port3+"这个端口发出的");
    15. //释放资源
    16. ds4.close();

    接收端的receive方法在没接收消息前一直在阻塞态,直到接收完成;

    UDP通信方式:

    单播,广播,组播

    组播:组播的IP地址,代表了一组电脑,发给组播就是发给这些电脑;组播使用相同的端口和IP地址

    广播:

    组播,广播,单播通过不同的IP地址实现

    组播的代码实现:
    1. MulticastSocket ms=new MulticastSocket(10000);
    2. byte[]bytes=new byte[1024];
    3. InetAddress ia=InetAddress.getByName("224.0.0.1");
    4. ms.joinGroup(ia);
    5. DatagramPacket dp=new DatagramPacket(bytes,bytes.length);
    6. while (true) {
    7. ms.receive(dp);
    8. if("884".equals("sss"))break;
    9. int len=dp.getLength();
    10. byte[]data=dp.getData();
    11. String name=dp.getAddress().getHostName();
    12. String ip=dp.getAddress().getHostAddress();
    13. System.out.println("地址为"+ip+",名称为"+name+"的主机给你发送了消息: "+new String(data,0,len));
    14. }
    15. ms.close();
    广播的代码实现

    广播与单播相同,但广播要调用setBroadcast():

    Java中的广播是通过使用UDP协议来实现的。首先,我们需要在套接字上调用setBroadcast()方法,以指示套接字要广播数据包。然后,我们可以使用DatagramSocket类来创建一个套接字,并使用DatagramPacket类来创建一个数据包,其中包含要广播的消息。最后,我们通过调用socket.send(packet)方法来发送广播消息。

    1. public class BroadcastingClient {
    2. private static DatagramSocket socket = null;
    3. public static void main(String[] args) throws IOException {
    4. broadcast("Hello", InetAddress.getByName("255.255.255.255"));
    5. }
    6. public static void broadcast(String broadcastMessage, InetAddress address) throws IOException {
    7. socket = new DatagramSocket();
    8. socket.setBroadcast(true);
    9. byte[] buffer = broadcastMessage.getBytes();
    10. DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 4445);
    11. socket.send(packet);
    12. socket.close();
    13. }
    14. }
    TCP/IP协议

    使用输入输出流来传输信息,因此接收,发出的函数是不一样的。

    1. public class Server {
    2. public static void main(String[] args) throws IOException {
    3. //接收端相比于发送端多了一个ServerSocket,用于监听;
    4. //创建ServerSocket对象
    5. ServerSocket socket=new ServerSocket(10001);//Socket(10086); 三次握手
    6. //监听客户端的链接
    7. Socket s =socket.accept();
    8. //程序与端口建立输入流,输入流室是socket自带的;
    9. InputStream ss=s.getInputStream();
    10. InputStreamReader is=new InputStreamReader(ss);//按字符来接收,
    11. BufferedReader br=new BufferedReader(is);
    12. // BufferedReader bt=new BufferedReader(new
    13. //InputStreamReader(socket.getInputStream()));简写,效果一样
    14. int b;
    15. while((b=is.read())!=-1){
    16. System.out.println((char)b);
    17. }
    18. //释放资源,断开链接,关闭服务器
    19. s.close();
    20. socket.close();//四次挥手
    21. }
    22. }
    23. public class Client {
    24. public static void main(String[] args) throws IOException {
    25. Socket s=new Socket("127.0.0.1",10001); //三次握手协议
    26. OutputStream os=s.getOutputStream();
    27. os.write("aaa".getBytes());
    28. os.close();
    29. s.close();//四次挥手
    30. }
    31. }

    对于中文Server需要使用转换流转换;

    1. public class Server {
    2. public static void main(String[] args) throws IOException {
    3. ServerSocket ss=new ServerSocket(10001);
    4. //等待链接
    5. Socket socket=ss.accept();
    6. InputStream is=socket.getInputStream();
    7. InputStreamReader isr=new InputStreamReader(is);
    8. int b;
    9. while((b=isr.read())!=-1)
    10. {
    11. System.out.println((char)b);
    12. }
    13. socket.close();
    14. ss.close();
    15. }
    16. }
    TCP/IP通信程序-三握四挥

    三次握手:客户端发送连接请求->服务器返回响应->客户端再次发出确认信息,建立连接;

     四次挥手

    客户端发出取消连接请求->服务器返回响应,表示受到请求->服务器处理完数据后,发出确认取消消息->客户端再次发送确认消息,连接取消

  • 相关阅读:
    qtcreator调试webkit
    Unity编辑器扩展: 程序化打图集工具
    Emgu CV4图像处理之Canny边缘检测和图像阈值化13(C#)
    优秀的ui设计作品(合集)
    基于Sikuli GUI图像识别框架的PC客户端自动化测试实践
    @EnableAutoConfiguration记录一下
    【ATT&CK】ATT&CK视角下的水坑钓鱼攻防战法
    卡尔曼滤波(Kalman Filter)原理浅析-数学理论推导-2
    C中结构体和C++类各自对象的大小——C++
    沉浸式视听体验:全景声技术是如何实现的?
  • 原文地址:https://blog.csdn.net/qq_41790844/article/details/133346868