Java网络编程——基于UDP的Socket编程

原创 2016年06月01日 11:35:50

一、基于UDP的Socket编程

1、UDP协议:UDP协议(用户数据协议)是无连接的、不可靠的、无序的通信协议,使用UDP进行通信不需要像TCP协议那样先建立连接,因此UDP的传输速率要快一些。UDP以数据报作为数据传输的载体,在使用UDP进行数据传输时,首先需要将数据封装数据报(Datagram),在数据报中指明数据所要到达的主机地址和端口号,再将数据报发送出去。

2、Java提供的基于UDP协议操作类有:DatagramPacket数据报类,DatagramSocket数据报通信类。


二、基于UDP的Socket实例

1、单线程情况下,服务器只与一个客户端通信

服务器端:

UDPServer.java

public class UDPServer {
	public static void main(String[] args) {
		try {
			//1、创建DatagramSocket对象,并绑定端口
			DatagramSocket socket = new DatagramSocket(9999);
			System.out.println("------我是服务器,准备接收客户端请求------");
			
			//2、定义数据报,用于接收客户端的信息
			byte[] data = new byte[1024];
			DatagramPacket packet = new DatagramPacket(data, data.length);
			//3、接收数据报,在接收到数据报之前该方法一直处于阻塞状态
			//数据报对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。
			socket.receive(packet);
			
			String msg = new String(packet.getData(), 0, packet.getLength());
			System.out.println("收到客户端信息:" + msg);
			
			//4、定义向客户端发送信息的数据报,其中包含客户端的地址、端口信息
			InetAddress address = packet.getAddress();
			int port = packet.getPort();
			byte[] myMsg = new String("我是服务器,我已经收到了你的请求!").getBytes();
			DatagramPacket reply = new DatagramPacket(myMsg, myMsg.length, address, port);
			//5、向客户端发送数据报
			socket.send(reply);
			
			//6、关闭socket
			socket.close();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
客户端:

UDPClient.java

public class UDPClient {
	public static void main(String[] args) {
		try {
			//1、定义数据报的信息,包含数据、服务器的地址、端口等
			InetAddress address = InetAddress.getByName("localhost");
			System.out.println("------我是客户端,准备向服务器发送请求------");
			byte[] data = new String("我是客户端,你收到了我的请求吗?").getBytes();
			DatagramPacket packet = new DatagramPacket(data, data.length, address, 9999);
			
			//2、定义DataframSocket对象
			DatagramSocket socket = new DatagramSocket();
			//3、向服务器发送数据报信息
			socket.send(packet);
			
			//4、定义接收到服务器的数据报信息
			byte[] reciveMsg = new byte[1024];
			DatagramPacket reply = new DatagramPacket(reciveMsg, reciveMsg.length);
			//5、接收到服务器的响应
			socket.receive(reply);
			String msg = new String(reciveMsg, 0, reply.getLength());
			System.out.println("收到服务器应答:" + msg);
			
			//6、关闭socket
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

2、多线程情况下,一个服务器可以与多个客户端通信

服务器主类:

UDPServerThreadMain.java

public class UDPServerThreadMain {
	public static void main(String[] args) {
		try {
			DatagramSocket socket = new DatagramSocket(9999);
			byte[] data = new byte[1024];
			System.out.println("------服务器已经启动,准备接收客户端请求------");
			
			while(true) {
				//定义数据报一定要放在循环内,不然在第一次循环的时候将不输出数据,以后每次循环都将输出上次一循环的内容
				//如果写在循环外,因为socket.receive(packet)是synchronized的,会锁死对象packet,
				//主线程锁死packet对象后,在start()的子线程中不能调用  packet.属性,packet.方法()
				//如果卸载循环内,在while循环到第二次时,new了一个新的packet对象,主线程锁住新对象,上一次的对象自动解锁,
				//上一次循环时新建的子线程中的对packet进行调用的方法才可以开始执行。
				DatagramPacket packet = new DatagramPacket(data, 0, data.length);
				socket.receive(packet);
				UDPServerThread thread = new UDPServerThread(socket, packet, data);
				thread.start();
			}
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}


服务器处理线程类:

UDPServerThread.java

public class UDPServerThread extends Thread {

	public byte[] data;
	
	public DatagramPacket packet;
	
	public DatagramSocket socket;
	
	public UDPServerThread(DatagramSocket socket, DatagramPacket packet, byte[] data) {
		this.socket = socket;
		this.packet = packet;
		this.data = data;
	}
	
	public void run() {
		System.out.println("收到客户端请求:" + new String(data, 0, packet.getLength()));
		
		byte[] msg = new String("我是服务器,我已经收到了你的请求!").getBytes();
		InetAddress address = packet.getAddress();
		int port = packet.getPort();
		DatagramPacket reply = new DatagramPacket(msg, msg.length, address, port);
		
		try {
			socket.send(reply);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
客户端代码与单线程情况下的客户端代码一样。




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JAVA学习笔记Day24——javaTCP UDP网络编程Socket总结

1、Socket可以说是对网络的一种抽象,通过它可以对网络中的数据进行读写,根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的。 ...

网络编程——UDP Socket

网络编程——Socket(Linux套接字编程) 讲述了TCP协议下的Socket传输规则。另外一种则是UDP下的传输,如下: 在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连...

网络编程(6)—— 基于Windws系统的UDP协议socket服务器和客户端

利用UDP协议实现一个简单客户端和服务器聊天的功能, 服务器端代码: #include #include #include #include #define BUF_SIZE 30 void e...

java udp socket 网络编程

JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法

UDP既可以单播也可以组播 一,单播 单播的过程为 发送方: InetAddress destAddr = InetAddress.getByName("192.168.4.199");// 发送的目...
  • kkgbn
  • kkgbn
  • 2016-08-19 12:13
  • 1310

Java-Socket网络编程TCP和UDP的使用

/*  * java.net.InetAddress:此类表示互联网协议 (IP) 地址。  *  * 两个静态方法:可以获取InetAddress对象  *     static Ine...

Java笔记(9)-网络编程、URL、InetAddress、套接字、Socket、ServerSocket、多线程、UDP、广播数据包、远程调用

不必说碧绿的菜畦,光滑的石井栏,高大的皂荚树,紫红的桑葚;也不必说鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上,轻捷的叫天子(云雀)忽然从草间直窜向云霄里去了。 Java网络编程 URL 类 InetAd...

java网络编程基础夯实06-TCP,UDP,HTTP,Socket简介

TCP,UDP,HTTP,Socket简介 一. TCP和UDP协议 TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,...

Java笔记6 网络编程<1>Socket、UDP

23天-01-网络编程(概述) l  网络编程 Ø  网络模型 Ÿ   OSI参考模型。 Ÿ   TCP/IP参考模型 Ø  网络通信要素 Ÿ   IP地址 Ÿ &#...

java 网络编程(Socket) TCP/UDP 总结案例

网络编程:关注的是底层的数据传输 网页编程:数据的展示 1、基本概念 一、网络:将不同的计算机连接在一起局域网 城域网 互联网 二、地址:Ip地址确定网络上的绝对的地址位置  à房子的地址 三、...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)