使用Java服務器實現UDP消息的發送和接收(多線程)

目錄

  • 簡介:
  • 1. 導入必要的庫
  • 2. 創建服務器端代碼
  • 3. 創建客戶端代碼
  • 4. 實現多線程處理
  • 5. 測試運行
  • 示例代碼:
  • 函數說明
    • 服務器端代碼說明:
    • 客戶端代碼說明:
  • 總結:

簡介:

在本篇博客中,我們將介紹如何使用Java服務器來實現UDP消息的發送和接收,并通過多線程的方式來處理并發請求。UDP(User Datagram Protocol)是一種無連接、不可靠的傳輸協議,適合于實時性要求高的應用場景,如實時游戲、語音通信等。
在這里插入圖片描述

步驟:

1. 導入必要的庫

首先,我們需要導入Java提供的網絡編程庫,包括java.netjava.io

2. 創建服務器端代碼

在服務器端,我們需要創建一個Socket對象,并綁定到指定的端口。然后,創建一個無限循環,在循環中接收客戶端的請求并作出相應的處理。由于UDP是無連接的,所以我們可以通過DatagramSocket類來完成。

3. 創建客戶端代碼

在客戶端,我們同樣需要創建一個Socket對象,并指定服務器的IP地址和端口號。然后,通過Socket對象發送和接收UDP數據報。

4. 實現多線程處理

如果希望服務器能夠處理多個客戶端的請求,我們可以使用多線程來實現并發處理。每當有新的請求到達服務器,就創建一個新的線程來處理該請求。

5. 測試運行

在服務器和客戶端代碼都完成后,我們可以分別運行它們,并觀察控制臺輸出。確保服務器能夠接收到客戶端發送的消息,并正確處理。

示例代碼:

下面是一個簡單的Java代碼示例,演示了如何實現UDP消息的發送和接收(多線程):

// 服務器端代碼
import java.io.*;
import java.net.*;public class UDPServer {public static void main(String args[]) throws Exception {DatagramSocket serverSocket = new DatagramSocket(9876);byte[] receiveData = new byte[1024];byte[] sendData;while (true) {DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);serverSocket.receive(receivePacket);String sentence = new String(receivePacket.getData());InetAddress IPAddress = receivePacket.getAddress();int port = receivePacket.getPort();String capitalizedSentence = sentence.toUpperCase();sendData = capitalizedSentence.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);serverSocket.send(sendPacket);}}
}// 客戶端代碼
import java.io.*;
import java.net.*;public class UDPClient {public static void main(String args[]) throws Exception {BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));DatagramSocket clientSocket = new DatagramSocket();InetAddress IPAddress = InetAddress.getByName("localhost");byte[] sendData;byte[] receiveData = new byte[1024];String sentence = inFromUser.readLine();sendData = sentence.getBytes();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);clientSocket.send(sendPacket);DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);clientSocket.receive(receivePacket);String modifiedSentence = new String(receivePacket.getData());System.out.println("FROM SERVER:" + modifiedSentence);clientSocket.close();}
}

函數說明

當然,下面是更詳細的類和函數接口的說明:

服務器端代碼說明:

  1. DatagramSocket類:表示用于發送和接收UDP數據報的套接字。它有以下常用方法:

    • DatagramSocket(int port):創建一個綁定到指定端口的DatagramSocket對象。
    • void receive(DatagramPacket p):將接收到的UDP數據報存儲在給定的DatagramPacket對象中。
    • void send(DatagramPacket p):發送給定的DatagramPacket對象中的UDP數據報。
  2. DatagramPacket類:表示UDP數據報。它有以下常用方法:

    • DatagramPacket(byte[] buf, int length):創建一個指定長度的DatagramPacket對象,用于接收數據。
    • DatagramPacket(byte[] buf, int length, InetAddress address, int port):創建一個指定長度的DatagramPacket對象,用于發送數據至指定的IP地址和端口號。
    • byte[] getData():返回接收或發送的數據。
    • InetAddress getAddress():返回遠程主機的IP地址。
    • int getPort():返回遠程主機的端口號。
  3. String類:表示字符串對象。它有以下常用方法:

    • String(byte[] bytes):使用指定的字節數組創建一個新的字符串對象。
    • String(byte[] bytes, int offset, int length):使用指定的字節數組的一部分創建一個新的字符串對象。
    • byte[] getBytes():將字符串轉換為字節數組。

客戶端代碼說明:

  1. BufferedReader類:用于從輸入流中讀取文本數據的緩沖區。它有以下常用方法:

    • BufferedReader(Reader reader):創建一個新的緩沖讀取器。
    • String readLine():讀取一行文本并返回。
  2. InputStreamReader類:轉換字節流到字符流的橋梁。它有以下常用構造函數:

    • InputStreamReader(InputStream in):創建一個將字節流轉換為字符流的輸入流讀取器。
  3. DatagramSocket類和DatagramPacket類的說明請參考服務器端代碼中的解釋。

希望這些詳細的類和函數接口說明能夠幫助您更好地理解和應用UDP消息的發送和接收(多線程)的實現過程。如果您有任何問題,請隨時提問。

總結:

在服務器端代碼中,我們使用DatagramSocketDatagramPacket類來處理UDP的發送和接收。在客戶端代碼中,我們使用BufferedReaderInputStreamReader類來讀取用戶輸入,并使用DatagramSocketDatagramPacket類來發送和接收UDP數據報。

通過本篇博客,我們了解了如何使用Java服務器實現UDP消息的發送和接收,并通過多線程的方式處理并發請求。這對于實時性要求高的應用場景非常有用,如游戲開發、語音通信等。希望本文能夠幫助您理解和應用UDP網絡編程。如有疑問,請隨時留言。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40035.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

genism word2vec方法

文章目錄 概述使用示例模型的保存與使用訓練參數詳解([原鏈接](https://blog.csdn.net/weixin_44852067/article/details/130221655))語料庫訓練 概述 word2vec是按句子來處理的Sentences(句子們) 使用示例 from gensim.models import Word2Vec #sent…

《起風了》C++源代碼

使用方法 Visual Studio、Dev-C、Visual Studio Code等C/C創建一個 .cpp 文件&#xff0c;直接粘貼賦值即可。 #include <iostream> #include <Windows.h> #pragma comment(lib,"winmm.lib") using namespace std; enum Scale {Rest 0, C8 108, B7 …

目錄——車載網絡安全

本文主要匯總車載網絡安全專欄文章,以方便各位讀者閱讀。 ISO21434 概述(一) ISO21434 組織網絡安全管理(二) ISO21434 項目網絡安全管理(三) ISO21434 分布式網絡安全(四) SO21434 持續進行的網絡安全(五) ISO21434 概念階段網絡安全(六)

線性代數(四) 特征值相似矩陣

前言 前面主要講述的是方程組和矩陣的關系&#xff0c;現在了解下矩陣和矩陣的關系 方陣的特征值與特征向量 假設A為n階方陣&#xff0c;對于一個數 λ \lambda λ 若存在&#xff1a;非零列向量 α \alpha α&#xff0c;使得&#xff1a; A α ? λ α ? A\vec{\alp…

2022年電賽C題——小車跟隨行駛系統——做題記錄以及經驗分享

前言 自己打算將做過的電賽真題&#xff0c;主要包含控制組的&#xff0c;近幾年出現的小車控制題目&#xff0c;自己做過的真題以及在準備電賽期間刷真題出現的問題以及經驗分享給大家 這次帶來的是22年電賽C題——小車跟隨行駛系統&#xff0c;這道題目指定使用的是TI的單片…

spring ico容器 spring注入方式 spring與tomcat整合

一、簡介 1、什么是spring&#xff1f; Spring是一個開源的輕量級Java應用開發框架&#xff0c;它提供了一種簡單、高效、靈活的方式來構建企業級應用程序。Spring框架的核心特點是依賴注入&#xff08;Dependency Injection&#xff09;和面向切面編程&#xff08;Aspect-Ori…

SpringBoot整合Redis完整篇

SpringBoot整合Redis完整篇 1、在springboot項目的pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

分布式鎖有哪些應用場景和實現?

電商網站都會遇到秒殺、特價之類的活動&#xff0c;大促活動有一個共同特點就是訪問量激增&#xff0c;在高并發下會出現成千上萬人搶購一個商品的場景。雖然在系統設計時會通過限流、異步、排隊等方式優化&#xff0c;但整體的并發還是平時的數倍以上&#xff0c;參加活動的商…

WebRTC音視頻通話-實現GPUImage視頻美顏濾鏡效果iOS

WebRTC音視頻通話-實現GPUImage視頻美顏濾鏡效果 在WebRTC音視頻通話的GPUImage美顏效果圖如下 可以看下 之前搭建ossrs服務&#xff0c;可以查看&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132257196 之前實現iOS端調用ossrs音視頻通話&#xff0c;可以查…

2023秋招筆試

檸檬微趣 將java的鏈表升序排序&#xff0c;鏈表用Class Node{int val,Node next}實現 import java.util.Comparator; import java.util.PriorityQueue; import java.util.Scanner;/*** 輸入一串數字&#xff0c;放入list中&#xff0c;實現sortList&#xff0c;返回升序的li…

將單個訓練數據集文件拆分為:image文件和label文件(pytorch學習+螞蟻蜜蜂數據集)

螞蟻蜜蜂分類數據集下載鏈接&#xff1a;https://download.pytorch.org/tutorial/hymenoptera_data.zip 要實現如圖操作&#xff1a; 將ants分為ants_image和ants_label 將bees分成bees_image和bees_label 創建ants_label和bees_label&#xff0c;并且以圖片名作為txt文件的…

Apche Kafka + Spring的消息監聽容器

目錄 一、消息的接收1.1、消息監聽器 二、消息監聽容器2.1、 實現方法2.1.1、KafkaMessageListenerContainer2.1.1.1、 基本概念2.1.1.2、如何使用 KafkaMessageListenerContainer 2.1.2、ConcurrentMessageListenerContainer 三、偏移 四、監聽器容器自動啟動 一、消息的接收 …

【機器學習】sklearn數據集的使用,數據集的獲取和劃分

「作者主頁」&#xff1a;士別三日wyx 「作者簡介」&#xff1a;CSDN top100、阿里云博客專家、華為云享專家、網絡安全領域優質創作者 「推薦專欄」&#xff1a;對網絡安全感興趣的小伙伴可以關注專欄《網絡安全入門到精通》 sklearn數據集 二、安裝sklearn二、獲取數據集三、…

mac錄屏工具,錄屏沒有聲音的解決辦法

mac錄屏工具&#xff0c;錄屏沒有聲音的解決辦法 在使用macbook錄制屏幕時&#xff0c;發現自帶的錄屏工具QuickTime Player沒有聲音&#xff0c;于是嘗試了多款錄屏工具&#xff0c;對其做一些經驗總結&#xff08;省流&#xff1a;APP Store直接可以免費下載使用Omi錄屏專家…

第三課-界面介紹SD-Stable Diffusion 教程

前言 我們已經安裝好了SD&#xff0c;這篇文章不介紹難以理解的原理&#xff0c;說使用。以后再介紹原理。 我的想法是&#xff0c;先學會畫&#xff0c;然后明白原理&#xff0c;再去提高技術。 我失敗過&#xff0c;知道三天打魚兩天曬網的痛苦&#xff0c;和很多人一樣試了…

TiDB數據庫從入門到精通系列之六:使用 TiCDC 將 TiDB 的數據同步到 Apache Kafka

TiDB數據庫從入門到精通系列之六&#xff1a;使用 TiCDC 將 TiDB 的數據同步到 Apache Kafka 一、技術流程二、搭建環境三、創建Kafka changefeed四、寫入數據以產生變更日志五、配置 Flink 消費 Kafka 數據 一、技術流程 快速搭建 TiCDC 集群、Kafka 集群和 Flink 集群創建 c…

【網絡編程系列】網絡編程實戰

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續學…

使用Vue.js框架的指令和事件綁定實現一個購物車的頁面布局

使用了v-model指令來實現全選/全不選的功能&#xff0c;當全選框被點擊時&#xff0c;isAllChecked的值會被改變。使用了v-if指令來判斷購物車中是否有商品&#xff0c;如果有商品則渲染商品列表&#xff0c;否則顯示購物車為空的提示。使用了v-for指令來遍歷datalist數組&…

jvm內存溢出排查(使用idea自帶的內存泄漏分析工具)

文章目錄 1.確保生成內存溢出文件2.使用idea自帶的內存泄漏分析工具3.具體實驗一下 1.確保生成內存溢出文件 想分析堆內存溢出&#xff0c;一定在運行jar包時就寫上參數-XX:HeapDumpOnOutOfMemoryError&#xff0c;可以看我之前關于如何運行jar包的文章。若你沒有寫。可以寫上…

Keepalived入門指南:實現故障轉移和負載均衡

文章目錄 一、簡介1. Keepalived概述2. 高可用性和負載均衡的重要性 二、故障轉移1. 什么是故障轉移2. Keepalived的故障轉移原理a) VRRP協議b) 虛擬路由器ID和優先級 3. 配置Keepalived實現故障轉移a) 主備服務器的設置b) 監控網絡接口c) 虛擬IP的配置d) 備份服務器接管流程 三…