茹志鵑
正德職業技術學院,江蘇 南京 211106
基于用戶數據報協議的Java Socket數據通信
茹志鵑
正德職業技術學院,江蘇 南京 211106
數據通信是網絡的主要應用之一,隨著網絡的快速發展,大多程序設計語言都開發了實現數據通信的應用程序接口,Java語言也不例外。Java語言,因平臺無關和多線程的特性,被廣泛應用于Web開發中,其豐富的類庫中提供了Socket套接字,應用程序可通過套接字向網絡發出請求或者應答網絡請求,非常方便的實現網絡間的數據通信。基于用戶數據報通信協議或者傳輸控制協議,利用Java語言的面向對象、多線程、可視化程序開發以及Socket套接字技術,可以非常簡單的實現多個客戶端之間的網絡數據通信。
Socket;UDP;數據報;多線程
Java作為一種程序設計語言,簡單、面向對象、不依賴于機器的結構、具有可移植性、安全性、并且提供了并發的機制、具有很高的性能,最大限度地利用了網絡,還提供了豐富的類庫,使程序設計者可以很方便地開發自己的系統。Java語言的眾多特點中,最特別的就是與平臺無關和多線程了,也因此被廣泛用于Web開發中。java.net包中,提供了網絡編程所需要各個類,通過這些類,可方便的開發網絡間數據通信程序。
實現網絡間的數據通信,必須基于傳輸層的兩個服務質量不同的協議——TCP和UDP,Java類庫中提供了DatagramSocket和DatagramPacket兩個類來實現基于UDP協議的數據通信,同時也提供了Socket和ServerSocket兩個類來實現基于TCP協議的數據通信,下面主要介紹基于UDP協議的數據通信。
1.1 UDP協議
UDP(User Datagram Protocol,用戶數據報協議)協議是OSI參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務,是一個簡單的面向數據報的傳輸層協議,傳送數據前并不與對方建立連接,在傳輸數據前,發送方和接收方相互交換信息使雙方同步,對接收到的數據包也不發送確認信號,發送端不知道數據是否被正確接收,也不會重發數據,因此具有較好的實時性和工作效率。
1.2 SOCKET
所謂socket通常也稱作“套接字”,是網絡編程中的一個接口,用于描述IP地址和端口,是一個通信鏈的句柄,應用程序通過“套接字”向網絡發出請求或者應答網絡請求。
J a v a語言的U D P通信中,使用DatagramSocket類來創建收、發數據報的Socket對象。與TCP通信不同,它不存在“連接”的概念,取而代之的是一個數據報包DatagramPacket對象,這個數據報包本身包含IP地址、端口號和數據內容,據此可以知道發送方和目的地。
使用DatagramSocket的構造方法public DatagramSocket(int port)throws SocketException來創建數據報套接字,并綁定到指定的端口上。對于數據報的接收,主要使用DatagramPacket 類的public DatagramPacket(byte buf[],int length)方法構造DatagramPacket對象,來接收長度為length的數據報包,發送數據報使用public DatagramPacket(byte[] buf, int length, InetAddress address, int port)構造數據報包,用來將長度為length的包發送到指定主機上的指定端口號。
程序的設計過程中,界面制作可使用Java開發的可視化編程工具,創建窗口后,添加輸出信息的文本區域和輸入信息的文本框兩個控件,并且對回車事件和窗口關閉事件進行處理,這里不再介紹。下面主要介紹使用DatagramSocket和DatagramPacket兩個類編寫數據通信的代碼和為提高程序的運行速度所采用的多線程機制。
2.1 創建接收和發送程序
導入網絡編程所需要的包java.net,就可以開始編寫發送數據功能的方法代碼2-1和接收數據功能的方法代碼2-2。

代碼2-2 接收數據報代碼
接收方ds綁定端口號8000,并創建數據報dp,等待接收發送方發送的數據;發送方ds無需綁定固定端口號,但必須在創建數據報dp時,指定要發送到電腦的IP地址和端口號8000,通過代碼2-1和2-2就可以實現簡單的基于UDP協議的數據通信。
2.2 多線程技術
一般來說,當運行一個應用程序的時候,就啟動了一個進程,有時會啟動多個進程。啟動進程的時候,操作系統會為進程分配資源,其中最主要的資源是內存空間。在進程中,有些程序流程塊是可以亂序執行的,并且這個代碼塊可以同時被多次執行,這樣的代碼塊就是線程體。線程是進程中亂序執行的代碼流程,當多個線程同時運行的時候,這樣的執行模式稱為并發執行,多線程的目的是為了最大限度的利用CPU資源。
Java編寫程序都運行在Java虛擬機(JVM)中,在JVM的內部,程序的多任務是通過線程來實現的。每個正在系統上運行的程序都是一個進程,每個進程包含一到多個線程,進程也可能是整個程序或者是部分程序的動態執行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨立執行,也可以把它理解為代碼運行的上下文。所以線程基本上是輕量級的進程,它負責在單個程序里執行多任務,通常由操作系統負責多個線程的調度和執行。Java語言中用多線程來同時為多個客戶提供服務,這是提高服務器的并發性能的最常用手段。
在網絡編程中,使用多線程可以把占據長時間的等待接收聊天信息的程序任務放到后臺去處理,使程序的運行速度加快,提高CPU的利用率,在等待接收聊天信息的同時能夠發送聊天信息給對方。
Java中用擴展Thread類或者實現Runnable接口兩種方法來實現多線程,將發送數據端代碼2-1和接收數據端代碼2-2寫在實現多線程的run方法中即可。run方法是多線程程序的一個約定,所有的多線程代碼都在run方法里面。Thread類實際上也是實現了Runnable接口的類。在啟動多線程的時候,需要先通過Thread類的構造方法Thread(Runnable target) 構造出對象,然后調用Thread對象的start()方法來運行多線程代碼。實際上所有的多線程代碼都是通過運行Thread的start()方法來運行的。因此,不管是擴展Thread類還是實現Runnable接口來實現多線程,最終還是通過Thread的對象來控制線程的。
本文介紹的DatagramSocket只允許數據報發往一個目的地,還可以使用java.net包中的類MulticastSocket。在發送數據報時使用MulticastSocket類,可以將數據報以廣播方式發送到指定端口的所有客戶。
網絡特別是計算機網絡的發展,越來越深刻的改變著人們生活的方方面面。當需要實時快速時,人們僅僅只需要簡單的通訊,這時可以使用UDP協議來實現數據通信的功能。但是由于UDP協議的無連接,若需要安全可靠的數據通信時,就需要選擇有連接的TCP協議來進行數據通信了。
總之,無論使用任何語言,任何方式實現數據通信,都必須遵循固定的步驟進行操作,在熟悉了這些步驟以后,可以根據需要進行邏輯上的處理,但還是必須以固定的步驟為前提。其實,實現基礎的數據通信本身不難,也不需要很多的基礎網絡知識,編程的基礎功能都已經由應用程序接口實現,只需要按照固定的步驟進行即可,例如使用Java提供的Socket接口和多線程技術,可方便高效的開發基于UDP或TCP的通信軟件,實現網絡間數據通信。
[1]孫衛琴 編著. JAVA網絡編程精解[M].北京:電子工業出版社, 2007.2
[2]劉永華.于春花編著.Java網絡編程技術[M].北京:清華大學出版社,2008.5
10.3969/j.issn.1001-8972.2012.09.054
茹志鵑、本科、講師、計算機科學與技術。