计算机网络实验四:利用UDP协议实现点对点聊天
生活随笔
收集整理的這篇文章主要介紹了
计算机网络实验四:利用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 技術
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,需要開三個結果窗口,并且三個源碼在同一個包中)
此時已經成功完成了一次客戶端2向客戶端1發送消息。
4. 注意
4.1 端口占用
這三個程序都只能運行一次后持續開著,如果再次運行,會報錯:端口被占用。這時需要打開資源管理器,將eclipse下的java進程結束,釋放端口,才能再次運行。
4.2 運行時注意事項
按照順序依次運行程序后,不需要再次點擊運行。進程會一直保持開啟并使用狀態,結果可以通過開通三個結果窗口,每個窗口對應一個進程,可以觀察到每個進程的持續性變化。
總結
以上是生活随笔為你收集整理的计算机网络实验四:利用UDP协议实现点对点聊天的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络实验三:网络层和链路层网络协议
- 下一篇: MobaXterm通过SSH连接cent