網路程式設計UDP模仿QQ聊天功能
阿新 • • 發佈:2019-02-15
2015年5月21日:
需要用到的類和包:
包:
import java.net.*;
import java.io.*;
類:
DatagramPacket
DatagramSocket
DatagramPacket 用來實現資料的傳送和接收
DatagramSocket 用來實現資料包傳送和接收的套接字
先上程式碼:
import java.io.*; import java.net.*; public class QQ { public static void main(String[] args) throws Exception { Send send = new Send(new DatagramSocket()); Rece rece = new Rece(new DatagramSocket(3000)); new Thread(send).start(); new Thread(rece).start(); } } class Send implements Runnable { private DatagramSocket ds; public Send(DatagramSocket ds) { this.ds = ds; } public void run() { try { BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); String str = null; while((str = bufr.readLine()) != null) { byte[] buf = str.getBytes();//把字串轉換成byte型別的陣列 DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("172.18.177.255"), 3000);//打成資料包 ds.send(dp); if ("886".equals(str)) break; } ds.close(); } catch (Exception e) { System.out.println("傳送端失敗"); } } } class Rece implements Runnable { private DatagramSocket ds; public Rece(DatagramSocket ds) { this.ds = ds; } public void run() { try { String str = null; while(true) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); ds.receive(dp); str = new String(dp.getData(), 0, dp.getLength()); System.out.println(dp.getAddress().getHostAddress() + ":" + str); } } catch (Exception e) { System.out.println("接收端失敗"); } } }
因為既要實現傳送又要有接收, 那麼肯定是多執行緒了。
先來看傳送端:
1):繼承Runnable介面,傳入套接字引數 DatagramSocket ds
BufferedReader 是IO操作,實現從鍵盤上面輸入。
先來看第一步:
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("1XX.18.1XX.255"), 3000);
buf表示包的資料 是byte[]型別的
所以要把字串轉換成byte[]型別 要呼叫getBytes()方法。
buf.length是包的長度
InetAddress,getByName("1XX.18.1XX.255");是你要傳送的目的的IP地址,255表示廣播,表示0-255的IP都會收到你傳送的資訊,相當於QQ群聊天。
3000表示埠
接著呼叫send方法傳送
接收端
2):同樣也是繼承Runnable介面,傳入套接字引數
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
DatagramPacket dp = new DatagramPacket(buf, buf.length);構造用來接收長度為length的資料包
然後呼叫receive方法來接收
接著String str = new String(dp.getData(), 0, dp.getLength());
這是用於輸出在控制檯螢幕上的 把資料輸出來
dp.getData() 獲取返回資料的緩衝區
dp.getLength()獲取將要傳送和接收的資料的長度
接著就在主函式裡面開始新建並啟動執行緒 開始執行
public static void main(String[] args) throws Exception
{
Send send = new Send(new DatagramSocket());
Rece rece = new Rece(new DatagramSocket(3000));
new Thread(send).start();
new Thread(rece).start();
}
接著就可以開始和別人聊天啦!