真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

深入理解JavaSocket通信

簡述

創(chuàng)新互聯(lián)是專業(yè)的伊州網(wǎng)站建設(shè)公司,伊州接單;提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行伊州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

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

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

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

ServerSocket的使用可以分為三步:

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

2.調(diào)用創(chuàng)建出來的ServerSocket的accept方法進(jìn)行監(jiān)聽。accept方法時(shí)阻塞方法,也就是說調(diào)用accept方法后程序會(huì)停下來等待連接請求,在接收到請求之前程序?qū)⒉粫?huì)往下走。當(dāng)接收到請求后accept方法會(huì)返回一個(gè)Socket。

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

栗子

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();
      // 獲得服務(wù)端返回的數(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());
      // 關(guān)閉資源
      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)建一個(gè)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進(jìn)行通信, 創(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 {
      // 關(guān)閉所有資源
      bufferedReader.close();
      printWriter.close();
      socket.close();
      serverSocket.close();
    }
  }
}

細(xì)節(jié)

監(jiān)聽請求:

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

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

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

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

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

深入理解Java Socket通信

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


文章題目:深入理解JavaSocket通信
轉(zhuǎn)載來于:http://weahome.cn/article/ppdcdg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部