日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算机网络实验四:利用UDP协议实现点对点聊天

發布時間:2025/3/13 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机网络实验四:利用UDP协议实现点对点聊天 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 1. 簡介
    • 1.1 功能
    • 1.2 技術
    • 1.3 流程
  • 2. 源碼
    • 2.1 客戶端1
    • 2.2 客戶端2(與客戶端1不同的只有端口號)
    • 2.3 服務端
  • 3. 運行
  • 4. 注意
    • 4.1 端口占用
    • 4.2 運行時注意事項

1. 簡介

1.1 功能

一個服務端,兩個客戶端。客戶端將消息發送到服務端,由服務端對消息進行轉發。以實現兩個客戶端通過服務端進行點對點通信。

1.2 技術

  • 語言:java
  • DatagramPacket和DatagramSocket,實現模擬UDP協議(通過端口實現兩個進程間的通信)
  • 1.3 流程

    客戶端1(2)通過端口號找到服務端,將消息發送給服務端;服務端接收到消息后,將接收到的內容轉發給客戶段2(1)

    2. 源碼

    2.1 客戶端1

    package Socket2;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.*; /* 模擬客戶端 - 普通 Socket 實現 */ public class Client1 {public static void main ( String [] args ) throws IOException {System.out.println("輸入0,發送消息 輸入1,接收消息 輸入2,停止收發消息 ");//創建DatagramSocket對象DatagramSocket socket=new DatagramSocket(null);socket.bind(new InetSocketAddress(9999));//綁定本地端口System.out.println("正常1");//定義服務器的地址、端口號、數據InetAddress address=InetAddress.getByName("localhost");int port=9000;while(true){Scanner input=new Scanner(System.in);int choose=input.nextInt();if(choose==0){String inputdata=input.next();byte[] data=inputdata.getBytes("UTF-8");//拒絕亂碼TT-TT//創建數據報DatagramPacket packet=new DatagramPacket(data, data.length, address, port);//向服務器端發送數據報socket.send(packet);System.out.println("正常2");}else if(choose==1){byte[] data2=new byte[1024];DatagramPacket packet2=new DatagramPacket(data2, data2.length);//接收服務器響應的數據socket.receive(packet2);//讀取數據String reply=new String(packet2.getData(),"UTF-8");System.out.println("接收消息:"+reply);}else if(choose==2){//關閉資源socket.close();System.out.println("已結束");}else{System.out.println("請輸入正確數字");} } } }

    2.2 客戶端2(與客戶端1不同的只有端口號)

    package Socket2;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.*; /* 模擬客戶端 - 普通 Socket 實現 */ public class Client2 {public static void main ( String [] args ) throws IOException {System.out.println("輸入0,發送消息 輸入1,接收消息 輸入2,停止收發消息 ");//創建DatagramSocket對象DatagramSocket socket=new DatagramSocket(null);socket.bind(new InetSocketAddress(9998));//綁定本地端口//定義服務器的地址、端口號、數據InetAddress address=InetAddress.getByName("localhost");int port=9000;while(true){Scanner input=new Scanner(System.in);int choose=input.nextInt();if(choose==0){String inputdata=input.next();byte[] data=inputdata.getBytes("UTF-8");//拒絕亂碼TT-TT//創建數據報DatagramPacket packet=new DatagramPacket(data, data.length, address, port);//向服務器端發送數據報socket.send(packet);}else if(choose==1){byte[] data2=new byte[1024];DatagramPacket packet2=new DatagramPacket(data2, data2.length);//接收服務器響應的數據socket.receive(packet2);//讀取數據String reply=new String(packet2.getData(),"UTF-8");System.out.println("接收消息:"+reply);}else if(choose==2){//關閉資源socket.close();System.out.println("已結束");}else{System.out.println("請輸入正確數字");} } } }

    2.3 服務端

    package Socket2;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /*服務器端端口號9000 */ public class Server {public static void main(String[] args) throws IOException{DatagramSocket socket=new DatagramSocket(9000); //端口9000System.out.println("服務器端已經啟動,等待客戶端發送數據");byte[] data =new byte[1024]; DatagramPacket packet=new DatagramPacket(data, data.length); //指定接收包的大小為1024int finish=0;while(true){//接收到數據報之前會一直阻塞socket.receive(packet);//讀取數據String info=new String(packet.getData(),"UTF-8");System.out.println("-------------------------------------------");System.out.println("成功接收數據 ");System.out.println("源端口號:"+packet.getPort());System.out.println("接收數據:"+info);System.out.println("-------------------------------------------");//向本機地址,指定端口的客戶端發送數據InetAddress address=packet.getAddress();int port=packet.getPort();String message=new String (packet.getData(),"UTF-8");//指定發送端口int sendport=port;if(port==9999){sendport=9998;}else{sendport=9999;}byte[] data2=message.getBytes("UTF-8");DatagramPacket packet2=new DatagramPacket(data2, data2.length, address, sendport);socket.send(packet2);System.out.println("-------------------------------------------");System.out.println("成功發送數據 ");System.out.println("目的端口號:"+sendport);System.out.println("發送數據:"+message);System.out.println("-------------------------------------------");if(finish==1){socket.close();}}} }

    3. 運行

    (我使用的是eclipse,需要開三個結果窗口,并且三個源碼在同一個包中

  • 首先運行服務端,此時會顯示已經打開服務端的提示信息,不需要進行任何操作,直接將結果窗口固定住。
  • 運行客戶端1,輸入數字1,等待接收消息,將結果窗口固定住。
  • 運行客戶端2,輸入數字0,選擇發送消息功能。任意輸入一條要發送的數據(比如“你好,我是客戶端2”),按下enter鍵。固定住結果窗口
  • 此時,服務端會接收到消息,并將數據轉發給客戶端1。在已經固定在服務端結果的結果界面中,可以觀察到相關提示信息。
  • 再看客戶端1的結果窗口,已經接收到客戶端2發送過來的信息。
  • 此時已經成功完成了一次客戶端2向客戶端1發送消息。

    4. 注意

    4.1 端口占用

    這三個程序都只能運行一次后持續開著,如果再次運行,會報錯:端口被占用。這時需要打開資源管理器,將eclipse下的java進程結束,釋放端口,才能再次運行。

    4.2 運行時注意事項

    按照順序依次運行程序后,不需要再次點擊運行。進程會一直保持開啟并使用狀態,結果可以通過開通三個結果窗口,每個窗口對應一個進程,可以觀察到每個進程的持續性變化。

    總結

    以上是生活随笔為你收集整理的计算机网络实验四:利用UDP协议实现点对点聊天的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。