首页 > 其他分享 >使用udp广播实现简单局域网群聊

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

时间:2023-03-22 10:02:36浏览次数:36  
标签:udp java String new 局域网 import 群聊 ds dp


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/>
*
* 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 "";
}
}
}

}

标签:udp,java,String,new,局域网,import,群聊,ds,dp
From: https://blog.51cto.com/u_15955464/6142092

相关文章

  • Windows 系统下怎么获取 UDP 本机地址
    Windows系统下怎么获取UDP本机地址我们知道UDP获取远端地址非常简单,通常接口recvfrom就可以直接获取到远端的地址和端口;如果获取UDP的本机地址就需要点特殊处理......
  • udp编程实例1
    #include<signal.h>#include<stdio.h>#include<errno.h>#include<unistd.h>#include<stdlib.h>#include<time.h>#include<string.h>#include<arpa/inet.h>......
  • go 实现udp通信
    go实现udp通信 udp:不需要建立连接就能直接进行数据发送和接收,属于不可靠的、没有时序的通信,但是UDP协议的实时性比较好,通常用于视频直播相关领域。服务端实现代码:......
  • 当我把ChatGPT拉进群聊里,我的朋友都玩疯了
    前言近期ChatGPT可以说是太火了,问答、写论文、写诗、写代码,只要输入精确的prompt,他的表现总是让人惊喜。本着打不过就加入的原则。要是把ChatGPT拉入群聊中,会是怎样一番场......
  • 能不能说一说 TCP 和 UDP 的区别?
    TCP是一个面向连接的、可靠的、基于字节流的传输层协议。而UDP是一个面向无连接的传输层协议。和 UDP 相比,TCP有三大核心特性:面向连接。所谓的连接,指的是客户端和服......
  • 用户数据报协议 UDP
    用户数据报协议UDPUDP概述用户数据报协议UDP只在IP的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及查错检测的功能UDP的主要特点UDP是无连......
  • 局域网内传输大文件方法,飞鸽传书
    由于qq最大只能传输4G的文件,针对大文件,比如操作系统ISO等,可以使用飞鸽传书; 官网:http://ipmsg.org.cn/   ......
  • 计算机网络与通信之局域网
    局域网这个词大家听起来应该不陌生,但他是如何工作的呢?通过这篇文章一起来学习一下:​​局域网概述​​​​共享式以太网​​​​交换式以太网​​​​高速局域网​​​​......
  • UDP聊天实现
    1publicclassA{2publicstaticvoidmain(String[]args)throwsIOException{3DatagramSocketsocket=newDatagramSocket(8888);4......
  • UDP协议类_DatagramSocket——广播代码实现
    广播地址:255.255.255.255 publicclassClientDemo{publicstaticvoidmain(String[]args)throwsIOException{//广播DatagramSocket客户端发送......