java網路程式設計
對於網路方面的知識在這裡不作詳細的介紹,讀者可以參考《TCP/IP詳解 I II III》等網路書籍。
下面簡單的談下網路通訊協議和網路通訊協議介面。
網路通訊協議:計算機網路中實現通訊必須有一些約定即通訊協議,對速率,傳輸程式碼,程式碼結構,傳輸控制步驟,出錯控制等制定標準。
網路通訊介面:為了使兩個結點之間能進行對話,必須在它們之間建立通訊工具(即介面),使得彼此之間能進行資訊交換。介面包括兩部分:
java中提供了兩種常見的網路協議支援,TCP/UDP,關於這這兩種協議,懂網路基礎知識的朋友都知道這兩種協議屬於OSI(TCP/IP)中運輸層的協議,在TCP/IP中,把OSI簡化為四層,其中運輸層與應用層直接互動。
下面簡單的介紹TCP/UDP協議:
TCP:是專門設計用於在不可靠的因特網上提供可靠的,端到端的位元組流通訊協議,它是一種面向連線的協議。TCP連線是位元組流而非報文流。
UDP:嚮應用程式提供了了一種傳送封裝的原始IP資料包(包,分組)的方法,並且傳送時無需建立連線,是一種不可靠的連線,但是效率高,廣泛的運用在影片傳輸,語音通話等通訊中。
而Socket 程式設計是使用最廣泛的網路概念套接字使用TCP提供了兩臺計算機之間的通訊機制。 客戶端程式建立一個套接字,並嘗試連接伺服器的套接字。當連線建立時,伺服器會建立一個Socket物件。客戶端和伺服器現在可以透過對Socket物件的寫入和讀取來進行進行通訊。java.net.Socket類代表一個套接字,並java.net.ServerSocket類為伺服器程式提供了一種來監聽客戶端,並與他們建立連線的機制。
以下步驟在兩臺計算機之間使用套接字建立TCP連線時會出現:
伺服器例項化一個ServerSocket物件,表示透過伺服器上的埠通訊,該物件很像監聽器,監聽客戶端是否有使用者來連線。伺服器呼叫 ServerSocket類 的accept()方法,該方法將一直等待,直到客戶端連線到服務器上給定的埠。伺服器正在等待時,一個客戶端例項化一個Socket物件,指定伺服器名稱和埠號來請求連接。Socket類的建構函式試圖將客戶端連線到指定的伺服器和埠號。如果通訊被建立,則在客戶端建立一個Socket物件能夠與伺服器進行通訊。在伺服器端,accept()方法返回伺服器上一個新的socket引用,該socket連線到客戶端的socket。連線建立後,透過使用I/O流在進行通訊。每一個socket都有一個輸出流和一個輸入流。客戶端的輸出流連線到伺服器端的輸入流,而客戶端的輸入流連線到伺服器端的輸出流。TCP是一個雙向的通訊協議,因此資料可以透過兩個資料流在同一時間傳送.以下是一些類提供的一套完整的有用的方法來實現sockets。具體方法詳見java.net包中定義的兩個類Scoket和ServerScoket。()
以上client與server通訊過程可以簡單的用下面的示意圖來表示:

下面客戶端與伺服器端進行簡單的TCP協議通訊:
從上面看出,client端發出與ip為127.0.0.1,埠號為11111的伺服器進行socket通訊,並且對伺服器端發出問候,此時伺服器端的accept()正在監視11111埠,如果有socket請求,則馬上建立連線,並把從客戶端發來的資訊列印出來,此時伺服器端也向客戶端發出問候,並列印結果:


上面只是簡單的一對一進行通訊,可以多個客戶端對一個伺服器端發出通訊請求, 對上面的程式碼進行修改就可以簡單實現,再新增一個客戶端類TCPClient1,程式碼如下:
下面談談基於UDP協議的網路通訊,由於UDP通訊是傳送的IP資料包,無需建立連線,是一種不可靠的連線,這和TCP通訊有很大的區別。
以上同樣是server與Client端相互通訊,和TCP協議通訊有很大的區別,其中有很多的細節還需要注意。雖然UDP不需要建立連線,但是在網路傳送中,需要告訴它目的主機IP,以及應用程式埠號,然後經過層層的封裝,然後由底層物理鏈路傳送位元流。
以上作為個人學習總結,有很多知識沒有總結到,比如URL,URI類。上文如有不當或錯誤之處,請讀者指正!謝謝!
下面簡單的談下網路通訊協議和網路通訊協議介面。
網路通訊協議:計算機網路中實現通訊必須有一些約定即通訊協議,對速率,傳輸程式碼,程式碼結構,傳輸控制步驟,出錯控制等制定標準。
網路通訊介面:為了使兩個結點之間能進行對話,必須在它們之間建立通訊工具(即介面),使得彼此之間能進行資訊交換。介面包括兩部分:
java中提供了兩種常見的網路協議支援,TCP/UDP,關於這這兩種協議,懂網路基礎知識的朋友都知道這兩種協議屬於OSI(TCP/IP)中運輸層的協議,在TCP/IP中,把OSI簡化為四層,其中運輸層與應用層直接互動。
下面簡單的介紹TCP/UDP協議:
TCP:是專門設計用於在不可靠的因特網上提供可靠的,端到端的位元組流通訊協議,它是一種面向連線的協議。TCP連線是位元組流而非報文流。
UDP:嚮應用程式提供了了一種傳送封裝的原始IP資料包(包,分組)的方法,並且傳送時無需建立連線,是一種不可靠的連線,但是效率高,廣泛的運用在影片傳輸,語音通話等通訊中。
而Socket 程式設計是使用最廣泛的網路概念套接字使用TCP提供了兩臺計算機之間的通訊機制。 客戶端程式建立一個套接字,並嘗試連接伺服器的套接字。當連線建立時,伺服器會建立一個Socket物件。客戶端和伺服器現在可以透過對Socket物件的寫入和讀取來進行進行通訊。java.net.Socket類代表一個套接字,並java.net.ServerSocket類為伺服器程式提供了一種來監聽客戶端,並與他們建立連線的機制。
以下步驟在兩臺計算機之間使用套接字建立TCP連線時會出現:
伺服器例項化一個ServerSocket物件,表示透過伺服器上的埠通訊,該物件很像監聽器,監聽客戶端是否有使用者來連線。伺服器呼叫 ServerSocket類 的accept()方法,該方法將一直等待,直到客戶端連線到服務器上給定的埠。伺服器正在等待時,一個客戶端例項化一個Socket物件,指定伺服器名稱和埠號來請求連接。Socket類的建構函式試圖將客戶端連線到指定的伺服器和埠號。如果通訊被建立,則在客戶端建立一個Socket物件能夠與伺服器進行通訊。在伺服器端,accept()方法返回伺服器上一個新的socket引用,該socket連線到客戶端的socket。連線建立後,透過使用I/O流在進行通訊。每一個socket都有一個輸出流和一個輸入流。客戶端的輸出流連線到伺服器端的輸入流,而客戶端的輸入流連線到伺服器端的輸出流。TCP是一個雙向的通訊協議,因此資料可以透過兩個資料流在同一時間傳送.以下是一些類提供的一套完整的有用的方法來實現sockets。具體方法詳見java.net包中定義的兩個類Scoket和ServerScoket。()
以上client與server通訊過程可以簡單的用下面的示意圖來表示:

下面客戶端與伺服器端進行簡單的TCP協議通訊:
點選(此處)摺疊或開啟
-
public class TCPServer {
-
public static void main(String[] args){
-
-
try {
-
@SuppressWarnings("resource")
-
ServerSocket server = new ServerSocket(11111);
-
Socket ser = server.accept();
-
DataInputStream in = new DataInputStream(ser.getInputStream());
-
OutputStream ou = ser.getOutputStream();
-
DataOutputStream out = new DataOutputStream(ou);
-
out.writeUTF("hi!Client!");
-
System.out.println(in.readUTF());
-
out.flush();
- out.close();
-
} catch (IOException e) {
-
// TODO 自動生成的 catch 塊
-
e.printStackTrace();
- }
-
}
-
}
-
-
public class TCPClient {
-
public static void main(String[] args){
-
-
try {
-
@SuppressWarnings("resource")
-
Socket client = new Socket("127.0.0.1",11111);
-
OutputStream out = client.getOutputStream();
-
DataOutputStream data = new DataOutputStream(out);
-
DataInputStream inn = new DataInputStream(client.getInputStream());
-
System.out.println(inn.readUTF());
-
data.writeUTF("hi!server!");
-
data.flush();
- data.close();
-
inn.close();
client.close();
- } catch (UnknownHostException e) {
-
e.printStackTrace();
- } catch (IOException e) {
-
e.printStackTrace();
- }
-
}
- }
從上面看出,client端發出與ip為127.0.0.1,埠號為11111的伺服器進行socket通訊,並且對伺服器端發出問候,此時伺服器端的accept()正在監視11111埠,如果有socket請求,則馬上建立連線,並把從客戶端發來的資訊列印出來,此時伺服器端也向客戶端發出問候,並列印結果:


上面只是簡單的一對一進行通訊,可以多個客戶端對一個伺服器端發出通訊請求, 對上面的程式碼進行修改就可以簡單實現,再新增一個客戶端類TCPClient1,程式碼如下:
點選(此處)摺疊或開啟
-
public class TCPServer {
-
public static void main(String[] args){
-
-
try {
-
@SuppressWarnings("resource")
-
ServerSocket server = new ServerSocket(11111);
-
while(true){
-
Socket ser = server.accept();
-
DataInputStream in = new DataInputStream(ser.getInputStream());
-
OutputStream ou = ser.getOutputStream();
-
DataOutputStream out = new DataOutputStream(ou);
-
out.writeUTF("hi!Client!");
-
System.out.println(in.readUTF());
-
out.flush();
-
out.close();
-
}
-
} catch (IOException e) {
-
// TODO 自動生成的 catch 塊
-
e.printStackTrace();
- }
-
}
-
}
-
-
public class TCPClient {
-
public static void main(String[] args){
-
-
try {
-
@SuppressWarnings("resource")
-
Socket client = new Socket("127.0.0.1",11111);
-
OutputStream out = client.getOutputStream();
-
DataOutputStream data = new DataOutputStream(out);
-
DataInputStream inn = new DataInputStream(client.getInputStream());
-
System.out.println(inn.readUTF());
-
data.writeUTF("hi!server!");
-
data.flush();
-
data.close();
-
inn.close();
-
client.close();
-
} catch (UnknownHostException e) {
-
// TODO 自動生成的 catch 塊
-
e.printStackTrace();
-
} catch (IOException e) {
-
// TODO 自動生成的 catch 塊
-
e.printStackTrace();
- }
-
}
-
}
-
-
-
public class TCPClient1 {
-
-
public static void main(String[] args){
-
-
try {
-
@SuppressWarnings("resource")
-
Socket client = new Socket("127.0.0.1",11111);
-
OutputStream out = client.getOutputStream();
-
DataOutputStream data = new DataOutputStream(out);
-
DataInputStream inn = new DataInputStream(client.getInputStream());
-
System.out.println(inn.readUTF());
-
data.writeUTF("hi!server!");
-
data.flush();
-
data.close();
-
inn.close();
-
client.close();
-
} catch (UnknownHostException e) {
-
// TODO 自動生成的 catch 塊
-
e.printStackTrace();
-
} catch (IOException e) {
-
// TODO 自動生成的 catch 塊
-
e.printStackTrace();
- }
-
}
- }
下面談談基於UDP協議的網路通訊,由於UDP通訊是傳送的IP資料包,無需建立連線,是一種不可靠的連線,這和TCP通訊有很大的區別。
點選(此處)摺疊或開啟
-
public class UDPServer {
-
public static void main(String[] args){
-
-
byte b[] = new byte[1000];
-
DatagramPacket dp = new DatagramPacket(b, b.length);
-
ByteArrayOutputStream by = new ByteArrayOutputStream();
-
DataOutputStream byt = new DataOutputStream(by);
-
-
try {
-
DatagramSocket ds = new DatagramSocket(111);
-
ds.receive(dp);
-
ByteArrayInputStream bais = new ByteArrayInputStream(b);
-
DataInputStream dis = new DataInputStream(bais);
-
System.out.println(dis.readUTF());
-
byt.writeUTF("hi!Client!");
-
byte c[] = by.toByteArray();
-
DatagramPacket dpp = new DatagramPacket(c, c.length,new InetSocketAddress("127.0.0.1", 1111));
-
DatagramSocket dss = new DatagramSocket();
-
dss.send(dpp);
- } catch (SocketException e1) {
-
// TODO 自動生成的 catch 塊
-
e1.printStackTrace();
-
} catch (IOException e) {
-
// TODO 自動生成的 catch 塊
-
e.printStackTrace();
-
}
-
}
-
}
-
public class UDPClient {
-
public static void main(String[] args){
-
-
-
ByteArrayOutputStream w = new ByteArrayOutputStream();
-
DataOutputStream ou = new DataOutputStream(w);
-
byte d[] = new byte[1000];
-
DatagramPacket dpp = new DatagramPacket(d, d.length);
-
-
-
try {
-
-
DatagramSocket dss = new DatagramSocket(1111);
-
ou.writeUTF("hi,Server!");
-
byte a[] = w.toByteArray();
-
DatagramPacket dp = new DatagramPacket(a, a.length,new InetSocketAddress("127.0.0.1", 111));
-
DatagramSocket ds = new DatagramSocket();
-
ds.send(dp);
-
dss.receive(dpp);
-
ByteArrayInputStream bais = new ByteArrayInputStream(d);
-
DataInputStream dis = new DataInputStream(bais);
-
System.out.println(dis.readUTF());
-
} catch (IOException e) {
-
// TODO 自動生成的 catch 塊
-
e.printStackTrace();
-
}
-
}
- }
以上作為個人學習總結,有很多知識沒有總結到,比如URL,URI類。上文如有不當或錯誤之處,請讀者指正!謝謝!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29876893/viewspace-1830004/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java的序列化Serializable
- 編寫程式實現 f(n)=f(n-1)+f(n-2) (f(1)=1 和 f(2)=2 )函式。
- JavaWeb——驗證碼功能解決表單重複提交問題(使用谷歌驗證碼jar包為例)
- 分散式監控系統之Zabbix網路發現
- 關於Static程式碼塊、匿名程式碼塊、構造器的小擴充
- 幾大排序演算法的理解和程式碼實現(超級詳細的過程)
- Java(7)泛型
- 詳解Java鎖的升級與對比(1)——鎖的分類與細節(結合部分原始碼)
- 實現wx小程式API的 Promise化
- Java中的static詳細講解
- [head first 設計模式] 第一章 策略模式
- Java--異常的學習
- 卷積神經網路知識點總結
- vs2017打包程式外掛無法下載(installer poject)和打包過程
- JavaScript中 Map 物件詳解
- 微信小程式父子元件之間的資料傳遞
- Java中氣泡排序的原生實現方式(正序和逆序)