计算机网络实验四:利用UDP协议实现点对点聊天
生活随笔
收集整理的這篇文章主要介紹了
计算机网络实验四:利用UDP协议实现点对点聊天
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
文章目錄
- 1. 簡介
- 1.1 功能
- 1.2 技術(shù)
- 1.3 流程
- 2. 源碼
- 2.1 客戶端1
- 2.2 客戶端2(與客戶端1不同的只有端口號)
- 2.3 服務(wù)端
- 3. 運行
- 4. 注意
- 4.1 端口占用
- 4.2 運行時注意事項
1. 簡介
1.1 功能
一個服務(wù)端,兩個客戶端??蛻舳藢⑾l(fā)送到服務(wù)端,由服務(wù)端對消息進(jìn)行轉(zhuǎn)發(fā)。以實現(xiàn)兩個客戶端通過服務(wù)端進(jìn)行點對點通信。
1.2 技術(shù)
1.3 流程
客戶端1(2)通過端口號找到服務(wù)端,將消息發(fā)送給服務(wù)端;服務(wù)端接收到消息后,將接收到的內(nèi)容轉(zhuǎn)發(fā)給客戶段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 實現(xiàn) */ public class Client1 {public static void main ( String [] args ) throws IOException {System.out.println("輸入0,發(fā)送消息 輸入1,接收消息 輸入2,停止收發(fā)消息 ");//創(chuàng)建DatagramSocket對象DatagramSocket socket=new DatagramSocket(null);socket.bind(new InetSocketAddress(9999));//綁定本地端口System.out.println("正常1");//定義服務(wù)器的地址、端口號、數(shù)據(jù)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//創(chuàng)建數(shù)據(jù)報DatagramPacket packet=new DatagramPacket(data, data.length, address, port);//向服務(wù)器端發(fā)送數(shù)據(jù)報socket.send(packet);System.out.println("正常2");}else if(choose==1){byte[] data2=new byte[1024];DatagramPacket packet2=new DatagramPacket(data2, data2.length);//接收服務(wù)器響應(yīng)的數(shù)據(jù)socket.receive(packet2);//讀取數(shù)據(jù)String reply=new String(packet2.getData(),"UTF-8");System.out.println("接收消息:"+reply);}else if(choose==2){//關(guān)閉資源socket.close();System.out.println("已結(jié)束");}else{System.out.println("請輸入正確數(shù)字");} } } }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 實現(xiàn) */ public class Client2 {public static void main ( String [] args ) throws IOException {System.out.println("輸入0,發(fā)送消息 輸入1,接收消息 輸入2,停止收發(fā)消息 ");//創(chuàng)建DatagramSocket對象DatagramSocket socket=new DatagramSocket(null);socket.bind(new InetSocketAddress(9998));//綁定本地端口//定義服務(wù)器的地址、端口號、數(shù)據(jù)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//創(chuàng)建數(shù)據(jù)報DatagramPacket packet=new DatagramPacket(data, data.length, address, port);//向服務(wù)器端發(fā)送數(shù)據(jù)報socket.send(packet);}else if(choose==1){byte[] data2=new byte[1024];DatagramPacket packet2=new DatagramPacket(data2, data2.length);//接收服務(wù)器響應(yīng)的數(shù)據(jù)socket.receive(packet2);//讀取數(shù)據(jù)String reply=new String(packet2.getData(),"UTF-8");System.out.println("接收消息:"+reply);}else if(choose==2){//關(guān)閉資源socket.close();System.out.println("已結(jié)束");}else{System.out.println("請輸入正確數(shù)字");} } } }2.3 服務(wù)端
package Socket2;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /*服務(wù)器端端口號9000 */ public class Server {public static void main(String[] args) throws IOException{DatagramSocket socket=new DatagramSocket(9000); //端口9000System.out.println("服務(wù)器端已經(jīng)啟動,等待客戶端發(fā)送數(shù)據(jù)");byte[] data =new byte[1024]; DatagramPacket packet=new DatagramPacket(data, data.length); //指定接收包的大小為1024int finish=0;while(true){//接收到數(shù)據(jù)報之前會一直阻塞socket.receive(packet);//讀取數(shù)據(jù)String info=new String(packet.getData(),"UTF-8");System.out.println("-------------------------------------------");System.out.println("成功接收數(shù)據(jù) ");System.out.println("源端口號:"+packet.getPort());System.out.println("接收數(shù)據(jù):"+info);System.out.println("-------------------------------------------");//向本機地址,指定端口的客戶端發(fā)送數(shù)據(jù)InetAddress address=packet.getAddress();int port=packet.getPort();String message=new String (packet.getData(),"UTF-8");//指定發(fā)送端口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("成功發(fā)送數(shù)據(jù) ");System.out.println("目的端口號:"+sendport);System.out.println("發(fā)送數(shù)據(jù):"+message);System.out.println("-------------------------------------------");if(finish==1){socket.close();}}} }3. 運行
(我使用的是eclipse,需要開三個結(jié)果窗口,并且三個源碼在同一個包中)
此時已經(jīng)成功完成了一次客戶端2向客戶端1發(fā)送消息。
4. 注意
4.1 端口占用
這三個程序都只能運行一次后持續(xù)開著,如果再次運行,會報錯:端口被占用。這時需要打開資源管理器,將eclipse下的java進(jìn)程結(jié)束,釋放端口,才能再次運行。
4.2 運行時注意事項
按照順序依次運行程序后,不需要再次點擊運行。進(jìn)程會一直保持開啟并使用狀態(tài),結(jié)果可以通過開通三個結(jié)果窗口,每個窗口對應(yīng)一個進(jìn)程,可以觀察到每個進(jìn)程的持續(xù)性變化。
總結(jié)
以上是生活随笔為你收集整理的计算机网络实验四:利用UDP协议实现点对点聊天的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络实验三:网络层和链路层网络协议
- 下一篇: MobaXterm通过SSH连接cent