项目需要就使用了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:好久不写类的方法封装了,不得不去翻基础知识,汗。今天好好加油吧,纪念大三的暑假!