电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Java 實現(xiàn)簡單Socket 通信的示例

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

Java socket 封裝了傳輸層的實現(xiàn)細節(jié),開發(fā)人員可以基于 socket 實現(xiàn)應(yīng)用層。本文介紹了 Java socket 簡單用法。

1. 傳輸層協(xié)議

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

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

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

TCP 通過序列號、確認應(yīng)答、數(shù)據(jù)校驗等機制確保了傳輸?shù)目煽啃裕m用于需要可靠數(shù)據(jù)傳輸?shù)膱鼍埃瑧?yīng)用層協(xié)議 HTTP,F(xiàn)TP 基于 TCP。UDP 沒有復(fù)雜的控制機制,不糾錯,不重發(fā),不保證數(shù)據(jù)的準確性,不確保數(shù)據(jù)到達目的地;不過 UDP 傳送等量數(shù)據(jù)花費更小的流量,適用于對時延要求高但對準確性要求不高的場景,如視頻、音頻通訊。

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

2. TCP 示例

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

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

2.1 示例效果

客戶端程序接收控制臺輸入的內(nèi)容,客戶端控制臺每輸入一行,就往服務(wù)端發(fā)送,服務(wù)端接收到消息之后,將消息打印到控制臺。

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

客戶端控制臺輸入輸出:

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

服務(wù)端控制臺輸出:

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

import java.net.*;import java.io.*;class Server { public static void main(String[] args) { // ServerSocket 實現(xiàn)了 AutoCloseable 接口,所以支持 try-with-resource 語句 // 創(chuàng)建一個 ServerSocket,監(jiān)聽 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 裝飾,方便以字符流的形式處理,方便一行行讀取內(nèi)容 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 ){ // 循環(huán)讀取輸入流中的內(nèi)容 msg = new String(cbuf, 0, len); if('Bye'.equals(msg)) { // 如果檢測到 'Bye' ,則跳出循環(huán),不再讀取輸入流中內(nèi)容。 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(); // 立即發(fā)送,否則需要積累到一定大小才一次性發(fā)送 } }catch (IOException e){ e.printStackTrace(); } } }3. UDP 示例

UDP 不需要連接,客戶端與服務(wù)端通過發(fā)送數(shù)據(jù)報來完成通信。Java 中使用 java.net.DatagramSocket 來表示 UDP 客戶端或服務(wù)端的套接字,使用 java.net.DatagramPacket 來表示 UDP 的數(shù)據(jù)報。客戶端和服務(wù)端可以直接向?qū)Ψ桨l(fā)送數(shù)據(jù)報,不需要進行連接。

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

3.1 服務(wù)端程序代碼

import java.net.*;import java.io.*;class Server { public static void main(String[] args){ // 創(chuàng)建一個 DatagramPacket 實例,用來接收客戶端發(fā)送過來的 UDP 數(shù)據(jù)報,這個實例可以重復(fù)利用。 byte[] buf = new byte[8192]; // 緩存區(qū) int len = buf.length; // 要利用的緩存區(qū)的大小 DatagramPacket pac = new DatagramPacket(buf, len); // 創(chuàng)建服務(wù)端的套接字,需要指定綁定的端口號 try(DatagramSocket serv = new DatagramSocket(9191)){ while(true){ serv.receive(pac); // 接收數(shù)據(jù)報。如果沒有數(shù)據(jù)報發(fā)送過來,會阻塞 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){ // 創(chuàng)建一個客戶端的 UDP 套接字,不需要指定任何信息 try(DatagramSocket client = new DatagramSocket()){ // 創(chuàng)建一個數(shù)據(jù)報實例,數(shù)據(jù)和長度在發(fā)送之前都會重新設(shè)置,所以這里直接置為 0 即可。 // 由于是發(fā)送端,所以需要設(shè)置服務(wù)端的地址和端口 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') ){ // 設(shè)置要發(fā)送的數(shù)據(jù) pac.setData(msg.getBytes()); // 發(fā)送數(shù)據(jù)報 client.send(pac); System.out.println('Sent Message --> ' + msg); } }catch (IOException e){ e.printStackTrace(); } }}

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

以上就是Java 實現(xiàn)簡單Socket 通信的示例的詳細內(nèi)容,更多關(guān)于Java 實現(xiàn)Socket 通信的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 14米地磅厂家价价格,150吨地磅厂家价格-百科 | 挤奶设备过滤纸,牛奶过滤纸,挤奶机过滤袋-济南蓝贝尔工贸有限公司 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 体检车_移动CT车_CT检查车_CT车_深圳市艾克瑞电气有限公司移动CT体检车厂家-深圳市艾克瑞电气有限公司 | 阴离子_阳离子聚丙烯酰胺厂家_聚合氯化铝价格_水处理絮凝剂_巩义市江源净水材料有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 宠物店加盟_宠物连锁店_开宠物店-【派多格宠物】 | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 亚洲工业智能制造领域专业门户网站 - 亚洲自动化与机器人网 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | 车辆定位管理系统_汽车GPS系统_车载北斗系统 - 朗致物联 | 塑料托盘厂家直销-吹塑托盘生产厂家-力库塑业【官网】 | 南昌旅行社_南昌国际旅行社_南昌国旅在线 | 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 抖音短视频运营_企业网站建设_网络推广_全网自媒体营销-东莞市凌天信息科技有限公司 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 切铝机-数控切割机-型材切割机-铝型材切割机-【昆山邓氏精密机械有限公司】 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 东莞喷砂机-喷砂机-喷砂机配件-喷砂器材-喷砂加工-东莞市协帆喷砂机械设备有限公司 | 风化石头制砂机_方解石制砂机_瓷砖石子制砂机_华盛铭厂家 | 寮步纸箱厂_东莞纸箱厂 _东莞纸箱加工厂-东莞市寮步恒辉纸制品厂 | 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 英语词典_成语词典_日语词典_法语词典_在线词典网 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 深圳侦探联系方式_深圳小三调查取证公司_深圳小三分离机构 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 天助网 - 中小企业全网推广平台_生态整合营销知名服务商_天助网采购优选 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 磷酸肌酸二钠盐,肌酐磷酰氯-沾化欣瑞康生物科技 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 |