您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關基于UDP協議實現聊天系統的方法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
下面展示一些 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協議實現聊天系統的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。