• java udp (使用类调用双通信)1


    项目需要就使用了UDP通信,做了java的双方通信,其实代码还是来自之前的udp学习代码,自己加了注释,并且优化的使用类来封装关于通信类库的使用代码

    目的是为了在安卓项目中使用时,可以通过实例化,调用方法即可,极大简单了代码的混杂程度

    当然,该程序的缺陷是:未能实现服务器循环接收,只能通信一次,下一版本改正。

    服务器代码:

    定义一个udpS.java ,udpS类的代码:

    package com.swust.udp;
    
    import java.io.*;
    import java.net.*;
    /** 
     * 服务端 
     * 1、创建服务+端口 
     * 2、准备接受容器  byte数组 
     * 3、把接收容器封装成包 DatagramPacket 
     * 4、接受数据 
     * 5、分析数据 
     */  
    
    public class udpS  {
    
        private String content="hello world,我是服务器,给你回复了,哼哼哼";
    
        private int port=5050;
    
        public void setContent(String content)
        {
            this.content=content;
        }
        public void setPort(int port)
        {
            this.port=port;
        }
    
        public void udpServerInit( )throws IOException{
               //服务器端首先创建一个DatagramSocket对象,并且指点监听的端口
                  DatagramSocket  server = new DatagramSocket(port); //使用了端口,未调用setPort时,使用默认值
                //创建一个空的DatagramPacket数据包对象并指定大小,用于接收数据
                  byte[] recvBuf = new byte[1024];
                  DatagramPacket recvPacket 
                      = new DatagramPacket(recvBuf , recvBuf.length);
                  //使用DatagramSocket的receive方法接收客户端发送的数据,在没有数据进行接收的处于堵塞状态
                  server.receive(recvPacket);
    
                  String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
                  System.out.println("接收:	" + recvStr);
                  /*
                   * 回发数据部分
                   */
                  int port_Client = recvPacket.getPort();
                  InetAddress addr = recvPacket.getAddress();
                  String sendStr =content; //使用了content属性,未调用setContent,使用默认值
                  byte[] sendBuf;
                  sendBuf = sendStr.getBytes();
                  DatagramPacket sendPacket 
                      = new DatagramPacket(sendBuf , sendBuf.length , addr , port_Client );
    
                  server.send(sendPacket);
    
                  server.close(); 
             }
    
     }

    此时,主函数的代码,使用上面的类:

    package com.swust.udp;
    
    import java.io.*;
    
    public class udpServer {  
          
        public static void main(String[] args) throws IOException  {  
            udpS  udpser=new udpS();
            udpser.setPort(8888);
            udpser.setContent("猜猜我给你回复啥");
            udpser.udpServerInit();
        }  
    }


    相应的,客户机端:

    客户机代码:

    定义一个udpC.java ,udpC类的代码:

    package com.swust.udp;
    
    import java.io.*;
    import java.net.*;
    
    /** 
     * 1、创建客户端+端口 
     * 2、准备数据 字节数组 
     * 3、给数据打包 并指定发送的目的地和端口 
     * 4、发送 
     * 5、释放 
     *  
     * 思考 : 发送有类型的数据  怎么处理 如对象  数字 等等 
     */  
    public class udpC {
        
        private String content="我是客户机1,给你发送消息了";
    
        private int port=5050;
    
        private String ip = "127.0.0.1"; 
        //设置文本内容
        public void setContent(String content)
        {
            this.content=content;
        }
        //设置端口
        public void setPort(int port)
        {
            this.port=port;
        }
        //设置IP地址
        public void setIp(String ip)
        {
            this.ip=ip;
        }
        public void udpClientInit( )throws IOException{
            //客户端也创建个DatagramSocket对象,并且指点监听的端口
            DatagramSocket client = new DatagramSocket();
            //定义要发送的一个字符串
            String sendStr =content;                //使用了content属性,未调用时用默认内容
            byte[] sendBuf;
            sendBuf = sendStr.getBytes();
            //创建一个InetAddress对象,这个对象是一个网络地址
            InetAddress addr = InetAddress.getByName(ip); //使用了ip地址属性,未调用时用默认本机地址127.0.0.1
            //创建一个DatagramPacke数据包t对象,并指定要将这个数据报包发送到网络的哪个地址以及端口号
            DatagramPacket sendPacket 
                = new DatagramPacket(sendBuf ,sendBuf.length , addr , port);//使用了端口属性,未调用时用默认值5050
            //使用DatagramSocket的对象的send()方法发送数据包
            client.send(sendPacket);
            /*
             * 接受服务器回发的消息
             */
            byte[] recvBuf = new byte[1024];
            DatagramPacket recvPacket
                = new DatagramPacket(recvBuf , recvBuf.length);
            client.receive(recvPacket);
            String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());
            System.out.println("收到: 	" + recvStr);
    
            client.close();
        } 
        
    }

    此时,主函数的代码,使用上面的类:

    package com.swust.udp;
    
    import java.io.*;
    
    public class udpClient { 
    public static void main(String[] args) throws IOException {
    
    udpC udpclient=new udpC();
    udpclient.setPort(8888);
    //udpclient.setIp("100.67.176.34");//测试网络ip是否可用,未调用时使用本机ip
    udpclient.setContent("我是客户机,你信吗");
    udpclient.udpClientInit();
    }
    
    }

    总结:这样写比较灵活吧,以后控件的内容,端口,IP可以通过形参来改变,否则安卓代码和java代码混在一起,问题很大。

            ps:好久不写类的方法封装了,不得不去翻基础知识,汗。今天好好加油吧,纪念大三的暑假!

  • 相关阅读:
    架构师维度理解 程序=数据+算法
    vuejs 中 select 动态填充数据,后台的数据
    vuejs 的错误代码,有助于理解
    graphviz 绘制架构图
    graphviz 布局和子图,表格教程
    graphviz layer 教程(非布局)
    待学习
    Linux进程管理
    TCP连接的11种状态,三次握手四次挥手原因
    Linux基本命令使用(三)
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/4749145.html
Copyright © 2020-2023  润新知