基於UDP模擬在線聊天

  1. 需要注意兩個核心類:DatagramSocket,DatagramPacket InetSocketAddress
  2. 實現多線程去模擬,本次例子會有四個線程去完成實現(學生和老師,都是既可以是接收者也可以是發生者);
  3. 使用字符轉換流(InputStreamReader)+字符緩衝流(BufferedReader)去讀取數據,發生消息;
  4. 看如下例子,先把發送者和接收者的底層實現寫好,剩下的誰是接收者,誰是發生者可以自己定義;
  5. 發生者:ChartSender
/**
 * 客戶端
 * 1、創建客戶端 +端口
 * 2、準備數據
 * 3、打包(發送的地點 及端口)
 * 4、發送
 * 5、釋放
 */
public class ChartSender implements Runnable{
	private DatagramSocket client = null;
	private InetSocketAddress inetSocketAddress=null;
	public ChartSender(int clientPort,String receiveAddress,int receivePort){
		try {
			client = new DatagramSocket(clientPort);
			inetSocketAddress=new InetSocketAddress(receiveAddress,receivePort);
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		while (true){
			InputStreamReader inputStreamReader = new InputStreamReader(System.in);
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
			try {
				String msg =bufferedReader.readLine();
				byte[] data = msg.getBytes();
				//3、打包(發送的地點 及端口) DatagramPacket(byte[] buf, int length, InetAddress address, int port)
				DatagramPacket packet = new DatagramPacket(data,data.length,inetSocketAddress);
				//發送
				client.send(packet);
				if(msg.equals("bye")){
					break;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}

		}
		//5、釋放
		client.close();
	}
}

接收者:ChartReceiver

/**
 * 服務端
 * 1、創建服務端 +端口
 * 2、準備接受容器
 * 3、封裝成 包
 * 4、接受數據
 * 5、分析數據
 * 6、釋放
 *
 */
public class ChartReceiver implements Runnable{
	DatagramSocket server;
	String fromSay;
	public ChartReceiver(int receivePort,String fromSay){
		//1、創建服務端 +端口
		try {
			server = new DatagramSocket(receivePort);
			this.fromSay=fromSay;
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		while(true){
			//2、準備接受容器
			byte[] container = new byte[1024];
			//3、封裝成 包 DatagramPacket(byte[] buf, int length)
			DatagramPacket packet =new DatagramPacket(container, container.length) ;
			//4、接受數據
			try {
				server.receive(packet);
			} catch (IOException e) {
				e.printStackTrace();
			}
			//5、分析數據
			byte[] data =packet.getData();
			int len =packet.getLength();
			String msg = new String(data,0,len);
			System.out.println(fromSay+":"+msg);
			if(msg.equals("bye")){
				break;
			}
		}
		//6、釋放
		server.close();

	}
}

學生角色:

public class StudentChart {
    public static void main(String[] args) {
        new Thread(new ChartSender(6666,"localhost",7777)).start();
        new Thread(new ChartReceiver(9999,"老師說")).start();
    }
}

老師角色:

public class TeacherChart {

    public static void main(String[] args) {
        new Thread(new ChartSender(8888,"localhost",9999)).start();
        new Thread(new ChartReceiver(7777,"學生說")).start();
        }

}

可以自行運行看下效果;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章