java使用UDP實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信
本文實(shí)例為大家分享了java使用UDP實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)通信的具體代碼,供大家參考,具體內(nèi)容如下
整體的結(jié)構(gòu)思路:
Stu和Tea是收發(fā)消息的兩端;
Stu和Tea類都是通過啟動(dòng)兩個(gè)線程完成通信的,這兩個(gè)線程分別是發(fā)消息線程和收消息線程;
Stu類中啟動(dòng)的兩個(gè)線程分別寫在兩個(gè)類里,Tea也是這樣做。
Stu端及其收發(fā)消息代碼:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; ? public class Stu { ? ?? ?public static void main(String[] args) throws IOException { ?? ??? ?new Thread(new StuSendThread("127.0.0.1", 8888)).start(); ?? ??? ?new Thread(new StuReceiverThread(8889)).start(); ?? ?} }
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; ? ? public class StuReceiverThread implements Runnable{ ? ?? ?private int port; ? ?? ?public StuReceiverThread(int port) { ?? ??? ?this.port = port; ?? ?} ?? ? ?? ?@Override ?? ?public void run() { ?? ??? ?// 創(chuàng)建接收方 ?? ??? ?DatagramSocket socket; ?? ??? ?try { ?? ??? ??? ?socket = new DatagramSocket(port); ?? ??? ??? ?while(true) { ?? ??? ??? ??? ?// 準(zhǔn)備容器 ?? ??? ??? ??? ?byte[] buf = new byte[1024]; ?? ??? ??? ??? ?DatagramPacket dPacket = new DatagramPacket(buf, buf.length); ?? ??? ??? ??? ?// 阻塞式接受數(shù)據(jù) ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?socket.receive(dPacket); ?? ??? ??? ??? ?} catch (IOException e) { ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?// 分析數(shù)據(jù) ?? ??? ??? ??? ?System.out.println(new String(buf)); ?? ??? ??? ??? ?if (new String(buf).equals("exit")) { ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?// 釋放資源 ?? ??? ??? ?socket.close(); ?? ??? ?} catch (SocketException e1) { ?? ??? ??? ?e1.printStackTrace(); ?? ??? ?}?? ??? ? ?? ?}?? ? }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; ? public class StuSendThread implements Runnable{ ? ?? ?private DatagramSocket socket; ?? ?private BufferedReader br; ?? ?String IP; ?? ?int port; ?? ? ?? ?public StuSendThread(String IP, int port) throws SocketException { ?? ??? ?socket = new DatagramSocket(); ?? ??? ?br = new BufferedReader(new InputStreamReader(System.in)); ?? ??? ?this.IP = IP; ?? ??? ?this.port = port; ?? ?} ?? ? ?? ?@Override ?? ?public void run() {?? ??? ? ?? ??? ?while(true) { ?? ??? ??? ?// 準(zhǔn)備數(shù)據(jù) ?? ??? ??? ?br = new BufferedReader(new InputStreamReader(System.in)); ?? ??? ? ? ?String msg; ?? ??? ??? ?try { ?? ??? ??? ??? ?msg = br.readLine(); ?? ??? ??? ??? ?byte[] data = msg.getBytes(); ?? ??? ??? ??? ?// 封裝數(shù)據(jù) ?? ??? ??? ??? ?DatagramPacket dPacket = new DatagramPacket(data, data.length, InetAddress.getByName(IP), port); ?? ??? ??? ??? ?// 發(fā)送數(shù)據(jù) ?? ??? ??? ??? ?socket.send(dPacket); ?? ??? ??? ??? ?if(msg.equals("exit")) { ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?} ?? ??? ??? ?} catch (IOException e) { ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?} ?? ??? ??? ? ?? ??? ?} ?? ??? ? ?? ??? ?// 關(guān)閉資源 ?? ??? ?try { ?? ??? ??? ?br.close(); ?? ??? ??? ?socket.close(); ?? ??? ?} catch (IOException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ? ?? ?} ? }
Tea端及其收發(fā)消息代碼:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; ? public class TeaSendThread implements Runnable{ ?? ?private DatagramSocket socket; ?? ?private BufferedReader br; ?? ?String IP; ?? ?int port; ? ?? ?public TeaSendThread(String IP, int port) throws SocketException { ?? ??? ?socket = new DatagramSocket(); ?? ??? ?br = new BufferedReader(new InputStreamReader(System.in)); ?? ??? ?this.IP = IP; ?? ??? ?this.port = port; ?? ?} ? ?? ?@Override ?? ?public void run() { ?? ??? ?while (true) { ?? ??? ??? ?// 準(zhǔn)備數(shù)據(jù) ?? ??? ??? ?br = new BufferedReader(new InputStreamReader(System.in)); ?? ??? ??? ?String msg; ?? ??? ??? ?try { ?? ??? ??? ??? ?msg = br.readLine(); ?? ??? ??? ??? ?byte[] data = msg.getBytes(); ?? ??? ??? ??? ?// 封裝數(shù)據(jù) ?? ??? ??? ??? ?DatagramPacket dPacket = new DatagramPacket(data, data.length, InetAddress.getByName(IP), port); ?? ??? ??? ??? ?// 發(fā)送數(shù)據(jù) ?? ??? ??? ??? ?socket.send(dPacket); ?? ??? ??? ??? ?if (msg.equals("exit")) { ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?} ?? ??? ??? ?} catch (IOException e) { ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?} ? ?? ??? ?} ? ?? ??? ?// 關(guān)閉資源 ?? ??? ?try { ?? ??? ??? ?br.close(); ?? ??? ??? ?socket.close(); ?? ??? ?} catch (IOException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ? ?? ?} ? }
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; ? public class TeaReceiverTread implements Runnable{ ?? ?private int port; ? ?? ?public TeaReceiverTread(int port) { ?? ??? ?this.port = port; ?? ?} ?? ? ?? ?@Override ?? ?public void run() { ?? ??? ?// 創(chuàng)建接收方 ?? ??? ?DatagramSocket socket; ?? ??? ?try { ?? ??? ??? ?socket = new DatagramSocket(port); ?? ??? ??? ?while(true) { ?? ??? ??? ??? ?// 準(zhǔn)備容器 ?? ??? ??? ??? ?byte[] buf = new byte[1024]; ?? ??? ??? ??? ?DatagramPacket dPacket = new DatagramPacket(buf, buf.length); ?? ??? ??? ??? ?// 阻塞式接受數(shù)據(jù) ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?socket.receive(dPacket); ?? ??? ??? ??? ?} catch (IOException e) { ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ??? ?// 分析數(shù)據(jù) ?? ??? ??? ??? ?System.out.println(new String(buf)); ?? ??? ??? ??? ?if (new String(buf).equals("exit")) { ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?} ?? ??? ??? ?} ?? ??? ??? ?// 釋放資源 ?? ??? ??? ?socket.close(); ?? ??? ?} catch (SocketException e1) { ?? ??? ??? ?e1.printStackTrace(); ?? ??? ?}?? ??? ? ?? ?}?? ? }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; ? public class TeaSendThread implements Runnable{ ?? ?private DatagramSocket socket; ?? ?private BufferedReader br; ?? ?String IP; ?? ?int port; ? ?? ?public TeaSendThread(String IP, int port) throws SocketException { ?? ??? ?socket = new DatagramSocket(); ?? ??? ?br = new BufferedReader(new InputStreamReader(System.in)); ?? ??? ?this.IP = IP; ?? ??? ?this.port = port; ?? ?} ? ?? ?@Override ?? ?public void run() { ?? ??? ?while (true) { ?? ??? ??? ?// 準(zhǔn)備數(shù)據(jù) ?? ??? ??? ?br = new BufferedReader(new InputStreamReader(System.in)); ?? ??? ??? ?String msg; ?? ??? ??? ?try { ?? ??? ??? ??? ?msg = br.readLine(); ?? ??? ??? ??? ?byte[] data = msg.getBytes(); ?? ??? ??? ??? ?// 封裝數(shù)據(jù) ?? ??? ??? ??? ?DatagramPacket dPacket = new DatagramPacket(data, data.length, InetAddress.getByName(IP), port); ?? ??? ??? ??? ?// 發(fā)送數(shù)據(jù) ?? ??? ??? ??? ?socket.send(dPacket); ?? ??? ??? ??? ?if (msg.equals("exit")) { ?? ??? ??? ??? ??? ?break; ?? ??? ??? ??? ?} ?? ??? ??? ?} catch (IOException e) { ?? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ?} ? ?? ??? ?} ? ?? ??? ?// 關(guān)閉資源 ?? ??? ?try { ?? ??? ??? ?br.close(); ?? ??? ??? ?socket.close(); ?? ??? ?} catch (IOException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ? ?? ?} ? }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis-spring:@MapperScan注解的使用
這篇文章主要介紹了mybatis-spring:@MapperScan注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Spring中的@RestControllerAdvice注解使用解析
這篇文章主要介紹了Spring中的@RestControllerAdvice注解使用解析,@RestControllerAdvice?是?Spring?框架中一個(gè)用于統(tǒng)一處理控制器異常和返回結(jié)果的注解,它可以被用來定義全局異常處理程序和全局響應(yīng)結(jié)果處理程序,需要的朋友可以參考下2024-01-01繼承WebMvcConfigurationSupport后自動(dòng)配置不生效及如何配置攔截器
這篇文章主要介紹了繼承WebMvcConfigurationSupport后自動(dòng)配置不生效及如何配置攔截器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11java實(shí)現(xiàn)圖片上傳至本地實(shí)例詳解
我們給大家分享了關(guān)于java實(shí)現(xiàn)圖片上傳至本地的實(shí)例以及相關(guān)代碼,有需要的朋友參考下。2018-08-08Java使用EasyExcel進(jìn)行單元格合并的問題詳解
項(xiàng)目中需要導(dǎo)出并合并指定的單元格,下面這篇文章主要給大家介紹了關(guān)于java評(píng)論、回復(fù)功能設(shè)計(jì)與實(shí)現(xiàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06淺析Java如何優(yōu)雅的設(shè)計(jì)接口狀態(tài)碼和異常
HTTP協(xié)議里定義了一系列的狀態(tài)碼用來表明請(qǐng)求的狀態(tài),如常用的200表示請(qǐng)求正常,404表示請(qǐng)求的資源不存在,所以本文就來和大家討論一下如何優(yōu)雅的設(shè)計(jì)接口狀態(tài)碼和異常,感興趣的可以了解下2024-03-03mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例
本文主要介紹了mybatis水平分表實(shí)現(xiàn)動(dòng)態(tài)表名的項(xiàng)目實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Spring Boot監(jiān)聽Redis Key失效事件實(shí)現(xiàn)定時(shí)任務(wù)的示例
這篇文章主要介紹了Spring Boot監(jiān)聽Redis Key失效事件實(shí)現(xiàn)定時(shí)任務(wù)的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04