`
iaiai
  • 浏览: 2146084 次
  • 性别: 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 "";
			}
		}
	}

}
分享到:
评论

相关推荐

    局域网群聊 MFC

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

    c# 广播代码 udp

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

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

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

    局域网聊天器(c++)

    基于UDP网上聊天程序v0.2版,只有一个界面,不区分客户端和服务器端,具有接收私聊和群聊信息、上/下线、屏蔽群聊信息等功能,用户上下线通过发送广播消息,其他正在运行的程序收到广播信息后增/删上线列表,存在bug

    一个局域网聊天系统实例(VB)

    本程序采用udp进行广播,适合教学机房里群聊 在聊天过程中,可以自由更改昵称

    java源码包---java 源码 大量 实例

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码...

    java源码包2

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源...

    java源码包3

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源...

    java源码包4

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源...

    JAVA上百实例源码以及开源项目源代码

    简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 ...

    JAVA上百实例源码以及开源项目

    一个简单的CS模式的聊天软件,用socket实现,比较简单。 凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码...

Global site tag (gtag.js) - Google Analytics