------- android培训、java培训、期待与您交流! ----------
* UDP:
* 1,不需要建立连接,将数据及源和目的封装成数据包中。
* 2,每个数据大小的限制在64k内
* 3,因为无连接,是不可靠协议。
* 4,不需要建立连接,速度快。
*
* TCP:
* 1,需要建立连接,形成传输数据的通道。
* 2,在连接中进行大量数据传输
* 3,通过三次握手完成连接,是可靠协议。
* 4,需要建立连接,速度比UDP慢
*
UDP:
主要类:DatagramSocket DatagramPacket
DatagramSocket 一个是插座 , DatagramPacket一个是包 将数据放入包中 然后通过插座 从 客户端 发送到服务端
举例: 发送一次:
首先是发送端(客户端):
import java.net.*; import java.io.*; public class UDPClient { public static void main(String[] args) throws Exception { // 1,创建UDP服务,通过DatagramSocket DatagramSocket ds = new DatagramSocket(); // 2,确定数据,并封装成数据包 DatagramSocket // (buf,buf.length,InetAddress.getByName("127.0.0.1"),10000); byte[] buf = "this is test".getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000); // 3,通过socket服务,将已有的数据包发送出去,通过send方法 ds.send(dp); // 4,关闭资源 ds.close(); } }
然后是接收端(服务端)
import java.net.*; import java.io.*; public class UDPServer { public static void main(String[] args) throws Exception { // 1,创建udp socket,建立端点 DatagramSocket ds = new DatagramSocket(10000); // 2,定义数据包,用于存储数据。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); // 3,通过服务的receeive方法将接收到的数据存入数据包中。 ds.receive(dp); // 3,通过服务的receeive方法将接收到的数据存入数据包中。 int port; //获取端口 System.out .println("ip:" + dp.getPort()); //获取数据 System.out.println("接收到了:" + new String(dp.getData(), 0, dp.getLength())); // 关闭资源 ds.close(); } }
*******************
下面使用循环的方式 以及 键盘输入的方式 达到 传输数据
是上面例子的增强:
发送端:
import java.net.*; import java.io.*; public class UDPClient { public static void main(String[] args) throws Exception { // 创建UDP服务,通过DatagramSocket DatagramSocket ds = new DatagramSocket(); // 因为用到键盘 用到转换流 BufferedReader bufr = new BufferedReader(new InputStreamReader( System.in)); // 开始读取 String line = null; while ((line = bufr.readLine()) != null) { // 如果输入886则退出客户端 if ("886".equals(line)) { break; } // 将数据转换成比特数组 byte[] buf = line.getBytes(); // 将数据打成包 DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000); // 通过socket服务,将已有的数据包发送出去,通过send方法 ds.send(dp); } ds.close(); } }
接收端:
import java.net.*; import java.io.*; public class UDPServer { public static void main(String[] args) throws Exception { // 1,创建udp socket,建立端点 DatagramSocket ds = new DatagramSocket(10000); // 2,定义数据包,用于存储数据。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); // 得到的数据 String data = new String(dp.getData(), 0, dp.getLength()); // 3,通过服务的receeive方法将接收到的数据存入数据包中 // 循环接收。 while (true) { //接收数据 ds.receive(dp); // 3,通过服务的receeive方法将接收到的数据存入数据包中。 System.out.println("ip:" + new String(dp.getAddress().getHostAddress())); System.out.println("接收到了:" + new String(dp.getData(), 0, dp.getLength())); } } }
**************************************************************************************************************************************************************************************
下面是综合性的:
需求 :编写 一个聊天程序,有收数据的部分和发数据的部分,
这两部分需要同时执行。
那就需要用到多线程技术
一个线程控制收取,一个线程控制发送
因为收和发是不一致的,所以要定义两个runfangfa
而且这两个方法要封装到不同的类中。
import java.net.*; import java.io.*; class UDPTest { public static void main(String[] args) throws Exception { DatagramSocket sendSocket = new DatagramSocket(); DatagramSocket receSocket = new DatagramSocket(10001); new Thread(new Send(sendSocket)).start(); new Thread(new Rece(receSocket)).start(); } } // 这是发送端 使用线程 继承了runnable接口 实现 run方法 class Send implements Runnable { private DatagramSocket ds; public Send(DatagramSocket ds) { this.ds = ds; } public void run() { try { // 下面就是通过键盘读数据然后封装到包中传送出去 BufferedReader bufr = new BufferedReader(new InputStreamReader( System.in)); String line = null; while ((line = bufr.readLine()) != null) { if ("886".equals(line)) { break; } byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10001); ds.send(dp); } } catch (Exception e) { throw new RuntimeException("发送数据出现错误"); } ds.close(); } } // 这是接收端 一样用线程 实现接口 重写run方法 class Rece implements Runnable { private DatagramSocket ds; public Rece(DatagramSocket ds) { this.ds = ds; } public void run() { try { while (true) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp); String ip = new String(dp.getAddress().getHostAddress()); String data = new String(dp.getData(),0,dp.getLength()); System.out.println("ip:"+ip +"说::"+data); } } catch (Exception ex) { throw new RuntimeException("接收数据时错误"); } } }