網路通信

来源:http://www.cnblogs.com/tonghun/archive/2017/06/23/7068887.html
-Advertisement-
Play Games

一 概述 1.網路模型 OSI(Open System Interconnection,開放式系統互聯)模型,是對網路系統結構的概括,將網路分為七層:應用層、表示層、會話層、傳輸層、網路層、數據鏈路層、物理層。 2.IP協議 網路層協議,規定了在互聯網上確定與尋找電腦的規則。 3.TCP協議 傳輸 ...


 

一 概述

1.網路模型

OSI(Open System Interconnection,開放式系統互聯)模型,是對網路系統結構的概括,將網路分為七層:應用層、表示層、會話層、傳輸層、網路層、數據鏈路層、物理層。

2.IP協議

網路層協議,規定了在互聯網上確定與尋找電腦的規則。

3.TCP協議

傳輸層的一種數據傳輸協議,數據傳輸前通過“三次握手”建立連接,然後再發送數據,適用於對數據準確性要求較高的情況,由於數據傳輸前需要建立連接,傳輸速度較慢。

4.UDP協議

傳輸層的一種數據傳輸協議,數據傳輸前不需要建立連接,適用於對數據準確性要求不高的情況,傳輸數據較快,一般聊天信息都通過該協議傳輸。

5.HTTP協議

HTTP協議屬於應用層協議,為操作系統或網路應用程式提供訪問網路服務的介面。

6.埠port

當數據到達電腦後,為了找到目標應用程式,為每一個應用程式分配了一個整數值,取值0-65535,這個整數值就是埠,從中可以看出,埠代表了電腦上一個應用程式,保證數據準確到達預定的程式。一個埠不能同時被多個應用程式占用,一個應用程式結束以後,埠不會立即釋放,有一個記憶體延遲占有的時間,這個時間一般很短。埠、0-1023已經被系統應用程式及其他應用程式占用,程式設計時避免使用這個範圍的埠。

7.套接字Socket

套接字是數據發送與接收的工具。發送者通過套接字發送數據,接受者通過套接字監聽指定的埠獲取數據。

8.無論採用TCP協議,還是UDP協議,數據都只能以位元組形式發送。

二 TCP程式設計

1.關閉通過Socket獲取的輸入流或者輸出流將關閉Socket。

2.通過Socket獲取的輸出流輸出完畢後必須關閉,不然另一端對應的輸入流將阻塞。由於通過輸出流對象關閉輸出流時,同時關閉Socket對象,將導致另一端無法獲取對應Socket的對象,因此只能通過Socket下的方法shutdownOutput關閉輸出流。

3.客戶端的一般步驟: 

Socket socket=new Socket(String host,int port);//創建客戶端Socket,發送與接收數據,需要指明伺服器IP與埠
OutputStream os=socket.getOutputStream();//獲取輸出流,向伺服器發送數據
..........
os.flush();
socket.shutdownOutput();//關閉輸出流,防止伺服器端阻塞

InputStream is=socket.getInputStream();//獲取輸入流,輸入流包含伺服器的反饋信息
............

socket.close();//關閉socket,同時關閉輸入與輸出流

4.伺服器的一般步驟:

ServerSocket server=new ServerSocket(int port);//建立伺服器端套接字,指定監聽埠
Socket socket=server.accept();//獲取訪問客戶端的Socket,阻塞線程
InputStream is=socket.getInputStream();//獲取輸入流,其中包含客戶端發送的數據
.............

OutputStream os=socket.getOutputStream();//獲取輸出流,向客戶端反饋信息
..............
os.flush();
os.shutdownOutput();

server.close();

5.Demo

客戶端

package com.javase.networkCommunication.tcp.demo02;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class ImgClient {

    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("192.168.146.1", 10007);
        FileInputStream is = new FileInputStream("Files/1.jpg");
        OutputStream os = socket.getOutputStream();
        byte[] buf = new byte[1024];// 先將數據讀取到緩衝區,比頻繁的從硬碟讀取速度快
        int length = 0;
        while ((length = is.read(buf)) != -1) {
            os.write(buf, 0, length);
        }
        os.flush();
        socket.shutdownOutput();// 如果輸出流不關閉,服務端對應的輸入流會阻塞

        InputStream replyIs = socket.getInputStream();//不會阻塞線程
        byte[] buf01 = new byte[1024];
        int length01 = replyIs.read(buf01);
        String reply = new String(buf01, 0, length01);
        System.out.println(reply);
        
        is.close();
        socket.close();
    }

}

伺服器

package com.javase.networkCommunication.tcp.demo02;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import org.junit.Test;

public class ImgServer {

    @Test
    public void test01() throws IOException {
        ServerSocket serverSocket = new ServerSocket(10007);
        Socket socket = serverSocket.accept();// 線程阻塞,等待請求
        System.out.println("hostAddress=" + socket.getInetAddress().getHostAddress());
        InputStream is = socket.getInputStream();
        FileOutputStream os = new FileOutputStream("Files/2.jpg");
        System.out.println(1);
        byte[] buf = new byte[1024];
        int length = 0;
        System.out.println(2);
        int count = 3;
        while ((length = is.read(buf)) != -1) {
            os.write(buf, 0, length);
            System.out.println(count++);
        }
        os.flush();
        os.close();
        System.out.println("圖片上傳結束");

        /*PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.write("success");*/
        OutputStream out = socket.getOutputStream();
        out.write("success".getBytes());
        out.flush();
        socket.shutdownOutput();
        System.out.println("響應數據已發出");
        
        serverSocket.close();
    }

}

三 UDP程式設計

1.數據處理方式

UDP協議以數據包的形式發送數據,每個包的最大值64k。

2.發送數據的一般步驟:

DatagramSocket socket=new DatagramSocket();//創建數據報套接字用於發送數據
//DUP協議採用數據包分段發送數據,因此需要建立數據包,在數據包中指明目的地IP與埠
DatagramPacket packet= DatagramPacket(byte buf[], int offset, int length,InetAddress address, int port);
socket.send(packet);

3.接收數據的一般步驟:

DatagramSocket socket=new DatagramSocket(int port);//創建監聽指定埠的數據報套接字
DatagramPacket packet=new DatagramPacket(byte buf[], int length);
socket.receive(packet);



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <div style="float: left;border-radius:70%; height: 80px; overflow:hidden;"> <img class="mui-icon-image" src="../../img/002 劉運忠.jpg" style="height: 80p ...
  • <div id="segmented" class="mui-segmented-control"> <a class="mui-control-item mui-active" href="#item1mobile"> 考勤記錄 </a> <a class="mui-control-item" h ...
  • //論文要用到其改進演算法,在此先demo測試一下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ... ...
  • 閉包(closure)是函數式編程的重要的語法結構。閉包也是一種組織代碼的結構,它同樣提高了代碼的可重覆使用性。 如果在一個內嵌函數里,對在外部函數內(但不是在全局作用域)的變數進行引用,那麼內嵌函數就被認為是閉包(closure)。 定義在外部函數內但由內部函數引用或者使用的變數稱為自由變數。 總 ...
  • 用python3.4讀取Excel中的數據並繪圖,一個簡單的實現。 ...
  • 主線程:執行主方法的線程,就叫做主線程 單線程程式:程式從mani開始從上到下依次運行 程式從main方法開始運行,JVM運行main方法,會找操作系統 開闢一條通向cpu的執行路徑,cpu可以通過這條路徑來執行main方法 這條路徑有一個名字叫主(main)線程 創建線程方式一繼承Thread類 ...
  • 想要瞭解介面我們要先知道抽象類。那麼什麼是抽象類呢? 問題描述:生活中我們有很多的對象是無法具體描述的,比如說:我們可以說四邊形有四條邊。或者具體點說就是矩形兩邊對稱且相等,正方形四邊對稱且相等。但是對於普通的圖形而言就很難具體描述了。轉換成Java語言就是說:對於一個很具體的類我們可以很方便的定義 ...
  • 轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/72933882 本文出自 "【趙彥軍的博客】" 使用fiddler抓包時,會看到左側按照順序顯示session,並且前邊有個圖標,但通常,不知道圖標是什麼意思。 參考官方文檔: "UI ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...