最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java Socket通信

 更新時間:2017年02月10日 11:39:25   作者:鄭州的文武  
本篇文章主要介紹了深入理解Java Socket,Java中的網(wǎng)絡通信是通過Socket實現(xiàn)的,Socket分為ServerSocket和Socket兩大類,有興趣的可以了解一下

簡述

Java中Socket分為普通Socket和NioSocket兩種,這里介紹Socket。

我們可以把Socket比作兩個城市間的交通工具,有了它可以在兩城之間來回穿梭,交通工具有很多種,每種交通工具也有相應的交通規(guī)則。Socket也一樣,也有多種。大多情況下使用的是TCP/IP的流套接字,它是一種穩(wěn)定的通信協(xié)議。(TCP/IP與UDP的對比)

Java中的網(wǎng)絡通信是通過Socket實現(xiàn)的,Socket分為ServerSocket和Socket兩大類,ServerSocket用于服務端,通過accept方法監(jiān)聽請求,監(jiān)聽到請求后返回Socket,Socket用于具體完成數(shù)據(jù)傳輸,客戶端直接使用Socket發(fā)起請求并傳輸數(shù)據(jù)。

ServerSocket的使用可以分為三步:

1.創(chuàng)建ServerSocket。ServerSocket的構造方法一共有5個,通常用的是ServerSocket(int port),只需要端口號(port)即可。

2.調用創(chuàng)建出來的ServerSocket的accept方法進行監(jiān)聽。accept方法時阻塞方法,也就是說調用accept方法后程序會停下來等待連接請求,在接收到請求之前程序將不會往下走。當接收到請求后accept方法會返回一個Socket。

3.使用accept方法返回的Socket與客戶端進行通信。

栗子

Client:

package IO;

import java.io.*;
import java.net.Socket;
import java.util.Date;

/**
 * Created by zhengbin06 on 2017/2/2.
 */
public class Client {
  public static void main(String[] args) {
    String msg = "Client Data";
    try {
      Socket socket = new Socket("127.0.0.1", 9090);

      // 先寫、再讀
      PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
      // 發(fā)送數(shù)據(jù)
      printWriter.println(msg);
      printWriter.flush();
      // 獲得服務端返回的數(shù)據(jù)
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      String line = bufferedReader.readLine();
      System.out.println("received from server: " + line + "\ttime=" + new Date().getTime());
      // 關閉資源
      printWriter.close();
      bufferedReader.close();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Server:

package IO;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

/**
 * Created by zhengbin06 on 2017/2/2.
 */
public class Server {
  private static Socket socket = null;
  private static ServerSocket serverSocket = null;
  public static void main(String[] args) throws IOException {
    BufferedReader bufferedReader = null;
    PrintWriter printWriter = null;
    try {
      // 創(chuàng)建一個ServerSocket監(jiān)聽9090端口
      serverSocket = new ServerSocket(9090);
      while (true) {
        System.out.println("開始等待請求。。。。");
        // 等待請求
        // 監(jiān)聽并接受到此套接字的連接。此方法在連接傳入之前一直阻塞。
        socket = serverSocket.accept();
        System.out.println("接收到請求:" + socket.toString() + "\ttime=" + new Date().getTime());
        // 接收到請求后使用socket進行通信, 創(chuàng)建BufferedReader用于讀取數(shù)據(jù)
        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line = bufferedReader.readLine();
        System.out.println("received from client: " + line + "\ttime=" + new Date().getTime());
  
        // 創(chuàng)建PrintWriter, 用于發(fā)送數(shù)據(jù)
        printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println("received data: " + line + "\ttime=" + new Date().getTime());
        printWriter.flush();
      }
    } finally {
      // 關閉所有資源
      bufferedReader.close();
      printWriter.close();
      socket.close();
      serverSocket.close();
    }
  }
}

細節(jié)

監(jiān)聽請求:

當一個新的Socket請求來到時,將為這個連接創(chuàng)建一個新的套接字數(shù)據(jù)結構,該套接字數(shù)據(jù)的信息包含的地址和端口正式請求源地址和端口。這個新創(chuàng)建的數(shù)據(jù)結構將會關聯(lián)到ServerSocket實例的一個未完成的連接數(shù)據(jù)結構列表中。注意,這時服務端的與之對應的Socket實例并沒有完成創(chuàng)建,而要等到與客戶端的3次握手完成后,這個服務端的Socket實例才會返回,并將這個Socket實例對應的數(shù)據(jù)結構從未完成列表中移動已完成列表中。

數(shù)據(jù)傳輸:

當連接已經(jīng)建立成功時,服務端和客戶端都會擁有一個Socket實例,每個Socket實例都有一個InputStream和OutputStream,并通過這兩個對象來交換數(shù)據(jù)。

要知道網(wǎng)絡I/O都是以字節(jié)流傳輸?shù)?,當?chuàng)建Socket對象時,操作系統(tǒng)將會為InputStream和OutputStream分別分配一定大小的緩存區(qū),數(shù)據(jù)的寫入和讀取都是通過這個緩存區(qū)完成的。

寫入端將數(shù)據(jù)寫到OutputStream對應的SendQ隊列中,當隊列填滿時,數(shù)據(jù)將被轉移到另一端InputStream的RecvQ隊列中,如果這時RecvQ已經(jīng)滿了,那么OutputStream的write方法將會阻塞,直到RecvQ隊列有足夠的空間容納SendQ發(fā)送的數(shù)據(jù)。過程如下圖所示:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    在寫SpringMVC項目時,由于要對表單數(shù)據(jù)進行校驗,需要使用@Valid進行校驗,但是在進行數(shù)據(jù)校驗時,BindingResult對象無法攔截非法表單數(shù)據(jù),result.hasErrors()無論怎么輸入都會返回false,本文詳細的介紹一下解決方法
    2021-09-09
  • 20秒教你學會java?List函數(shù)排序操作示例

    20秒教你學會java?List函數(shù)排序操作示例

    這篇文章主要為大家介紹了20秒教你學會List函數(shù)排序操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • SpringMVC體系分層模式原理圖解

    SpringMVC體系分層模式原理圖解

    這篇文章主要介紹了SpringMVC體系分層模式原理圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 如何通過zuul添加或修改請求參數(shù)

    如何通過zuul添加或修改請求參數(shù)

    這篇文章主要介紹了如何通過zuul添加或修改請求參數(shù)的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Web容器啟動過程中如何執(zhí)行Java類

    Web容器啟動過程中如何執(zhí)行Java類

    這篇文章主要介紹了Web容器啟動過程中如何執(zhí)行Java類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java微信公眾平臺之群發(fā)接口(高級群發(fā))

    Java微信公眾平臺之群發(fā)接口(高級群發(fā))

    這篇文章主要為大家詳細介紹了Java微信公眾平臺之群發(fā)接口,高級群發(fā)功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • SpringBoot項目不占用端口啟動的方法

    SpringBoot項目不占用端口啟動的方法

    這篇文章主要介紹了SpringBoot項目不占用端口啟動的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • Mybatis Select Count(*)的返回值類型介紹

    Mybatis Select Count(*)的返回值類型介紹

    這篇文章主要介紹了Mybatis Select Count(*)的返回值類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringMVC 數(shù)據(jù)校驗方法(必看篇)

    SpringMVC 數(shù)據(jù)校驗方法(必看篇)

    下面小編就為大家?guī)硪黄猄pringMVC 數(shù)據(jù)校驗方法(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • spring cloud gateway 如何修改請求路徑Path

    spring cloud gateway 如何修改請求路徑Path

    這篇文章主要介紹了spring cloud gateway 修改請求路徑Path的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

冕宁县| 醴陵市| 长白| 洛南县| 竹溪县| 科技| 南昌市| 宁海县| 张家港市| 都匀市| 文水县| 恭城| 门头沟区| 特克斯县| 长宁区| 普洱| 扎赉特旗| 哈巴河县| 平塘县| 方正县| 铜山县| 和硕县| 合作市| 迁安市| 洪湖市| 黔东| 济阳县| 外汇| 边坝县| 高台县| 雅江县| 宣恩县| 义乌市| 长寿区| 鹰潭市| 时尚| 青浦区| 内江市| 全州县| 将乐县| 凤山县|