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

使用udp广播实现简单局域网群聊

    博客分类:
  • J2EE
 
阅读更多
package com.iaiai.test;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 
 * <br/>
 * Title: Main.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-1-29 上午11:41:09<br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class Main {

	private DatagramSocket ds;
	private int port;

	public Main(int port) throws IOException {
		this.port = port;
		ds = new DatagramSocket(port);
		// ds.setBroadcast(true);
	}

	public static void main(String[] args) throws Exception {
		int port = 9876;
		Main main = new Main(port);
		main.start();
	}

	void start() throws Exception {
		startServer();
		Scanner scanner = new Scanner(System.in);
		String name = "";
		while (name.isEmpty()) {
			System.out.print("请输入名称:");
			name = scanner.nextLine();
		}
		String msg = "";
		while (!"exit".equalsIgnoreCase(msg)) {
			if (!msg.isEmpty()) {
				send(name, msg);
			}
			System.out.print("输入消息:>");
			msg = scanner.nextLine();
		}
		System.exit(0);
	}

	private void send(String name, String msg) throws IOException {
		String sendMsg = encoder(name) + "," + encoder(msg);
		try {
			byte[] buf = sendMsg.getBytes("UTF-8");
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			dp.setSocketAddress(new InetSocketAddress("255.255.255.255", port));
			ds.send(dp);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

	private static String encoder(String str) {
		try {
			return URLEncoder.encode(str, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			return "";
		}
	}

	private void startServer() throws SocketException {
		ExecutorService threadPool = Executors.newCachedThreadPool();
		threadPool.submit(new UdpReceive(ds));
	}

	static class UdpReceive implements Runnable {
		private DatagramSocket ds;

		UdpReceive(DatagramSocket ds) {
			this.ds = ds;
		}

		@Override
		public void run() {
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			while (true) {
				try {
					ds.receive(dp);
					String str = new String(dp.getData(), dp.getOffset(), dp.getLength());
					String[] msgs = str.split(",");
					String name = decode(msgs[0]);
					String msg = decode(msgs[1]);
					System.out.println(name + " 说:" + msg + "   (" + dp.getSocketAddress() + ")");
					// System.out.println("收到来自:"+dp.getSocketAddress()+"的消息   "+new
					// String(dp.getData(),dp.getOffset(),dp.getLength()));
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		private static String decode(String str) {
			try {
				return URLDecoder.decode(str, "UTF-8");
			} catch (UnsupportedEncodingException e) {
				return "";
			}
		}
	}

}
分享到:
评论

相关推荐

    android实现局域网聊天 - UDP实现

    下面将详细介绍如何使用UDP在Android上实现局域网聊天功能。 首先,我们需要了解UDP的基础知识。UDP是一种无连接的、不可靠的传输协议,它不保证数据包的顺序、完整性和可靠性,但正因为如此,它的传输速度比TCP...

    基于UDP的简单局域网聊天室框架

    【基于UDP的简单局域网聊天室框架】是一种利用UDP(User Datagram Protocol)协议实现的简易聊天室系统,适用于初学者学习网络编程。这个框架主要实现了基础的群聊功能,包括用户上线、下线以及成员列表的变化显示。...

    JAVA实现局域网群聊(开源)

    在本文中,我们将深入探讨如何使用Java实现一个局域网内的多用户聊天应用程序,这是一个非常适合初学者学习UDP多播基础知识的项目。通过分析这个开源项目,我们可以了解到如何利用Java网络编程API来创建一个简单的...

    C# UDP无服务器端局域网聊天程序

    【C# UDP无服务器端局域网聊天程序】是一个基于C#编程语言开发的简易聊天应用,它利用了用户数据报协议(UDP)在局域网内实现无服务器的通信方式,允许用户进行私聊和群聊。由于UDP是一种无连接的协议,它不保证数据...

    android局域网群聊源码

    这可能通过设置服务器作为中心节点,或者使用UDP广播实现,每个设备都可以发送并接收其他设备的消息。 3. **WiFi直连技术**:在没有互联网的情况下,Android提供了WiFi直连(Wi-Fi Direct)技术,允许设备间直接...

    使用c#编写的UDP协议局域网聊天软件,实现个人聊天,群聊,发送文件和文件夹功能

    标题中的“使用C#编写的UDP协议局域网聊天软件”揭示了该程序的核心技术和应用场景。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,它以较小的开销提供快速的数据传输,适合实时性要求高的应用...

    易语言c源码,易语言S源码,易语言局域网群聊

    本文将深入探讨易语言在实现局域网群聊功能方面的应用,以及相关知识点。 首先,我们需要理解局域网群聊的基本概念。局域网群聊是指在同一网络环境下(如公司内部网络或家庭网络),多个用户通过特定的软件或协议...

    udp.rar_qt实现udp群聊

    在本文中,我们将深入探讨如何使用QT库来实现基于UDP的局域网群聊应用。 QT是一个跨平台的应用程序开发框架,特别适合用于创建图形用户界面和网络应用程序。它提供了丰富的API,使得开发者可以方便地处理网络通信,...

    局域网群聊 MFC

    为了应付老师随便写了个,很简单。! 所以传上来了 MFC UDP 群聊 局域网 广播

    易语言局域网群聊源码.rar

    在这个“易语言局域网群聊源码.rar”压缩包中,包含了实现局域网内多用户聊天功能的源代码。下面将详细介绍这个源码中的关键知识点。 首先,我们需要理解局域网(LAN)通信的基本原理。局域网是将有限范围内的...

    java 用udp,tcp协议实现的局域网聊天程序 期末大作业 可私聊,群聊

    Java编程语言在实现网络通信时,常常会使用到两种主要的传输协议:UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)。本项目是基于这两种协议实现的局域网聊天程序,具备私聊和群聊功能,尽管...

    c# 广播代码 udp

    c# 广播代码 基于局域网的udp聊天软件 能实现群聊

    UDP局域网聊天室实现.pdf

    UDP局域网聊天室的实现涉及到了网络编程的基础知识,主要使用了用户数据报协议(UDP)进行通信。UDP是一种无连接的、不可靠的传输层协议,它不保证数据包的顺序到达或重传丢失的包,但因其低延迟和高效性,在局域网...

    linux多人聊天室程序(udp协议)

    在本文中,我们将深入探讨如何使用...通过`udpser.c` 和 `udpcli.c` 文件的实现,我们可以学习到如何在Linux环境中使用UDP进行通信,并实现多客户端的实时信息交换。这个项目是学习网络编程和进程间通信的一个好起点。

    基于UDP在广域网和局域网都能通信类似QQ的聊天程序

    3. **多播与广播**:UDP支持多播和广播,这在局域网内尤其有用。多播可以将消息一次性发送给多个接收者,广播则是发送给所有网络中的设备。在聊天程序中,多播可以用于群聊或者公告发布。 4. **套接字编程**:在...

    基于UDP连接的局域网聊天程序 类似QQ

    标题中的“基于UDP连接的局域网聊天程序 类似QQ”指的是一个仿QQ的聊天软件,它使用了用户数据报协议(UDP)在局域网内实现通信功能。UDP是一种无连接的、不可靠的传输层协议,常用于实时应用,如语音聊天和在线游戏...

    UDP局域网聊天软件

    此外,为了防止广播风暴,软件可能还需要实现一种有效的组播策略,使得消息只被发送到目标用户或群聊成员,而不是整个网络。 Website for Login 可能是指该聊天软件提供了一个Web界面供用户登录。这通常是通过Web...

    UDP局域网聊天软件报告文档

    - **多播与广播**:UDP支持多播和广播,允许一个消息同时发送给多个接收者,这对于构建聊天室或群聊功能非常有用。 - **数据包编码与解析**:为了确保不同客户端间的数据交换,需要定义一套消息格式,包括消息头、...

    c# 局域网聊天 仿飞秋和飞鸽传书

    2.发送消息使用UDP,传送文件使用TCP 3.用户上线时,自动发送广播消息,而后在双方好友列表里可以互相看见 4.支持更改用户名 5.默认用户名为机器名 代码里注释写得很多,初学TCP和UDP的朋友可以此做参考。 有兴趣的...

    Linux下局域网聊天软件,文件,UDP协议

    这个项目利用了C语言的高效性和UDP(User Datagram Protocol)的简单与快速特性,来实现基本的通信功能,包括注册、登录、私聊、群聊、在线用户列表展示、下线通知以及重复登录提示。以下是对这些知识点的详细解释:...

Global site tag (gtag.js) - Google Analytics