Java编程使用UDP建立群聊系统代码实例

相关java类介绍

DatagramSocket

public class DatagramSocket extends Object

此类表示用来发送和接收数据报包的套接字。

数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。

在DatagramSocket上总是启用UDP广播发送。为了接收广播包,应该将DatagramSocket绑定到通配符地址,在某些实现中,将DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收.

可以通过DatagramSocket的send和receive来发送和接收数据.

public void receive(DatagramPacket p) throws IOException

从此套接字接收数据报包。当此方法返回时,DatagramPacket的缓冲区填充了接收的数据。数据报包也包含发送方的IP地址和发送方机器上的端口号。

此方法在接收到数据报前一直阻塞,数据报包对象的length字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短

如果存在安全管理器,而安全管理器的checkAccept方法不允许接收操作,则包不能被接收。

参数:

p-要放置传入数据的DatagramPacket。

抛出:

IOException-如果发生I/O错误。

SocketTimeoutException-如果先前调用了setSoTimeout且超时值已过。

PortUnreachableException-套接字连接到当前不可达的目标时可能抛出。注意,不能保证一定抛出该异常。

IllegalBlockingModeException-如果此套接字具有相关联的通道,且通道处于非阻塞模式。

public void send(DatagramPacket p) throws IOException

从此套接字发送数据报包。DatagramPacket包含的信息指示:将要发送的数据、其长度、远程主机的IP地址和远程主机的端口号

如果存在安全管理器,且套接字当前没有连接到远程地址,则此方法首先执行某些安全性检查。首先,如果p.getAddress().isMulticastAddress()为true,则此方法以p.getAddress()作为参数调用安全管理器的checkMulticast方法。如果该表达式的值为false,此方法改为调用安全管理器的以p.getAddress().getHostAddress()和p.getPort()为参数的checkConnect方法。如果不允许该操作,则每次调用安全管理器方法都会导致SecurityException。

参数:

p-将要发送的DatagramPacket。

抛出:

IOException-如果发生I/O错误。

SecurityException-如果安全管理器存在并且其checkMulticast或checkConnect方法不允许进行发送。

PortUnreachableException-套接字连接到当前不可达的目标时可能抛出。注意,不能保证一定抛出该异常。

IllegalBlockingModeException-如果此套接字具有相关联的通道,且通道处于非阻塞模式。

DatagramPacket

public final class DatagramPacket extends Object

此类表示UDP数据报包,数据报包用来实现无连接包投递服务

构造方法:

DatagramPacket(byte[]buf,intlength)

构造DatagramPacket,用来接收长度为length的数据包

DatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)

构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号

UDP群聊系统的示例

UDP是面向无连接的,群聊就是向广播地址(broadcastingaddress)发送数据,这样每个人都会收到消息;采用线程的方式,启动一个发送方线程和接收方线程,发送方读取键盘输入作为输出,接收方读到输入的信息并显示

发送方

UdpSender.java

package cn.xidian.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSender extends Thread{
	@Override
	  public void run() {
		try {
			//建立UDP的服务
			DatagramSocket socket = new DatagramSocket();
			//准备数据包发送
			//从系统输入读取输入
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in)) ;
			String line = null;
			while((line = in.readLine()) != null){
				//我做测试,写的是本机地址,群聊需要写广播地址,比如:192.168.137.255
				DatagramPacket data = new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 9090);
				//发送数据
				socket.send(data);
			}
			//关闭socket
			socket.close();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}

接收方

UdpReceiver.java

package cn.xidian.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpReceiver extends Thread {
	@Override
	  public void run() {
		try {
			//建立UDP的服务,监听端口
			DatagramSocket socket = new DatagramSocket(9090);
			//接受数据包
			byte[] temp = new byte[1024];
			DatagramPacket data = new DatagramPacket(temp, temp.length);
			Boolean flag = true;
			while(flag){
				socket.receive(data);
				//输出发送方的相关信息
				String senderAddress = data.getAddress().getHostAddress();
				String senderHostName = data.getAddress().getHostName();
				System.out.println(senderHostName+"("+senderAddress+")"+" say: " + new String(temp, 0,data.getLength()));
			}
			//关闭资源
			socket.close();
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Main方法

UdpMain.java

package cn.xidian.socket;
public class UdpMain {
	public static void main(String[] args) {
		//启动UdpReceiver线程
		UdpReceiver receiver = new UdpReceiver();
		receiver.start();
		//启动UdpSender线程
		UdpSender sender = new UdpSender();
		sender.start();
	}
}

测试结果

输入方读取键盘输入作为输出,接收方接收消息并显示发送方的ip和主机名

总结

以上就是本文关于Java编程使用UDP建立群聊系统代码实例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • java中TCP/UDP详细总结
  • 浅谈java的TCP和UDP编程(附实例讲解)
  • tcp、udp、ip协议分析_动力节点Java学院整理
  • udp协议简介_动力节点Java学院整理
  • JAVA编程实现UDP网络通讯的方法示例
  • Java简单实现UDP和TCP的示例
  • Java NIO实例UDP发送接收数据代码分享
  • 基于Java中UDP的广播形式(实例讲解)
(0)

相关推荐

  • Java NIO实例UDP发送接收数据代码分享

    Java的NIO包中,有一个专门用于发送UDP数据包的类:DatagramChannel,UDP是一种无连接的网络协议, 一般用于发送一些准确度要求不太高的数据等. 完整的服务端程序如下: public class StatisticsServer { //每次发送接收的数据包大小 private final int MAX_BUFF_SIZE = 1024 * 10; //服务端监听端口,客户端也通过该端口发送数据 private int port; private DatagramChann

  • 浅谈java的TCP和UDP编程(附实例讲解)

    TCP 客户端: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class MyClient { public static void main(String[] args) throws Exception{ Socket socket = null; BufferedReader in = n

  • JAVA编程实现UDP网络通讯的方法示例

    本文实例讲述了JAVA编程实现UDP网络通讯的方法.分享给大家供大家参考,具体如下: UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议. 在OSI模型中,在第四层--传输层,处于IP协议的上一层.UDP有不提供数据包分组.组装和不能对数据包进行排序的缺点: 也就是说,当报文发送之后,是无法得知其是否安全完整到达的.UDP用来支持那些需要在计算机之间传输数据的网络应用. 采用UDP协议要先把数据定义成数据报(Datagram)并在数据报中指明数据所要达到

  • 基于Java中UDP的广播形式(实例讲解)

    UDP---用户数据报协议,是一个简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地 ,也不能保证数据包到达的顺序.由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快. 在Java中UDP的实现: * UDP: * 客户端: * 1.创建用于UDP通信的socket对象---DatagramSocket(用于UDP数据的发送和接收)---数据报套接字 * 2.准备数据,封装包

  • Java简单实现UDP和TCP的示例

    TCP实现 TCP协议需要在双方之间建立连接,通过输入输出流来进行数据的交换,建立需要通过三次握手,断开需要四次挥手,保证了数据的完整性,但传输效率也会相应的降低. 简单的TCP实现 //服务端 public class TcpServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8886); // 建立服务端,ip为本机i

  • udp协议简介_动力节点Java学院整理

    1.UDP简要介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议. 2.UDP协议头 UDP端口号 由于很多软件需要用到UDP协议,所以UDP协议必须通过某个标志用以区分不同的程序所需要的数据包.端口号的功能就在于此,例如某一个UDP程序A在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000的UDP包都会交给该程序.端口号理论上可以有2^16这么多.因为它的长度是16个bit UDP

  • tcp、udp、ip协议分析_动力节点Java学院整理

    互连网早期的时候,主机间的互连使用的是NCP协议.这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能.为了改善这种缺点,大牛弄出了TCP/IP协议.现在几乎所有的操作系统都实现了TCP/IP协议栈. TCP/IP协议栈主要分为四层:应用层.传输层.网络层.数据链路层,每层都有相应的协议,如下图 所谓的协议就是双方进行数据传输的一种格式.整个网络中使用的协议有很多,所幸的是每一种协议都有RFC文档.在这里只对IP.TCP.UDP协议头做一个分析. 首先来看看在网络

  • java中TCP/UDP详细总结

    TCP/UDP:TCP主要是面向连接的协议,它包含有建立和拆除连接,保证数据流的顺序和正确性等功能. 每次对TCP中间的数据操作相当于对一个数据流进行访问.它最典型的特征就是那三次握手的建立连接过程.Server端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求.典型的处理步骤如下: 1. 构建一个ServerSocket实例,指定本地的端口.这个socket就是用来监听指定端口的连接请求的. 2.重复如下几个步骤: a. 调用socket的accept()方法来获得下面客户端的连

  • Java编程使用UDP建立群聊系统代码实例

    相关java类介绍 DatagramSocket public class DatagramSocket extends Object 此类表示用来发送和接收数据报包的套接字. 数据报套接字是包投递服务的发送或接收点.每个在数据报套接字上发送或接收的包都是单独编址和路由的.从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达. 在DatagramSocket上总是启用UDP广播发送.为了接收广播包,应该将DatagramSocket绑定到通配符地址,在某些实现中,将Dat

  • Java编程实现从尾到头打印链表代码实例

    问题描述:输入一个链表的头结点,从尾巴到头反过来打印出每个结点的值. 首先定义链表结点 public class ListNode { int val; ListNode next = null; ListNode(int val){ this.val = val; } } 思路1:此题明显想到是利用栈的思想,后进先出,先遍历链表,依次将结点值进栈.最后在遍历栈出栈. public static Stack<Integer> printListReverse_Stack(ListNode li

  • Java基于NIO实现群聊系统

    本文实例为大家分享了Java基于NIO实现群聊系统的具体代码,供大家参考,具体内容如下 实例要求: 1.编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2.实现多人群聊 3.服务器端:可以监测用户上线,离线,并实现消息转发功能 4.客户端:通过 Channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到) 5.目的:进一步理解 NIO 非阻塞网络编程机制 6.示意图分析和代码 // 服务端: package com.atgui

  • Java NIO实现群聊系统

    本文实例为大家分享了Java NIO实现群聊系统的具体代码,供大家参考,具体内容如下 前面的文章介绍了NIO的三大核心组件并编写了BIO的一个demo实例,本文使用NIO写一个小应用实例,巩固并加深对NIO的理解. 实例要求: 1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞) 2)实现多人群聊 3)服务器端:可以监测用户上线,离线,并实现消息转发功能 4)客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到

  • 从入门到超神进阶的Netty群聊系统

    目录 服务端 客户端 服务端 服务端一样的需要创建BossGroup 和 WorkGroup , 然后使用ServerBootStrap 来配置Netty和启动Netty. public class NettyGroupChatServer { public static void main(String[] args) { new NettyGroupChatServer().start(); } //监听 public void start(){ //循环组 NioEventLoopGrou

  • springboot整合websocket实现群聊思路代码详解

    实现思路 发送者向服务器发送大家早上好.其它客户端可以收到对应消息. 项目展示 通过springboot引入websocket,实现群聊,通过在线websocket测试进行展示. 核心代码 pom引入jar <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2

  • Java编程Iterator迭代器设计原理及实现代码示例

    我们知道迭代器(Iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素.那么Iterator迭代器的设计原理是什么呢?迭代器问什么定义了一个借口,而不是一个类呢? 我们假设迭代器迭代数据的功能定义为了一个类,那么,会有这样的问题.不同的集合,由于数据结构不一样,所以他们的存储方式也是不一样的.也就是说,迭代器获取的时候,获取的方式是变化的,也就是不固定的.所以把这种方式定义为具体的实现是不合理的. 无论何种集合,他们肯定都有获取的功能,而且不知道什么时候就没有数据了.所有他

  • Java编程用两个栈实现队列代码分享

    题目:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 经典题,不多说,直接上代码 import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { st

  • java编程实现优先队列的二叉堆代码分享

    这里主要介绍的是优先队列的二叉堆Java实现,代码如下: package practice; import edu.princeton.cs.algs4.StdRandom; public class TestMain { public static void main(String[] args) { int[] a = new int[20]; for (int i = 0; i < a.length; i++) { int temp = (int)(StdRandom.random()*1

随机推荐