日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java 實現簡單Socket 通信的示例

瀏覽:32日期:2022-08-15 17:52:24

Java socket 封裝了傳輸層的實現細節,開發人員可以基于 socket 實現應用層。本文介紹了 Java socket 簡單用法。

1. 傳輸層協議

傳輸層包含了兩種協議,分別是 TCP (Transmission Control Protocol,傳輸控制協議) 和 UDP (User Datagram Protocol,用戶數據報協議)。

TCP 是一種面向連接,可靠的流協議。通信雙方在“發送-接收”數據之前需要先建立 TCP 連接,然后通過互相發送二進制數據流來進行通信。所謂連接,指的是各種設備、線路,或網絡中進行通信的應用程序為了相互傳遞消息而建立的專有、虛擬的通信線路。連接一旦建立,進行通信的應用程序只使用該虛擬的通信線路發送和接收數據。TCP 還需要處理端到端之間的流量控制。

UDP 是一種無連接的,不可靠的數據報協議。發送方不需要與接收方建立連接,通信雙方通過發送一個個獨立的數據報來進行通訊。

TCP 通過序列號、確認應答、數據校驗等機制確保了傳輸的可靠性,適用于需要可靠數據傳輸的場景,應用層協議 HTTP,FTP 基于 TCP。UDP 沒有復雜的控制機制,不糾錯,不重發,不保證數據的準確性,不確保數據到達目的地;不過 UDP 傳送等量數據花費更小的流量,適用于對時延要求高但對準確性要求不高的場景,如視頻、音頻通訊。

Java 中有 3 種套接字類,java.net.Socket 和 java.net.ServerSocket 基于 TCP,java.net.DatagramSocket 基于 UDP。

2. TCP 示例

TCP 是面向連接的,所以在進行通訊之前發送端(客戶端)需要先連接到接收端(服務端)。客戶端通過 new Socket('localhost', 9090) 來創建一個連接到服務端的套接字,這個套接字連接到主機 localhost 的 9090 端口。

ServerSocket 實現服務端套接字,通過 new ServerSocket(9090) 來創建一個監聽端口為 9090 實例;ServerSocket.accept() 方法會阻塞等待客戶端的連接,一旦有連接過來,會返回一個服務端的 Socket 實例。連接建立完成,客戶端 Socket 實例和服務端 Socket 實例就可以面向輸入輸出流發送數據了。

2.1 示例效果

客戶端程序接收控制臺輸入的內容,客戶端控制臺每輸入一行,就往服務端發送,服務端接收到消息之后,將消息打印到控制臺。

客戶端輸入 'Bye' 時,客戶端斷開與服務端的連接,客戶端程序退出,服務端程序繼續等待連接。

客戶端控制臺輸入輸出:

$ java Server.javaBind Port 9090New client connected.Received Message --> Are you OK!

服務端控制臺輸出:

$ java Client.javaAre you OK!Send Msg --> Are you OK!Bye$2.2 服務端程序代碼

import java.net.*;import java.io.*;class Server { public static void main(String[] args) { // ServerSocket 實現了 AutoCloseable 接口,所以支持 try-with-resource 語句 // 創建一個 ServerSocket,監聽 9090 端口 try(ServerSocket serv = new ServerSocket(9090)){ System.out.printf('Bind Port %dn', serv.getLocalPort()); Socket socket = null; while(true){ // 接收連接,如果沒有連接,accept() 方法會阻塞 socket = serv.accept();// 獲取輸入流,并使用 BufferedInputStream 和 InputStreamReader 裝飾,方便以字符流的形式處理,方便一行行讀取內容 try(BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream()) )){ String msg = null; char[] cbuf = new char[1024]; int len = 0; while( (len = in.read(cbuf, 0, 1024)) != -1 ){ // 循環讀取輸入流中的內容 msg = new String(cbuf, 0, len); if('Bye'.equals(msg)) { // 如果檢測到 'Bye' ,則跳出循環,不再讀取輸入流中內容。 break; } System.out.printf('Received Message --> %s n', msg); } }catch (IOException e){ e.printStackTrace(); } } }catch (IOException e){ e.printStackTrace(); } }}2.3 客戶端程序代碼import java.net.*;import java.io.*;import java.util.*;class Client{ public static void main(String[] args){ try(Socket socket = new Socket('localhost', 9090)){ BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); Scanner scanner = new Scanner(System.in); scanner.useDelimiter('rn'); String msg = null; while( !(msg = scanner.next()).equals('Bye') ){ System.out.printf('Send Msg --> %s n', msg); out.write(msg); out.flush(); // 立即發送,否則需要積累到一定大小才一次性發送 } }catch (IOException e){ e.printStackTrace(); } } }3. UDP 示例

UDP 不需要連接,客戶端與服務端通過發送數據報來完成通信。Java 中使用 java.net.DatagramSocket 來表示 UDP 客戶端或服務端的套接字,使用 java.net.DatagramPacket 來表示 UDP 的數據報。客戶端和服務端可以直接向對方發送數據報,不需要進行連接。

下面代碼基于 UDP 實現了與上面程序同樣的功能。不過消息可能會出錯,某些消息可能也不能到達服務端。

3.1 服務端程序代碼

import java.net.*;import java.io.*;class Server { public static void main(String[] args){ // 創建一個 DatagramPacket 實例,用來接收客戶端發送過來的 UDP 數據報,這個實例可以重復利用。 byte[] buf = new byte[8192]; // 緩存區 int len = buf.length; // 要利用的緩存區的大小 DatagramPacket pac = new DatagramPacket(buf, len); // 創建服務端的套接字,需要指定綁定的端口號 try(DatagramSocket serv = new DatagramSocket(9191)){ while(true){ serv.receive(pac); // 接收數據報。如果沒有數據報發送過來,會阻塞 System.out.println('Message --> ' + new String(pac.getData(), 0, pac.getLength())); } }catch (IOException e){ e.printStackTrace(); } } }3.2 客戶端程序代碼

import java.io.*;import java.net.*;import java.util.*;class Client { public static void main(String[] args){ // 創建一個客戶端的 UDP 套接字,不需要指定任何信息 try(DatagramSocket client = new DatagramSocket()){ // 創建一個數據報實例,數據和長度在發送之前都會重新設置,所以這里直接置為 0 即可。 // 由于是發送端,所以需要設置服務端的地址和端口 DatagramPacket pac = new DatagramPacket(new byte[0], 0, InetAddress.getByName('localhost'), 9191); // 掃描控制臺輸入 Scanner scanner = new Scanner(System.in); scanner.useDelimiter('rn'); String msg = null; while( !(msg = scanner.next()).equals('Bye') ){ // 設置要發送的數據 pac.setData(msg.getBytes()); // 發送數據報 client.send(pac); System.out.println('Sent Message --> ' + msg); } }catch (IOException e){ e.printStackTrace(); } }}

需要注意的是,UDP 是面向無連接的,但 DatagramSocket 的 API 中提供了帶有 connect 字樣的方法,這里的 connect 并非 TCP 中連接的意思。而是指定了當前的 UDP 套接字只能夠向指定的主機和端口發送數據報。

以上就是Java 實現簡單Socket 通信的示例的詳細內容,更多關于Java 實現Socket 通信的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久精品视频在线观看视频| 日日夜夜免费精品| 日韩不卡视频在线观看| 亚洲一区二区三区久久久| 人在线成免费视频| 久久丁香四色| 国产精品欧美在线观看| 国产二区精品| 999国产精品999久久久久久| 国产va免费精品观看精品视频| 国产调教一区二区三区| 亚洲一区二区小说| 日韩午夜av在线| 亚洲欧美日韩高清在线| 亚洲午夜一级| 岛国av在线网站| 国产精品一区免费在线| 日本91福利区| 91成人福利| 日韩亚洲精品在线观看| 天堂va欧美ⅴa亚洲va一国产| 免费人成网站在线观看欧美高清| 色黄视频在线观看| 日本一二区不卡| 精品久久久久中文字幕小说| 日韩高清电影免费| 国产日韩免费| 精品成av人一区二区三区| 国产v日韩v欧美v| 香蕉成人久久| 天堂va蜜桃一区二区三区| 午夜欧美在线| 不卡视频在线| 日本中文字幕视频一区| 久久av偷拍| 伊人成人网在线看| 日韩欧美中文字幕一区二区三区 | 亚洲字幕久久| 国产精品传媒麻豆hd| 久久久男人天堂| 99国产精品久久久久久久成人热| 精品一区欧美| 国产精品色网| 欧美精品中文| 国产综合欧美| 91p九色成人| 在线天堂中文资源最新版| 视频一区视频二区中文| 青青伊人久久| 久久亚洲专区| 日韩精彩视频在线观看| 91偷拍一区二区三区精品| 日韩中文字幕区一区有砖一区 | 精品一区免费| 国产乱码精品| 夜夜嗨一区二区三区| 欧美一区不卡| 欧产日产国产精品视频| 日韩亚洲精品在线观看| 午夜av成人| 成人高清一区| 欧美精品二区| 亚洲精品极品| 日本久久综合| 欧美在线日韩| 亚洲欧美专区| 精品国产乱码久久久| 精品久久美女| 日韩精品91亚洲二区在线观看| 成人看片网站| 日韩成人精品一区| 日韩激情啪啪| 中文字幕日韩亚洲| 国产v综合v| 美女久久精品| 91av一区| 日韩一二三区在线观看| 免费人成精品欧美精品| 欧美国产91| 激情五月综合网| 伊人久久婷婷| 亚洲精品成人一区| 999视频精品| 精品三级久久| 不卡中文字幕| 亚洲大全视频| 欧美不卡视频| 亚洲精品伊人| 亚洲精品婷婷| 91欧美极品| 国产精品观看| 日韩专区精品| 日韩欧美二区| 在线一区免费| 亚洲精品成人一区| 国产午夜精品一区在线观看| 久久av日韩| 中文在线а√在线8| 麻豆精品99| 午夜精品久久久久久久久久蜜桃| 都市激情国产精品| 久久精品青草| 国产精品美女久久久浪潮软件| 久久电影一区| 日韩欧美高清一区二区三区| 国产欧美久久一区二区三区| 老鸭窝一区二区久久精品| 丁香六月综合| 91精品91| 国产精品多人| 欧美亚洲国产精品久久| 影院欧美亚洲| 国产极品一区| 婷婷综合六月| 香蕉成人久久| 中文字幕成在线观看| 欧美专区一区二区三区| 欧美中文一区| 日韩视频一区二区三区在线播放免费观看| 老鸭窝毛片一区二区三区| 国产精品一区二区精品视频观看| 91亚洲自偷观看高清| 视频一区在线播放| 一区二区国产精品| 韩日一区二区| 亚洲综合日本| 日本不卡免费高清视频在线| 精品中国亚洲| 欧美精品三级在线| 免费日韩av片| 中文另类视频| 麻豆91精品| 精品视频高潮| 在线精品一区二区| 啪啪国产精品| 亚洲女同av| 国产精品99在线观看| 久久不见久久见免费视频7| 欧美日韩国产探花| 日本久久成人网| 日韩影院二区| 日韩免费av| 日韩大片免费观看| a天堂资源在线| 在线手机中文字幕| 欧产日产国产精品视频| 日韩.com| 日韩精品欧美精品| 色婷婷狠狠五月综合天色拍| 久久久久免费| 国产+成+人+亚洲欧洲在线| 亚洲视频国产| 日韩精选在线| 国产乱子精品一区二区在线观看| 日本综合视频| 国产精品对白| 国产在线不卡一区二区三区| 91一区二区| 激情久久久久久久| 99精品在线观看| 亚洲网站视频| 一区二区日韩免费看| 日韩中文字幕不卡| 国产三级一区| av日韩中文| 欧美国产另类| 久久久亚洲一区| 亚洲一区不卡| 青青草精品视频| 97视频热人人精品免费| 国产高潮在线| 亚洲一区亚洲| 久久国产欧美日韩精品| 黄色在线网站噜噜噜| 亚洲自拍另类| 国产高清一区二区| 久久av免费看| 激情久久一区二区| 国产一区二区亚洲| 蜜臀av一区二区在线免费观看| 国产精品麻豆成人av电影艾秋 | 99久久久久久中文字幕一区| 国产精品97| 国产极品一区| 亚洲欧美久久| 亚洲风情在线资源| 国产精品亚洲欧美日韩一区在线| 欧美日中文字幕| 久久精品天堂| 国产亚洲电影| 国内精品99| 欧美成人a交片免费看| 国产精品一区免费在线| 日韩不卡在线| 久久av超碰| 国产私拍福利精品视频二区| 亚洲欧美视频| 欧美日韩国产免费观看 | 伊伊综合在线| 精品国产亚洲日本|