黑马程序员------Socket编程之UDP

 ------- 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("接收数据时错误");
	}
    }

}




你可能感兴趣的:(黑马程序员------Socket编程之UDP)