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();
			}

		}
	}

}


發佈了61 篇原創文章 · 獲贊 6 · 訪問量 7900
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章