顏慧
摘要:該文介紹了網(wǎng)絡(luò)編程中端口和套接字等相關(guān)的概念,并探討了網(wǎng)絡(luò)主機(jī)通過(guò)TCP套接字和UDP套接字進(jìn)行通信的基本流程、適用場(chǎng)合,以及Java實(shí)現(xiàn)套接字編程相關(guān)的類(lèi)和實(shí)現(xiàn)方法。
關(guān)鍵詞:Java;網(wǎng)絡(luò)編程;端口;TCP套接字;UDP 套接字
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)20-0104-02
Abstract: This paper introduces ports and sockets and other related concepts in the network programming, and introduces the network hosts how to communication to each other through the TCP socket and UDP socket, and how to programming to realize TCP Socket and UDP Socket.
Key words: Java; network programming; port; TCP Socket; UDP Socket
在網(wǎng)絡(luò)編程中,經(jīng)常需要在兩臺(tái)計(jì)算機(jī)之間進(jìn)行通信,這就涉及怎么定位網(wǎng)絡(luò)中的計(jì)算機(jī)和唯一地標(biāo)識(shí)計(jì)算機(jī)上的進(jìn)程。在Internet中使用的網(wǎng)絡(luò)通信協(xié)議是TCP/IP協(xié)議,它是一種四層的體系結(jié)構(gòu),分為應(yīng)用層、傳輸層、網(wǎng)際層和網(wǎng)絡(luò)接口層。在Internet中用IP地址來(lái)唯一地標(biāo)識(shí)一臺(tái)網(wǎng)絡(luò)中的計(jì)算機(jī),那么怎么唯一地標(biāo)識(shí)計(jì)算機(jī)中的進(jìn)程呢?
端口是應(yīng)用層和傳輸層之間的通信協(xié)議接口,端口可用來(lái)唯一地標(biāo)識(shí)計(jì)算機(jī)上的進(jìn)程。由于傳輸層有TCP和UDP兩個(gè)協(xié)議,因此端口又可分為T(mén)CP端口和UDP端口,每臺(tái)主機(jī)上最多可有65536個(gè)TCP端口和65536個(gè)UDP端口,也就是說(shuō)在每臺(tái)計(jì)算機(jī)最多可以區(qū)分65536個(gè)TCP進(jìn)程和65536個(gè)UDP進(jìn)程。
套接字Socket是網(wǎng)絡(luò)主機(jī)的兩個(gè)進(jìn)程進(jìn)行通信連接的端點(diǎn),可以在指定計(jì)算機(jī)的某個(gè)空閑端口上創(chuàng)建套接字,那么網(wǎng)絡(luò)主機(jī)可以通過(guò)套接字在網(wǎng)絡(luò)中定位計(jì)算機(jī)及端口,并且進(jìn)行數(shù)據(jù)的發(fā)送和接收。根據(jù)使用的傳輸協(xié)議,套接字又可以分為T(mén)CP套接字和UDP套接字。在網(wǎng)絡(luò)編程中,套接字編程是比較常用的。本文介紹了網(wǎng)絡(luò)主機(jī)利用TCP套接字和UDP套接字進(jìn)行通信的流程,并介紹了在Java中是如何實(shí)現(xiàn)TCP套接字和UDP套接字編程的。
1 TCP Socket
TCP Socket 是基于TCP協(xié)議(傳輸控制協(xié)議)的套接字。TCP協(xié)議是面向連接的傳輸協(xié)議,在進(jìn)行通信前必須先建立通信連接,它是一種可靠的傳輸協(xié)議,傳輸數(shù)據(jù)的質(zhì)量比較高,適用于傳輸大量數(shù)據(jù)的場(chǎng)合,但是它的傳輸速率比較慢。在Java中,提供了java.net.ServerSocket和java.net.Socket等類(lèi)來(lái)實(shí)現(xiàn)TCP套接字。
ServerSocket類(lèi)用于服務(wù)器端代碼中,它的作用是啟動(dòng)服務(wù)器端的TCP端口,并且監(jiān)聽(tīng)該端口是否有連接請(qǐng)求,如果有連接請(qǐng)求,則接受連接請(qǐng)求,并且返回一個(gè)本地Socket對(duì)象用來(lái)與對(duì)方進(jìn)行通信。
Socket類(lèi)用于兩臺(tái)網(wǎng)絡(luò)主機(jī)之間進(jìn)行通信,在客戶(hù)端代碼和服務(wù)端代碼中都需要Socket類(lèi)的對(duì)象。在客戶(hù)端代碼中的Socket還負(fù)責(zé)向指定的服務(wù)器上的TCP端口發(fā)出連接請(qǐng)求,如果服務(wù)器接受了連接請(qǐng)求,則可使用Socket與對(duì)方進(jìn)行通信。
網(wǎng)絡(luò)主機(jī)使用TCP套接字的通信流程如圖1所示:
服務(wù)端和客戶(hù)端都可以向?qū)Ψ桨l(fā)送數(shù)據(jù)或者接收數(shù)據(jù),發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的過(guò)程可以是一個(gè)持續(xù)的過(guò)程,使用循環(huán)就可以實(shí)現(xiàn)這個(gè)持續(xù)的過(guò)程。當(dāng)服務(wù)端需要處理多個(gè)客戶(hù)的連接請(qǐng)求的時(shí)候,就需要用到多線程了,為每個(gè)客戶(hù)單獨(dú)創(chuàng)建一個(gè)套接字來(lái)處理客戶(hù)的連接請(qǐng)求,并且進(jìn)行數(shù)據(jù)的發(fā)送和接收。在javax.net包中還提供了增強(qiáng)版的SSLServerSocket和SSLSocket,用來(lái)構(gòu)造安全的套接字對(duì)象。
2 UDP Socket
UDP Socket是使用UDP協(xié)議(用戶(hù)數(shù)據(jù)報(bào)協(xié)議)的套接字。UDP協(xié)議是無(wú)連接的傳輸協(xié)議,在雙方進(jìn)行通信之前不需要事先建立連接,它提供的傳輸服務(wù)是簡(jiǎn)單的、不太可靠的,但是傳輸數(shù)據(jù)的速度比較快,適用于數(shù)據(jù)量比較少、對(duì)數(shù)據(jù)的實(shí)時(shí)性要求比較高的場(chǎng)合。
在Java中提供了java.net.DatagramSocket和java.net.DatagramPacket等類(lèi)來(lái)實(shí)現(xiàn)UDP套接字。DatagramSocket類(lèi)用來(lái)啟動(dòng)UDP端口,通過(guò)該端口進(jìn)行數(shù)據(jù)的發(fā)送和接收;DatagramPacket用來(lái)創(chuàng)建通信時(shí)所發(fā)送和接收的數(shù)據(jù)報(bào)對(duì)象。
網(wǎng)絡(luò)主機(jī)使用UDP套接字進(jìn)行通信的流程如圖2所示,每臺(tái)網(wǎng)絡(luò)主機(jī)均可進(jìn)行數(shù)據(jù)報(bào)的發(fā)送和接收,可以使用多線程來(lái)實(shí)現(xiàn)數(shù)據(jù)報(bào)的同時(shí)收發(fā),也可以用循環(huán)來(lái)實(shí)現(xiàn)持續(xù)地發(fā)送和接收數(shù)據(jù)報(bào)的過(guò)程。
3 結(jié)束語(yǔ)
文中探討了Java中的套接字編程,闡述了TCP套接字和UDP套接字的基本工作流程、適用場(chǎng)合以及編程的基本步驟。在實(shí)際的應(yīng)用中,應(yīng)根據(jù)問(wèn)題的數(shù)據(jù)量大小、對(duì)數(shù)據(jù)質(zhì)量的要求、傳輸速率的要求等來(lái)考慮使用TCP套接字還是UDP套接字來(lái)進(jìn)行主機(jī)的通信。
參考文獻(xiàn):
[1] 朱輝. Java網(wǎng)絡(luò)程序設(shè)計(jì)[M]. 西安: 西安電子科技大學(xué)出版社, 2015.
[2] 戴歆. JAVA TCP/IP Socket 網(wǎng)絡(luò)通信編程研究[J]. 電腦知識(shí)與技術(shù), 2013(9).
[3] 陳浩, 張偉. 基于javasocket 的TCP/IP網(wǎng)絡(luò)編程[J]. 計(jì)算機(jī)光盤(pán)軟件與應(yīng)用, 2013(2).