溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

12.4-全棧Java筆記:Java網(wǎng)絡(luò)編程(二)

發(fā)布時間:2020-06-29 00:00:32 來源:網(wǎng)絡(luò) 閱讀:263 作者:全棧Java 欄目:建站服務(wù)器
 基于TCP協(xié)議的Socket編程和通信

在網(wǎng)絡(luò)通訊中,第一次主動發(fā)起通訊的程序被稱作客戶端(Client)程序,簡稱客戶端,而在第一次通訊中等待連接的程序被稱作服務(wù)器(Server)程序,簡稱服務(wù)器。一旦通訊建立,則客戶端和服務(wù)器端完全一樣,沒有本質(zhì)的區(qū)別。 

“請求-響應(yīng)”模式

 Socket類:發(fā)送TCP消息

  ServerSocket類:創(chuàng)建服務(wù)器

套接字是一種進程間的數(shù)據(jù)交換機制。這些進程既可以在同一機器上,也可以在通過網(wǎng)絡(luò)連接的不同機器上。換句話說,套接字起到通信端點的作用。單個套接字是一個端點,而一對套接字則構(gòu)成一個雙向通信信道,使非關(guān)聯(lián)進程可以在本地或通過網(wǎng)絡(luò)進行數(shù)據(jù)交換。一旦建立套接字連接,數(shù)據(jù)即可在相同或不同的系統(tǒng)中雙向或單向發(fā)送,直到其中一個端點關(guān)閉連接。套接字與主機地址和端口地址相關(guān)聯(lián)。


主機地址就是客戶端或服務(wù)器程序所在的主機的IP地址。端口地址是指客戶端或服務(wù)器程序使用的主機的通信端口。在客戶端和服務(wù)器中,分別創(chuàng)建獨立的Socket,并通過Socket的屬性,將兩個Socket進行連接,這樣,客戶端和服務(wù)器通過套接字所建立連接使用輸入輸出流進行通信。


TCP/IP套接字是最可靠的雙向流協(xié)議,使用TCP/IP可以發(fā)送任意數(shù)量的數(shù)據(jù)。實際上,套接字只是計算機上已編號的端口。如果發(fā)送方和接收方計算機確定好端口,他們就可以通信了。

TCP/IP通信連接的簡單過程:

位于A計算機上的TCP/IP軟件向B計算機發(fā)送包含端口號的消息,B計算機的TCP/IP軟件接收該消息,并進行檢查,查看是否有他知道的程序正在該端口上接收消息。如果有,他就將該消息交給這個程序。

要使程序有效地運行,就必須有一個客戶端和一個服務(wù)器。

通過Socket的編程順序:

1.創(chuàng)建服務(wù)器ServerSocket,在創(chuàng)建時,定義ServerSocket的監(jiān)聽端口(在這個端口接收客戶端發(fā)來的消息?。?/span>

2.ServerSocket調(diào)用accept()方法,使之處于阻塞狀態(tài)

3.創(chuàng)建客戶機Socket,并設(shè)置服務(wù)器的IP及端口

4.客戶機發(fā)出連接請求,建立連接。

5.分別取得服務(wù)器和客戶端Socket的InputStream和OutputStream

6.利用Socket和ServerSocket進行數(shù)據(jù)傳輸。 

【示例1】單向通信服務(wù)器端代碼

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.net.ServerSocket;

import java.net.Socket;

 

/**

 * 最簡單的服務(wù)器端代碼

 * @author Administrator

 *

 */

public class BasicSocketServer {

   

    public static void main(String[] args) {

       try {

           //建立服務(wù)器端套接字

           ServerSocket serverSocket = new   ServerSocket(8888);  //TCP端口一共多少個??

           //監(jiān)聽,等待客戶端請求,并愿意接收連接。

           System.out.println("服務(wù)端建立監(jiān)聽");

           Socket socket = serverSocket.accept();

 

           //通過流向客戶端發(fā)送數(shù)據(jù)

//         ObjectOutputStream oos = new   ObjectOutputStream(socket.getOutputStream());

//         oos.writeObject("aaaaa");

//         oos.close();

          

           BufferedWriter bw   = new BufferedWriter(new   OutputStreamWriter(socket.getOutputStream()));

           bw.write("hhhh");

           bw.close();

          

           socket.close();

       } catch (IOException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

      

    }


【示例2】單向通信Socket客戶端代碼

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.net.InetAddress;

import java.net.Socket;

 

/**

 * 最簡單的Socket客戶端

 * @author Administrator

 *

 */

public class BasicSocketClient {

    public static void main(String[] args) {

       try {

           //指定的是所要連接的服務(wù)器的IP和端口。而不是自己機器的端口。發(fā)送端口是隨機的。

           Socket socket = new Socket(InetAddress.getLocalHost(),8888);

//         ObjectInputStream ois = new   ObjectInputStream(socket.getInputStream());

//         String string = (String) ois.readObject();

//         System.out.println(string);

          

           BufferedReader br   = new BufferedReader(new   InputStreamReader(socket.getInputStream()));

           System.out.println(br.readLine());

           br.close();

          

           socket.close();

          

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

本節(jié)我們掌握了Socket的單項通訊,那么如何實現(xiàn)Socket的雙向交流?下節(jié)我們重點講解下~





「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G,10年Java研發(fā)經(jīng)驗,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計及研發(fā)工作,從小白逐漸做到工程師、高級工程師、架構(gòu)師。精通Java平臺軟件開發(fā),精通JAVAEE,熟悉各種流行開發(fā)框架。


 筆記包含從淺入深的六大部分:

 A-Java入門階段

 B-數(shù)據(jù)庫從入門到精通

 C-手刃移動前端和Web前端

 D-J2EE從了解到實戰(zhàn)

 E-Java高級框架精解

 F-Linux和Hadoop 




向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI