`
QING____
  • 浏览: 2255317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NIO部分:DatagramSocket实例

 
阅读更多
////////////////////////////Demo
package com.test.java;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;

public class DatagramTestMain {
	private static final int port = 30006;

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Thread server = new ServerThread();
		server.start();
		Thread client = new ClientThread();
		client.start();
		Thread.sleep(3000);
	}

	static class ServerThread extends Thread {
		@Override
		public void run() {
			try {
				DatagramSocket socket = new DatagramSocket(null);// null is
				InetSocketAddress address = new InetSocketAddress(port);//server端bind到本地端口
				socket.bind(address);
				//read
				DatagramPacket rp = new DatagramPacket(new byte[1024], 1024);
				socket.receive(rp);
				//right style
				//byte[] data = Arrays.copyOfRange(rp.getData(),rp.getOffset(), rp.getLength());
				System.out.println("server Receive :" + new String(rp.getData()));
				//reply
				InetAddress from = rp.getAddress();
				rp.setAddress(from);
				String message = "--server--" + System.currentTimeMillis();
				rp.setData(message.getBytes());
				socket.send(rp);
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	static class ClientThread extends Thread {
		@Override
		public void run() {
			try {
				//send
				DatagramSocket socket = new DatagramSocket();
				InetSocketAddress address = new InetSocketAddress(
						InetAddress.getLocalHost(), port);
				DatagramPacket sp = new DatagramPacket(new byte[1024], 1024);
				String data = "--client--" + System.currentTimeMillis();
				sp.setData(data.getBytes());
				sp.setSocketAddress(address);
				socket.send(sp);
				//block for receiving.
				socket.receive(sp);
				System.out.println("client receive:" + new String(sp.getData()));
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

/////////////////////////DatagramChannel:
public class DatagramChannelTestMain {
	private static final int port = 30006;

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Thread server = new ServerThread();
		server.start();
		Thread client = new ClientThread();
		client.start();
		Thread.sleep(3000);
	}

	static class ServerThread extends Thread {
		@Override
		public void run() {
			try {
				Selector selector = Selector.open();
				InetSocketAddress address = new InetSocketAddress(port);
				// /socket.setSoTimeout(10000);//10ms
				DatagramChannel channel = DatagramChannel.open();
				channel.configureBlocking(false);
				channel.socket().bind(address);// null is
				//channel.register(selector, SelectionKey.OP_READ);//DatagramChannel无需注册selector.
				ByteBuffer buffer = ByteBuffer.allocate(1024);
				while (true) {
					InetSocketAddress from = (InetSocketAddress)channel.receive(buffer);
					if(from == null){//如果from为null,则表示没有收到数据
						Thread.sleep(1000);
						continue;
					}
					buffer.flip();
					System.out.println("///////////////////Receive");
					System.out.println("data : " + new String(buffer.array()));
					System.out.println("time : " + System.currentTimeMillis());
					System.out.println("from : "
							+ from.getHostName());
					buffer.clear();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	static class ClientThread extends Thread {
		@Override
		public void run() {
			try {
				InetSocketAddress address = new InetSocketAddress(
						InetAddress.getLocalHost(), port);
				Selector selector = Selector.open();
				DatagramChannel channel = DatagramChannel.open();
				channel.configureBlocking(false);
				//channel.socket().connect(address);
				int count = 0;
				ByteBuffer buffer = ByteBuffer.allocate(1024);
				while (count < 100) {
					String data = "Send Time : " + System.currentTimeMillis();
					buffer.put(data.getBytes());
					buffer.flip();
					channel.send(buffer, address);//通过send指定address
					System.out.println("///////////////////Send");
					System.out.println(data);
					Thread.sleep(2000);
					buffer.clear();
					count ++;
				}
				channel.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

分享到:
评论

相关推荐

    《Java网络编程实例:Java网络编程实例》

    本书《Java网络编程实例:Java网络编程实例》显然聚焦于通过实际案例来教授这一核心技能。以下是一些主要的知识点,这些知识点通常会在书中详细讨论: 1. **TCP/IP协议基础**:首先,了解TCP/IP模型和协议栈是非常...

    UDP NIO聊天系统

    在UDP NIO聊天系统中,服务器端通常会创建一个`DatagramSocket`实例,监听特定的端口,等待来自客户端的数据包。当接收到数据包时,服务器会使用选择器注册这个通道,并进行读操作。同样,客户端也会创建一个`...

    Java网络编程实例(随书源代码)

    - **UDP连接**:DatagramSocket和DatagramPacket类支持无连接的用户数据报协议(UDP),适用于对实时性和效率有要求的应用。 3. **输入输出流**: - **网络I/O**:Java的InputStream和OutputStream类族在处理网络...

    Java网络编程实例:TP312JA S973.rar

    2. **DatagramSocket与MulticastSocket**:对于UDP(User Datagram Protocol)通信,Java提供了`DatagramSocket`,它支持无连接的数据报通信。而`MulticastSocket`则允许发送和接收组播数据包,适用于广播或多播场景...

    JAVA网络实例源代码

    2. **DatagramSocket编程**:对于无连接的UDP通信,Java提供了`java.net.DatagramSocket`和`java.net.DatagramPacket`。UDP是一种面向报文的协议,适合对实时性要求高的场景。 3. **多线程**:在C/S模式下,服务器...

    Java网络编程/Java网络编程实例

    4. **NIO(非阻塞I/O)**:Java的NIO库提供了选择器和通道的概念,使得程序可以同时处理多个连接,提高并发性能。Selector用于监听多个Channel,而Channel则连接到网络套接字或其他I/O源。 5. **HTTPClient**:Java...

    java网络编程实例

    8. **NIO(非阻塞I/O)**:Java NIO(New I/O)提供了一种更高效的数据读写方式,通过选择器(Selector)可以监听多个通道(Channel),提高服务器的并发性能。 通过对这些知识点的学习和实践,你可以掌握Java网络...

    Java网络编程

    三、Java网络编程实例 1. 基本的TCP服务器和客户端:ServerSocket监听特定端口,Socket连接到服务器,两者通过输入输出流交换数据。 2. UDP广播和多播:DatagramSocket可以发送广播或多播数据,接收者通过设定特定...

    Java.I.O.2nd.Edition

    《Java I/O 2nd Edition》这本经典著作,通过丰富的实例和详细的解释,不仅讲解了基本的I/O操作,还深入到高级主题,如NIO和网络通信,是Java开发者的必备参考资料。通过学习这本书,开发者可以更好地掌握Java I/O...

    java网络编程实例2

    9. **网络IO**:Java的NIO(Non-blocking I/O)和AIO(Asynchronous I/O)为网络编程提供了高效的I/O模型,特别是对于高并发场景,能够显著提升性能。 10. **实战案例**:书中可能包含各种实际的网络应用示例,如...

    java高手真经:网络开发卷源码

    《Java高手真经:网络开发卷源码》是一份专为Java开发者提供的宝贵资源,它聚焦于Java在网络开发领域的应用,包含丰富的源代码实例。在深入理解Java编程语言的基础上,这份资料将帮助开发者提升在网络编程方面的技能...

    Java Socket 编程

    Java Socket编程是Java网络编程中的重要组成部分,它允许两台计算机通过网络进行通信。Socket在计算机网络中扮演着客户端和服务器的角色,使得应用程序能够发送和接收数据。本篇内容将深入探讨Java Socket编程的基础...

    Java网络编程实例电子教程

    接着,教程将深入讲解Java的网络类库,如`java.net`包中的`ServerSocket`、`Socket`、`DatagramSocket`等类,以及`java.nio`非阻塞I/O的相关内容。`ServerSocket`用于创建服务器端监听点,`Socket`则用于建立客户端...

    UDP 模拟的qq项目

    - 创建`DatagramSocket`:每个通信方都需要创建一个`DatagramSocket`实例,用于发送和接收数据报。 - 准备`DatagramPacket`:数据以字节数组形式放入`DatagramPacket`,同时指定目标IP地址和端口。 - 发送数据:...

    精通Java网络编程(第二版),实例锦集,

    6. **NIO(非阻塞I/O)**:Java NIO提供了更高效的数据传输方式,通过选择器(Selector)和通道(Channel)实现非阻塞的I/O操作。学习如何使用Buffer类进行数据缓冲,以及如何注册和选择事件。 7. **HTTPS安全通信*...

    Java网络编程实例

    `DatagramSocket`和`DatagramPacket`则用于UDP(用户数据报协议)编程, UDP是无连接的,适合对实时性要求高的场景,但不保证数据的可靠传输。 在网络编程中,异常处理至关重要,因为网络连接可能出现各种不可预知...

    《java网络编程实例》配书光盘

    4. **UDP协议通讯**:`java.net.DatagramSocket`和`java.net.DatagramPacket`用于实现用户数据报协议(UDP)通信。UDP是一种无连接的、不可靠的传输协议,适合对实时性要求高但对数据完整性要求不高的场景,如视频...

    基于JAVA的UDP服务器模型源代码.zip

    本资源"基于JAVA的UDP服务器模型源代码.zip"提供了一个使用Java实现的用户数据报协议(UDP)服务器模型的实例。UDP是传输层协议,与TCP(传输控制协议)相比,它不保证数据的顺序或可靠性,但具有更低的延迟和更高的...

Global site tag (gtag.js) - Google Analytics