1. 程式人生 > >golang簡單實現一個基於TLS/SSL的 TCP伺服器和客戶端

golang簡單實現一個基於TLS/SSL的 TCP伺服器和客戶端

本篇文章介紹一下使用TLS/SSL建立安全的TCP通訊,首先我們要準備一個數字證書和一個金鑰關於如何產生金鑰,請看下面文章:

Author: 嶽東衛
Email: [email protected]

通過Openssl建立數字證書和金鑰

TLS伺服器端程式碼

package main

import (
    "crypto/rand"
    "crypto/tls"
    "fmt"
    "log"
    "net"
    "time"
)

func HandleClientConnect(conn net.Conn) {
    defer
conn.Close() fmt.Println("Receive Connect Request From ", conn.RemoteAddr().String()) buffer := make([]byte, 1024) for { len, err := conn.Read(buffer) if err != nil { log.Println(err.Error()) break } fmt.Printf("Receive Data: %s\n", string
(buffer[:len])) //傳送給客戶端 _, err = conn.Write([]byte("伺服器收到資料:" + string(buffer[:len]))) if err != nil { break } } fmt.Println("Client " + conn.RemoteAddr().String() + " Connection Closed.....") } func main() { crt, err := tls.LoadX509KeyPair("server.crt"
, "server.key") if err != nil { log.Fatalln(err.Error()) } tlsConfig := &tls.Config{} tlsConfig.Certificates = []tls.Certificate{crt} // Time returns the current time as the number of seconds since the epoch. // If Time is nil, TLS uses time.Now. tlsConfig.Time = time.Now // Rand provides the source of entropy for nonces and RSA blinding. // If Rand is nil, TLS uses the cryptographic random reader in package // crypto/rand. // The Reader must be safe for use by multiple goroutines. tlsConfig.Rand = rand.Reader l, err := tls.Listen("tcp", ":8888", tlsConfig) if err != nil { log.Fatalln(err.Error()) } for { conn, err := l.Accept() if err != nil { fmt.Println(err.Error()) continue } else { go HandleClientConnect(conn) } } }

TLS客戶端程式碼

package main

import (
    "crypto/tls"
    "fmt"
    "io"
    "time"

    "log"
)

func main() {
    //注意這裡要使用證書中包含的主機名稱
    conn, err := tls.Dial("tcp", "abc.com:8888", nil)
    if err != nil {
        log.Fatalln(err.Error())
    }
    defer conn.Close()
    log.Println("Client Connect To ", conn.RemoteAddr())
    status := conn.ConnectionState()
    fmt.Printf("%#v\n", status)
    buf := make([]byte, 1024)
    ticker := time.NewTicker(1 * time.Millisecond * 500)
    for {
        select {
        case <-ticker.C:
            {
                _, err = io.WriteString(conn, "hello")
                if err != nil {
                    log.Fatalln(err.Error())
                }
                len, err := conn.Read(buf)
                if err != nil {
                    fmt.Println(err.Error())
                } else {
                    fmt.Println("Receive From Server:", string(buf[:len]))
                }
            }
        }
    }

}

相關推薦

golang簡單實現一個基於TLS/SSLTCP伺服器客戶

本篇文章介紹一下使用TLS/SSL建立安全的TCP通訊,首先我們要準備一個數字證書和一個金鑰關於如何產生金鑰,請看下面文章: Author: 嶽東衛 Email: [email pro

netty原始碼解解析(4.0)-20 ChannelHandler: 自己實現一個自定義協議的伺服器客戶

  本章不會直接分析Netty原始碼,而是通過使用Netty的能力實現一個自定義協議的伺服器和客戶端。通過這樣的實踐,可以更深刻地理解Netty的相關程式碼,同時可以瞭解,在設計實現自定義協議的過程中需要解決的一些關鍵問題。   本週章涉及到的程式碼可以從github上下載: https://git

python實現tcp伺服器客戶(socket)

python實現tcp伺服器和客戶端(socket) 1.socket模組 socket是什麼 socket最初是為了同一主機上的應用程式建立的,使得一個程式與另外一個程式之間可以通訊,也就是所謂的程序間通訊,有兩種型別的socket:基於檔案和麵向網路的。

TCP伺服器客戶的建立(socket/socketserver)

1 本文記錄針對python網路程式設計學習過程中的socket部分進行記錄與總結,內容僅僅涉及最粗淺的部分,日後或許會進行更新與擴充套件。 2 本文涉及的socket資料傳輸均使用bytes型別,因此在python3環境下,需要特別注意字串的編碼與

在Android上實現SSL握手,實現伺服器客戶之間Socket互動

public class MySSLSocket extends Activity {      private static final int SERVER_PORT = 50030;//埠號      private static final String SERVER_IP = "218.206.17

簡單TCP 流式socket 伺服器客戶程式碼示例

電子書在這裡,見6.8.1 和6.8.2 章節,書中的程式碼有很多錯誤,包括#include、socket 描述符賦值等,正確的程式碼在這裡 Server 程式碼: #include <stdio.h> #include <stdlib.h> #in

Java實現伺服器客戶簡單通訊

Java中網路程式設計這一塊有封裝的類庫,使用簡單,瞭解原理可以教容易實現伺服器和客戶端的簡單通訊。 在程式設計之前,首先要需要對TCP/IP協議有一定的瞭解,需要知道Socket套接字的作用以及用法,這個可以在API文件中去檢視。兩通訊實體之間通訊需要掌握資

[計網] 用python語言開發一個簡單的web伺服器客戶

伺服器:      當客戶聯絡時建立一個連線套接字 從這個連線接收HTTP請求(*)      解釋該請求所請求的特定檔案      從伺服器的檔案系統獲取該檔案      併發送檔案內容     

Python實現udp協議的簡單伺服器客戶通訊

簡單socket程式在兩臺電腦之間傳輸訊息,分為客戶端和服務端,分別在兩臺電腦上執行後即可進行簡單的訊息傳輸,也可以在一臺電腦上測試,設定兩個不同的埠即可 以下是程式碼在一臺電腦上執行,開兩個終端即可

簡單TCP協議 socket程式設計(C語言版伺服器客戶

         最近由於本人對網路程式設計的喜愛,所以對一點關於TCP協議socket程式設計的總結。由於本人的能力有限,寫的可能過於簡單,只適合初學者,歡迎大牛提出寶貴的意見,本人會感激不盡的。廢話少說了,進入正題。(下面程式碼是基於VC6.0)          下圖

Go語言實現簡單伺服器客戶

Go語言實現伺服器和客戶端比較簡單 伺服器: listen accept recv 客戶端 dial write 1.server.go package main import

用Java實現簡單的檔案上傳伺服器客戶

/** * 使用TCP協議實現上傳功能的伺服器端 * 思路: * 新建ServerSocket * 等待客戶端連線 * 連線上後開啟子執行緒,把連接獲取的Socket傳給子執行緒 * 迴圈進行 * @author yajun * */ public class UploadServer {

一個Netty程式——構建執行Echo伺服器客戶

在構建之前,需要安裝開發環境:JDK和Apache Maven以及IDE。 pom檔案: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-ins

TCP伺服器連線客戶數過多的問題

TCP狀態遷移,CLOSE_WAIT & FIN_WAIT2 的問題 TCP狀態遷移 :        大家對netstat -a命令很熟悉,但是,你有沒有注意到STATE一欄呢,基本上顯示著established,time_wait,clos

【網路程式設計】tcp伺服器客戶

TCP與UDP的區別: TCP傳輸控制協議(穩定)(慢一些) UDP使用者資料包協議(不穩定)(快一些) TCP有三次握手,a給b請求資料,b傳送請求確認併發送一個數據包,a收到資料包再發送確認訊息給b

ROS學習筆記18 (編寫簡單伺服器客戶 (C++))

1 編寫Service節點 這裡,我們將建立一個簡單的service節點("add_two_ints_server"),該節點將接收到兩個整型數字,並返回它們的和。 進入先前你在catkin workspace教程中所建立的beginner_tutorials包所在的目錄

ROS學習筆記19 (編寫簡單伺服器客戶 (Python))

1 編寫服務端節點 我們會建立服務端節點 ("add_two_ints_server") ,節點接收兩個整型數字,並返回和 進入beginner_tutorials包 $ roscd beginner_tutorials 確保你確保已經在之前建立好AddTwoInts

(4)編寫簡單伺服器客戶

目錄 編寫Service節點 程式碼 程式碼解釋 編寫Client節點 程式碼 程式碼解釋 編譯節點 編譯節點

Socket通訊實現伺服器客戶對話

廣域網和區域網 介紹socket通訊前我們先介紹一下廣域網與區域網的概念。區域網簡稱LAN,是指在某一區域幾臺計算機組成的計算機組,區域網是封閉的,區域網經常採用共享通道,即共用同一條電纜。廣域網簡稱WAN,是一種跨越大的,地域性的地區性網路集合廣域網包含大大小

C#實現伺服器客戶之間通訊

TCP  套接字程式設計 伺服器端實現步驟: 1、使用Socket類建立套接字。 2、利用Bind方法將建立的套接字繫結到指定的地址結構。 3、利用Listen方法設定套接字為監聽模式,使得伺服器進入被動開啟狀態。 4、接受客戶端的連線請求。 5、接收、應答客戶端的資料請求