一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java Socket編程詳解及示例代碼

Java Socket編程詳解及示例代碼

2020-06-11 15:45技術小黑屋 JAVA教程

本文主要講解Java Socket編程,這里整理了詳細的技術資料及簡單的示例代碼幫助大家學習參考,有需要的小伙伴可以參考下本文內容

Socket,又稱為套接字,Socket是計算機網絡通信的基本的技術之一。如今大多數基于網絡的軟件,如瀏覽器,即時通訊工具甚至是P2P下載都是基于Socket實現的。本文會介紹一下基于TCP/IP的Socket編程,并且如何寫一個客戶端/服務器程序。

餐前甜點

Unix的輸入輸出(IO)系統遵循Open-Read-Write-Close這樣的操作范本。當一個用戶進程進行IO操作之前,它需要調用Open來指定并獲取待操作文件或設備讀取或寫入的權限。一旦IO操作對象被打開,那么這個用戶進程可以對這個對象進行一次或多次的讀取或寫入操作。Read操作用來從IO操作對象讀取數據,并將數據傳遞給用戶進程。Write操作用來將用戶進程中的數據傳遞(寫入)到IO操作對象。 當所有的Read和Write操作結束之后,用戶進程需要調用Close來通知系統其完成對IO對象的使用。

在Unix開始支持進程間通信(InterProcess Communication,簡稱IPC)時,IPC的接口就設計得類似文件IO操作接口。在Unix中,一個進程會有一套可以進行讀取寫入的IO描述符。IO描述符可以是文件,設備或者是通信通道(socket套接字)。一個文件描述符由三部分組成:創建(打開socket),讀取寫入數據(接受和發送到socket)還有銷毀(關閉socket)。

在Unix系統中,類BSD版本的IPC接口是作為TCP和UDP協議之上的一層進行實現的。消息的目的地使用socket地址來表示。一個socket地址是由網絡地址和端口號組成的通信標識符。

進程間通信操作需要一對兒socket。進程間通信通過在一個進程中的一個socket與另一個進程中得另一個socket進行數據傳輸來完成。當一個消息執行發出后,這個消息在發送端的socket中處于排隊狀態,直到下層的網絡協議將這些消息發送出去。當消息到達接收端的socket后,其也會處于排隊狀態,直到接收端的進程對這條消息進行了接收處理。

TCP和UDP通信

關于socket編程我們有兩種通信協議可以進行選擇。一種是數據報通信,另一種就是流通信。

數據報通信

數據報通信協議,就是我們常說的UDP(User Data Protocol 用戶數據報協議)。UDP是一種無連接的協議,這就意味著我們每次發送數據報時,需要同時發送本機的socket描述符和接收端的socket描述符。因此,我們在每次通信時都需要發送額外的數據。

流通信

流通信協議,也叫做TCP(Transfer Control Protocol,傳輸控制協議)。和UDP不同,TCP是一種基于連接的協議。在使用流通信之前,我們必須在通信的一對兒socket之間建立連接。其中一個socket作為服務器進行監聽連接請求。另一個則作為客戶端進行連接請求。一旦兩個socket建立好了連接,他們可以單向或雙向進行數據傳輸。

讀到這里,我們多少有這樣的疑問,我們進行socket編程使用UDP還是TCP呢。選擇基于何種協議的socket編程取決于你的具體的客戶端-服務器端程序的應用場景。下面我們簡單分析一下TCP和UDP協議的區別,或許可以幫助你更好地選擇使用哪種。

在UDP中,每次發送數據報時,需要附帶上本機的socket描述符和接收端的socket描述符。而由于TCP是基于連接的協議,在通信的socket對之間需要在通信之前建立連接,因此會有建立連接這一耗時存在于TCP協議的socket編程。

在UDP中,數據報數據在大小上有64KB的限制。而TCP中也不存在這樣的限制。一旦TCP通信的socket對建立了連接,他們之間的通信就類似IO流,所有的數據會按照接受時的順序讀取。

UDP是一種不可靠的協議,發送的數據報不一定會按照其發送順序被接收端的socket接受。然后TCP是一種可靠的協議。接收端收到的包的順序和包在發送端的順序是一致的。

簡而言之,TCP適合于諸如遠程登錄(rlogin,telnet)和文件傳輸(FTP)這類的網絡服務。因為這些需要傳輸的數據的大小不確定。而UDP相比TCP更加簡單輕量一些。UDP用來實現實時性較高或者丟包不重要的一些服務。在局域網中UDP的丟包率都相對比較低。

Java中的socket編程

下面的部分我將通過一些示例講解一下如何使用socket編寫客戶端和服務器端的程序。

注意:在接下來的示例中,我將使用基于TCP/IP協議的socket編程,因為這個協議遠遠比UDP/IP使用的要廣泛。并且所有的socket相關的類都位于java.net包下,所以在我們進行socket編程時需要引入這個包。

客戶端編寫

開啟Socket

如果在客戶端,你需要寫下如下的代碼就可以打開一個socket。

?
1
2
3
String host = "127.0.0.1";
int port = 8919;
Socket client = new Socket(host, port);

上面代碼中,host即客戶端需要連接的機器,port就是服務器端用來監聽請求的端口。在選擇端口時,需要注意一點,就是0~1023這些端口都已經被系統預留了。這些端口為一些常用的服務所使用,比如郵件,FTP和HTTP。當你在編寫服務器端的代碼,選擇端口時,請選擇一個大于1023的端口。

寫入數據

接下來就是寫入請求數據,我們從客戶端的socket對象中得到OutputStream對象,然后寫入數據后。很類似文件IO的處理代碼。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ClientSocket {
 public static void main(String args[]) {
    String host = "127.0.0.1";
    int port = 8919;
    try {
     Socket client = new Socket(host, port);
     Writer writer = new OutputStreamWriter(client.getOutputStream());
     writer.write("Hello From Client");
     writer.flush();
     writer.close();
     client.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
  }
 
}

關閉IO對象

類似文件IO,在讀寫數據完成后,我們需要對IO對象進行關閉,以確保資源的正確釋放。

服務器端編寫

打開服務器端的socket

?
1
2
3
int port = 8919;
ServerSocket server = new ServerSocket(port);
Socket socket = server.accept();

上面的代碼創建了一個服務器端的socket,然后調用accept方法監聽并獲取客戶端的請求socket。accept方法是一個阻塞方法,在服務器端與客戶端之間建立聯系之前會一直等待阻塞。

讀取數據

通過上面得到的socket對象獲取InputStream對象,然后安裝文件IO一樣讀取數據即可。這里我們將內容打印出來。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ServerClient {
 public static void main(String[] args) {
    int port = 8919;
    try {
      ServerSocket server = new ServerSocket(port);
        Socket socket = server.accept();
      Reader reader = new InputStreamReader(socket.getInputStream());
      char chars[] = new char[1024];
      int len;
      StringBuilder builder = new StringBuilder();
      while ((len=reader.read(chars)) != -1) {
        builder.append(new String(chars, 0, len));
      }
      System.out.println("Receive from client message=: " + builder);
      reader.close();
      socket.close();
      server.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
 }
}

關閉IO對象

還是不能忘記的,最后需要正確地關閉IO對象,以確保資源的正確釋放。

附注一個例子

這里我們增加一個例子,使用socket實現一個回聲服務器,就是服務器會將客戶端發送過來的數據傳回給客戶端。代碼很簡單。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.*;
import java.net.*;
public class EchoServer {
  public static void main(String args[]) {
    // declaration section:
    // declare a server socket and a client socket for the server
    // declare an input and an output stream
    ServerSocket echoServer = null;
    String line;
    DataInputStream is;
    PrintStream os;
    Socket clientSocket = null;
    // Try to open a server socket on port 9999
    // Note that we can't choose a port less than 1023 if we are not
    // privileged users (root)
    try {
      echoServer = new ServerSocket(9999);
    }
    catch (IOException e) {
      System.out.println(e);
    }
    // Create a socket object from the ServerSocket to listen and accept
    // connections.
    // Open input and output streams
    try {
        clientSocket = echoServer.accept();
        is = new DataInputStream(clientSocket.getInputStream());
        os = new PrintStream(clientSocket.getOutputStream());
        // As long as we receive data, echo that data back to the client.
        while (true) {
         line = is.readLine();
         os.println(line);
        }
    } catch (IOException e) {
        System.out.println(e);
      }
    }
}

編譯運行上面的代碼,進行如下請求,就可以看到客戶端請求攜帶的數據的內容。

?
1
2
3
4
5
15:00 $ curl http://127.0.0.1:9999/?111
GET /?111 HTTP/1.1
User-Agent: curl/7.37.1
Host: 127.0.0.1:9999
Accept: */*

總結

進行客戶端-服務器端編程還是比較有趣的,同時在Java中進行socket編程要比其他語言(如C)要簡單快速編寫。

java.net這個包里面包含了很多強大靈活的類供開發者進行網絡編程,在進行網絡編程中,建議使用這個包下面的API。同時Sun.*這個包也包含了很多的網絡編程相關的類,但是不建議使用這個包下面的API,因為這個包可能會改變,另外這個包不能保證在所有的平臺都有包含。

以上就是對Java Socket資料的整理,后續繼續補充相關知識,謝謝大家對本站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费又爽又黄禁片视频在线播放 | 国产精品久久久久久爽爽爽 | 91污污视频| 1024免费观看完整版在线播放 | 欧美一级艳片视频免费观看 | 亚洲AV久久无码精品蜜桃 | 大肥臀风间由美 中文字幕 大东北chinesexxxx露脸 | 欧美专区综合 | 色男人网 | 国产第一页在线视频 | 91欧美秘密入口 | 91精品免费国产高清在线 | 皇上好大好硬好涨好深好爽 | 996热在线视频 | 久草在线福利资站免费视频 | 精精国产xxxx视频在线播放器 | 国产老村长足疗店对白 | 操娇妻 | 国产成人综合亚洲亚洲欧美 | 午夜香蕉成视频人网站高清版 | 日出水了特别黄的视频 | 无码人妻丰满熟妇啪啪网不卡 | 亚洲国产精品久久精品怡红院 | 国产精品亚洲精品日韩已满 | 奇米影视久久777中文字幕 | 91在线视频国产 | 欧美黑人一级 | bestialityvideo另类 | 免费观看无人区完整版 | 日本午夜vr影院新入口 | 四虎1515hh.com | 奇米久草| 成人人免费夜夜视频观看 | 日韩经典在线 | 91精品免费观看老司机 | 亚洲 欧美 国产 综合久久 | 青青青国产 | 99热这里只有精品在线观看 | 99视频有精品视频免费观看 | 精品suv一区二区三区 | 国产精品免费精品自在线观看 |