网络工程用UDP协议和多线程实现群聊。(用map来存取地址信息)
2017-08-09 21:37
369 查看
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Set;
先创建一个服务器端用来存储对话和ip地址信息。用map保证ip不能重复。
public class Server extends Thread {
long l = 2000;
// 定义一个Stringbuffer
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DatagramSocket ds;
HashMap<String, InetAddress> al;
static StringBuilder sb = new StringBuilder();
public Server(DatagramSocket ds,HashMap<String, InetAddress> al) {
this.ds = ds;
this.al = al;
}
@Override
public synchronized void run() {
Set<String> ks = al.keySet();
for (String k : ks) {
// 创建一个需要发送的数据包
DatagramPacket ndp = new DatagramPacket(sb.toString().getBytes(),
sb.toString().getBytes().length, al.get(k), ds.getPort());
try {
//向所有用户发送改动的数据包
ds.send(ndp);
// Thread.sleep(l);
// l += 1000;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
//创建一个服务器端口。
DatagramSocket ds = new DatagramSocket(8888);
HashMap<String, InetAddress> al = new LinkedHashMap<String, InetAddress>();
while (true) {
byte[] b = new byte[102400];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
String msg = new String(b);
System.out.println(msg.trim());
InetAddress address = dp.getAddress();
al.put(dp.getAddress().getHostAddress(), dp.getAddress());
// 推送数据给所有ip但不包括自己
sb = new StringBuilder();
sb.append(dp.getAddress().getHostAddress()).append(":")
.append(msg.trim()).append("\t")
.append(sdf.format(new Date())).append("\n");
Server s = new Server(ds,al);
//启动多线程
s.start();
}
}
}
//发送端
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 Client extends Thread {
DatagramSocket ds;
public Client(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
while (true) {
byte b[] = new byte[102400];
DatagramPacket dp = new DatagramPacket(b, b.length);
try {
ds.receive(dp);
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(new String(b).trim());
}
}
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(9999);
Client c = new Client(ds);
c.start();
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String msg = br.readLine();
DatagramPacket ndp = new DatagramPacket(msg.getBytes(),
msg.getBytes().length,
InetAddress.getByName("192.168.1.43"), 8888);
ds.send(ndp);
}
}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Set;
先创建一个服务器端用来存储对话和ip地址信息。用map保证ip不能重复。
public class Server extends Thread {
long l = 2000;
// 定义一个Stringbuffer
static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DatagramSocket ds;
HashMap<String, InetAddress> al;
static StringBuilder sb = new StringBuilder();
public Server(DatagramSocket ds,HashMap<String, InetAddress> al) {
this.ds = ds;
this.al = al;
}
@Override
public synchronized void run() {
Set<String> ks = al.keySet();
for (String k : ks) {
// 创建一个需要发送的数据包
DatagramPacket ndp = new DatagramPacket(sb.toString().getBytes(),
sb.toString().getBytes().length, al.get(k), ds.getPort());
try {
//向所有用户发送改动的数据包
ds.send(ndp);
// Thread.sleep(l);
// l += 1000;
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
//创建一个服务器端口。
DatagramSocket ds = new DatagramSocket(8888);
HashMap<String, InetAddress> al = new LinkedHashMap<String, InetAddress>();
while (true) {
byte[] b = new byte[102400];
DatagramPacket dp = new DatagramPacket(b, b.length);
ds.receive(dp);
String msg = new String(b);
System.out.println(msg.trim());
InetAddress address = dp.getAddress();
al.put(dp.getAddress().getHostAddress(), dp.getAddress());
// 推送数据给所有ip但不包括自己
sb = new StringBuilder();
sb.append(dp.getAddress().getHostAddress()).append(":")
.append(msg.trim()).append("\t")
.append(sdf.format(new Date())).append("\n");
Server s = new Server(ds,al);
//启动多线程
s.start();
}
}
}
//发送端
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 Client extends Thread {
DatagramSocket ds;
public Client(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
while (true) {
byte b[] = new byte[102400];
DatagramPacket dp = new DatagramPacket(b, b.length);
try {
ds.receive(dp);
Thread.sleep(2000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(new String(b).trim());
}
}
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(9999);
Client c = new Client(ds);
c.start();
while (true) {
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
String msg = br.readLine();
DatagramPacket ndp = new DatagramPacket(msg.getBytes(),
msg.getBytes().length,
InetAddress.getByName("192.168.1.43"), 8888);
ds.send(ndp);
}
}
}
相关文章推荐
- {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习
- Linux网络编程5——使用UDP协议实现群聊
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
- Java网络编程 - 基于UDP协议 实现简单的聊天室程序
- Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
- Rhyme/ java TCP网络编程 聊天室(群聊与私聊)TCP、多线程、IO流编程完整代码实现
- 网络编程应用:基于UDP协议【实现聊天程序】--练习
- 网络实现UDP协议连接
- 在Redhat4下实现动态网络地址分配服务和网络信息服务
- 错误信息:通常每个套接字地址(协议/网络地址/端口)只允许使用一次.
- Linux网络编程5——使用UDP协议实现群聊
- 基于tcp/udp socket多线程并发实现对二进制协议的压力测试
- Node.js与网络:Node.js对TCP、UDP、Socket、HTTP等协议的实现和支持
- 错误信息:通常每个套接字地址(协议/网络地址/端口)只允许使用一次.
- 黑马程序员——8.网络编程(网络模型、网络地址、传输协议(UDP、TCP/IP)、客户端和服务器端、URL)
- 在网络7层协议中,如果想使用UDP协议达到TCP协议的效果,可以在哪层做文章?(QQ 为什么采用 UDP 协议,而不采用 TCP 协议实现?)
- 网络编程应用:基于UDP协议【实现文件下载】--练习
- 网络协议 -- UDP协议(5)UDP的IOCP实现
- Node.js与网络:Node.js对TCP、UDP、Socket、HTTP等协议的实现和支持