您好,登錄后才能下訂單哦!
這篇文章主要介紹“基于UDP協議開發Java聊天系統的方法”,在日常操作中,相信很多人在基于UDP協議開發Java聊天系統的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”基于UDP協議開發Java聊天系統的方法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
下面展示一些 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+"
");
}
}
}
下面展示一些 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+"
");
/*--------------
將發送框信息發送到目標對話框
傳入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協議開發Java聊天系統的方法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。