基於UDP協議實現聊天系統
基於UDP協議的聊天系統的實現(含GUI),供大傢參考,具體內容如下
這是一篇我的學習記錄,這學期加入瞭JAVA 的學習,所以自己把教科書看瞭一下,然後嘗試地寫瞭一個UDP協議的聊天系統,並且含GUI。因為對JAVA和網絡的瞭解還不夠深,所以代碼還有許多地方需要完善。
代碼展示
下面展示一些 Client類。
/**------------------- * 發送端 **---------------------*/ class Client extends Thread{ private static String content; //發送內容 private static int port; //發送端口 private static int target; //目標端口 private static byte[] addr; //目標ip地址 /**------------------- *構造函數 **---------------------*/ public Client(String content,int port,int target,byte[] addr){ this.content=content; this.port=port; this.target=target; this.addr=addr; } /**------------------- *發送端函數 **---------------------*/ public void run(){ DatagramSocket client= null; try { //定義發送端端口為 port 的DatagramSocket對象 client = new DatagramSocket(port); } catch (SocketException e) { e.printStackTrace(); } String str=content; DatagramPacket packet= null; try { //定義DatagramPacket對象,用於封裝發送的數據以及目標地址 target packet = new DatagramPacket(str.getBytes(),str.getBytes().length, InetAddress.getByAddress(addr),target); } catch (UnknownHostException e) { e.printStackTrace(); } try { //發送數據 client.send(packet); } catch (IOException e) { e.printStackTrace(); } //關閉釋放資源 client.close(); } } /**------------------- *接收端 **---------------------*/ class Server extends Thread{ private static JTextArea jt; //對話框 private static int target; //目標端口 /*------------------- 構造函數 ---------------------*/ public Server(JTextArea jt,int target){ this.jt=jt; this.target=target; }
下面展示一些 Server類。
/*------------------- 接收端 ---------------------*/ class Server extends Thread{ private static JTextArea jt; //對話框 private static int target; //目標端口 /*------------------- 構造函數 ---------------------*/ public Server(JTextArea jt,int target){ this.jt=jt; this.target=target; } /*------------------- 接收端函數 ---------------------*/ public void run(){ String str; DatagramSocket server= null; try { //定義一個端口號為 target 的接收端DatagramSocket對象 server = new DatagramSocket(target); } catch (SocketException e) { e.printStackTrace(); } byte[] buf=new byte[1024]; //定義一個DatagramPacket數據報對象,用於封裝接收數據 DatagramPacket packet=new DatagramPacket(buf, buf.length); while (true){ try { //等待接收數據,在數據沒有被接收到之前會被堵塞 server.receive(packet); } catch (IOException e) { e.printStackTrace(); } //使用DatagramPacket的方法獲得接收到的信息,並轉為字符串類型 str=new String(packet.getData(), 0,packet.getLength()); //將接收到的信息打印到對話框 jt.append("接收到:"+str+"\n"); } } }
下面展示一些 Main類。
public class Main { public static int port; public static int target; public static byte[] addr; public static void Login(){ System.out.print("請輸入端口號:"); Scanner ScPort=new Scanner(System.in); port=ScPort.nextInt(); System.out.print("請輸入目標端口號1:"); Scanner ScTarget=new Scanner(System.in); target=ScTarget.nextInt(); System.out.print("請輸入目標端口號2:"); Scanner ScTarget2=new Scanner(System.in); int target2=ScTarget2.nextInt(); System.out.print("請輸入目標IP地址:"); Scanner Scaddr=new Scanner(System.in); /*--------------------- 將目標IP存儲到數組中 -----------------------*/ String ip=Scaddr.nextLine(); /*--------------------- public String[] split(String regex): 根據給定正則表達式的匹配拆分此字符串 ----------------------*/ String[] ii=ip.split("\\."); /*--------------------- 我們現在使用的IPv4是用一個32位的二進制數來存儲的,為瞭方便記憶, 會將其分成4個8位的二進制數(4個一字節的二進制數),每8位之間用圓點隔開。 而每8位二進制數可以轉換為一個0~255的十進制數,例如103.42.176.244, 這種寫法被稱為點數表示法 ----------------------*/ byte[] addr=new byte[4]; for(int i=0;i<4;i++){ addr[i]=(byte)(Integer.parseInt(ii[i])); } System.out.println("窗口啟動中...."); new Thread(new Server(CreateAndShowGUI(port,target,addr),target2),"接收服務").start(); } /*------------------- GUI界面 ---------------------*/ public static JTextArea CreateAndShowGUI(int port,int target,byte[] addr){ /*--------------------- 創建界面 ----------------------*/ JFrame jf=new JFrame("聊天界面"); jf.setLocation(400,200); jf.setSize(400,300); /*--------------------- 設置佈局 ----------------------*/ jf.setLayout(new BorderLayout()); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /*--------------------- 創建聊天窗口 ----------------------*/ JTextArea jt=new JTextArea(14,34); JScrollPane scrollPane=new JScrollPane(jt); jt.setEditable(false); /*--------------------- 創建發送窗口 ----------------------*/ JTextField jte=new JTextField(20); JButton jb=new JButton("發送"); jb.addActionListener(e->{ String content=jte.getText(); /*--------------------- 為發送按鈕創建動作 ----------------------*/ if (content!=null&&!content.trim().equals("")){ /*------------------- 判斷信息是否為空 若為空,在在對話框提示 你輸入的內容為空 反之發送 --------------------*/ jt.append("輸入信息為:"+content+"\n"); /*-------------- 將發送框信息發送到目標對話框 傳入Client方法的參數分別為 “發送內容,發送端口,目標端口,目標IP地址” ----------------*/ try { new Thread(new Client(content,port,target,addr),"發送服務").start(); } catch (Exception exception) { exception.printStackTrace(); } }else{ jt.append("你輸入的內容為空"); } jte.setText(""); //信息發送後,將發送框重置 }); JPanel jp=new JPanel(); JLabel jl=new JLabel("聊天信息"); jp.add(jl); jp.add(jte); jp.add(jb); jf.add(jt,BorderLayout.PAGE_START); jf.add(jp,BorderLayout.PAGE_END); //顯示GUI界面 jf.setVisible(true); return jt; } public static void main(String[] args) throws Exception{ Login(); } }
運行截圖
登錄界面(一)
登錄界面(二)
聊天界面(一)
聊天界面(二)
總結
UDP協議是無連接通信,即在數據傳輸時,數據的發送端和接收端不建立邏輯鏈接。也就是,當一臺計算機想另外一臺計算機發送消息時,發送端不會確定接收端是否存在,就會發送數據。同樣,接收端在接收到消息後也不會反饋發送端是否受到數據。但UDP消耗資源小、通訊效率高、延遲小。所以,雖然UDP是一個不可靠的協議,但它是分發信息的一個理想協議。
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- None Found