1. 程式人生 > 程式設計 >java 多執行緒實現線上諮詢(udp)

java 多執行緒實現線上諮詢(udp)

線上諮詢:兩個人都可以是傳送方,也可以是接收方,實現網上線上諮詢正常通訊。

聊天傳送執行緒

package chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

/**
 * 聊天傳送執行緒:
 * 重寫 run 方法通過 implements 關鍵字實現 Runnable 介面
 * 重寫方法快捷鍵:Ctrl + O
 */
public class TalkSend implements Runnable {

 DatagramSocket socket = null;
 BufferedReader reader = null;

 private int fromPort; //從哪個埠
 private String toIP; //到哪個地址
 private int toPort; //到哪個埠

 //構造:Alt + Insert
 public TalkSend(int fromPort,String toIP,int toPort) {
  this.fromPort = fromPort;
  this.toIP = toIP;
  this.toPort = toPort;

  //快捷鍵:Ctrl + Alt + T
  try {
   //構造一個數據報套接字並將其繫結到本地主機上的指定埠
   socket = new DatagramSocket(fromPort);

   //準備資料:控制檯讀取:System.in
   reader = new BufferedReader(new InputStreamReader(System.in));
  } catch (SocketException e) {
   e.printStackTrace();
  }
 }

 @Override
 public void run() {

  while (true){
   try {
    String data = reader.readLine();
    byte[] dataBytes = data.getBytes();
    DatagramPacket packet = new DatagramPacket(dataBytes,dataBytes.length,new InetSocketAddress(this.toIP,this.toPort));

    //傳送資料包
    socket.send(packet);

    //當傳送一句 bye 的時候表示結束髮送
    if (data.equals("bye")){
     break;
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }

  //關閉
  socket.close();

 }
}

聊天接收執行緒

package chat;

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

/**
 * 聊天接收執行緒:
 * 重寫 run 方法通過 implements 關鍵字實現 Runnable 介面
 * 重寫方法快捷鍵:Ctrl + O
 */
public class TalkReceive implements Runnable {

 DatagramSocket socket = null;

 private int port;
 private String msgFrom;

 //構造
 public TalkReceive(int port,String msgFrom) {
  this.port = port;
  this.msgFrom = msgFrom;

  try {
   socket = new DatagramSocket(port);
  } catch (SocketException e) {
   e.printStackTrace();
  }
 }

 @Override
 public void run() {

  while (true){
   try {
    //準備接收資料包
    byte[] container = new byte[1024];
    DatagramPacket packet = new DatagramPacket(container,container.length);

    //接收資料包
    socket.receive(packet); //阻塞式接收包裹

    //讀取資料
    byte[] data = packet.getData();

    String receiveData = new String(data,data.length);

    //接收到的資料
    System.out.println(msgFrom + ":" + receiveData);

    //當我們說一聲 bye 的時候就表示斷開連線
    if (receiveData.equals("bye")){
     break;
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }

  //關閉
  socket.close();

 }
}

學生端

package chat;

/**
 * 學生端
 */
public class TalkStudent {

 public static void main(String[] args) {

  /**
   * 學生端
   * 從 7777 埠傳送訊息
   * 傳送訊息到 9999 埠
   * 從 8888 埠接收訊息
   *
   * 開啟兩個執行緒:
   * new TalkSend:從 77777 埠傳送,傳送到 localhost,傳送給 9999 埠
   * @param fromPort
   * @param toIP
   * @param toPort
   *
   * new TalkReceive:從 8888 埠接收,接收來自 “老師” 的訊息
   * @param port
   * @param msgFrom
   *
   * 使用了一種模式:靜態代理模式
   */
  new Thread(new TalkSend(7777,"localhost",9999)).start();
  new Thread(new TalkReceive(8888,"老師")).start();
 }

}

老師端

package chat;

/**
 * 老師端
 */
public class TalkTeacher {

 public static void main(String[] args) {

  /**
   * 老師端
   * 從 5555 埠傳送訊息
   * 傳送訊息到 8888 埠
   * 從 9999 埠接收訊息
   *
   * 開啟兩個執行緒:
   * new TalkSend:從 5555 埠傳送,傳送給 8888 埠
   * @param fromPort
   * @param toIP
   * @param toPort
   *
   * new TalkReceive:從 9999 埠接收,接收來自 “學生” 的訊息
   * @param port
   * @param msgFrom
   *
   * 使用了一種模式:靜態代理模式
   */
  new Thread(new TalkSend(5555,8888)).start();
  new Thread(new TalkReceive(9999,"學生")).start();
 }

}

效果一覽

java 多執行緒實現線上諮詢(udp)

java 多執行緒實現線上諮詢(udp)

以上就是java實現的多執行緒實現線上諮詢(udp)的詳細內容,更多關於java 線上諮詢的資料請關注我們其它相關文章!