6.02基于UDP多线程的聊天室模拟

package org.westos.基于多线程的UDP编程聊天室;

import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Room {
	public static void main(String[] args) throws IOException {
		DatagramSocket ds = new DatagramSocket();
		DatagramSocket dss = new DatagramSocket(10110);
		InetAddress add = InetAddress.getByName("DESKTOP-2N4QT71");
		SendThread st = new SendThread(ds, add);
		ReceiveThread rt = new ReceiveThread(dss);
		Thread sendt = new Thread(st);
		Thread receivet = new Thread(rt);
		sendt.start();
		receivet.start();
	}
}
package org.westos.基于多线程的UDP编程聊天室;

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 SendThread implements Runnable {
	// 创建带参构造,用来接收与主线程进行通信,接收主线程中的DatagramSocket对象
	private DatagramSocket ds;
	private InetAddress add;
	
	public SendThread(DatagramSocket ds, InetAddress add) {
		this.add = add;
		this.ds = ds;
	}

	@Override
	public void run() {
		// 创建录入数据的流对象
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = null;
		try {
			// 使用循环可以不断输入
			while ((str = br.readLine()) != null) {// br.readline时可以录入键盘数据
				// 退出循环代码块
				if ("over".equals(str)) {
					break;
				}
				byte[] by = str.getBytes();
				// 创建数据包对象
				DatagramPacket dp = new DatagramPacket(by, by.length, add, 10110);
				// 发送数据
				ds.send(dp);
			}
			// 关闭Socket对象
			ds.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

package org.westos.基于多线程的UDP编程聊天室;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class ReceiveThread implements Runnable {
	// 创建带参构造,用来接收与主线程进行通信,接收主线程中的DatagramSocket对象
	private DatagramSocket ds;
	public ReceiveThread(DatagramSocket ds) {
		this.ds = ds;
	}

	@Override
	public void run() {
		// 服务器端一直处于接收数据状态,死循环
		while (true) {
			try {
				// 创建接收数据的数据报包对象
				byte[] by = new byte[1024];
				DatagramPacket dp = new DatagramPacket(by, by.length);
				// 接收数据
				ds.receive(dp);
				// 解析数据
				String ip = dp.getAddress().getHostAddress();
				by = dp.getData();
				String str = new String(by, 0, by.length);
				// 输出数据
				System.out.println("from" + ip + "data is:" + str);
				// System.out.println(str+ "消息来自于"+ip);
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
	}

}


猜你喜欢

转载自blog.csdn.net/ws1995_java/article/details/80614222