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/SSL的 TCP伺服器和客戶端
本篇文章介紹一下使用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、接收、應答客戶端的資料請求