工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.51099.com 注册 | 登陆
浏览模式: 标准 | 列表分类:golang

websocket proxy

 package main

 
import (
    "flag"
    "log"
    "net/url"
    "os"
    "os/signal"
    "time"
 
    "github.com/gorilla/websocket"
    "net/http"
)
 
var addrWebsocket = flag.String("addrWebsocket", "echo.websocket.org", "http service address")
 
func main() {
    flag.Parse()
    log.SetFlags(0)
 
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)
 
    //Initialize the WebSocket URL and the Path to follow
    uWS := url.URL{Scheme: "wss", Host: *addrWebsocket}
 
    //Initialize the Proxy URL and the Path to follow
    uProxy, _ := url.Parse("https://hide.me/en/proxy")
 
    //Set the Dialer (especially the proxy)
    dialer := websocket.Dialer{
        Proxy: http.ProxyURL(uProxy),
    }
    //dialer := websocket.DefaultDialer ==> with this default dialer, it works !
 
    c, _, err := dialer.Dial(uWS.String(), nil) // ==> With the proxy config, it fails here !
    defer c.Close()
 
    done := make(chan struct{})
 
    go func() {
        defer c.Close()
        defer close(done)
        for {
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            log.Printf("recv: %s", message)
        }
    }()
 
    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()
 
    for {
        select {
        case t := <-ticker.C:
            err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
            if err != nil {
                log.Println("write:", err)
                return
            }
        case <-interrupt:
            log.Println("interrupt")
            err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
                select {
                case <-done:
                case <-time.After(time.Second):
                }
            c.Close()
            return
        }
    }
}

默认的 rand.Intn () 生成的是伪随机数

 rand.Intn () 函数是个伪随机函数,不管运行多少次都只会返回同样的随机数,因为它默认的资源就是单一值,所以必须调用 rand.Seed (), 并且传入一个变化的值作为参数,如 time.Now().UnixNano() , 就是可以生成时刻变化的值.


package main

import ("fmt"
        "math/rand"
        "time")

func main() {
    // 初始化随机数的资源库, 如果不执行这行, 不管运行多少次都返回同样的值
    rand.Seed(time.Now().UnixNano())
    fmt.Println("A number from 1-100", rand.Intn(81))
}

--------------
//rand.Float64 返回一个64位浮点数 f,0.0 <= f <= 1.0。
    fmt.Println(rand.Float64())
//这个技巧可以用来生成其他范围的随机浮点数,例如5.0 <= f <= 10.0
    fmt.Print((rand.Float64()*5)+5, ",")
    fmt.Print((rand.Float64() * 5) + 5)
    fmt.Println()
//要让伪随机数生成器有确定性,可以给它一个明确的种子。
    s1 := rand.NewSource(42)
    r1 := rand.New(s1)
//调用上面返回的 rand.Source 的函数和调用 rand 包中函数是相同的。
    fmt.Print(r1.Intn(100), ",")
    fmt.Print(r1.Intn(100))
    fmt.Println()
如果使用相同的种子生成的随机数生成器,将会产生相同的随机数序列。
    s2 := rand.NewSource(42)
    r2 := rand.New(s2)
    fmt.Print(r2.Intn(100), ",")
    fmt.Print(r2.Intn(100))
    fmt.Println()

golang实现md5、RSA、base64 加密解密

 package tools

 
import (
"crypto/md5"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/hex"
"encoding/pem"
"errors"
)
 
const (
base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
)
 
var coder = base64.NewEncoding(base64Table)
 
func Base64Encode(src []byte) []byte {
return []byte(coder.EncodeToString(src))
}
 
func Base64Decode(src []byte) ([]byte, error) {
return coder.DecodeString(string(src))
}
 
func RsaEncrypt(origData []byte, publicKey string) ([]byte, error) {
block, _ := pem.Decode([]byte(publicKey))
if block == nil {
return nil, errors.New("public key error")
}
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}
pub := pubInterface.(*rsa.PublicKey)
return rsa.EncryptPKCS1v15(rand.Reader, pub, origData)
}
 
func RsaDecrypt(ciphertext []byte, privateKey string) ([]byte, error) {
block, _ := pem.Decode([]byte(privateKey))
if block == nil {
return nil, errors.New("private key error!")
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
return rsa.DecryptPKCS1v15(rand.Reader, priv, ciphertext)
}
 
func Md5Encrypt(data string) string {
md5Ctx := md5.New()                            //md5 init
md5Ctx.Write([]byte(data))                     //md5 updata
cipherStr := md5Ctx.Sum(nil)                   //md5 final
encryptedData := hex.EncodeToString(cipherStr) //hex_digest
return encryptedData
}
 
--------
https://blog.csdn.net/yue7603835/article/details/73433617

Golang同步:条件变量和锁组合使用

 https://studygolang.com/articles/5776

golang 1.8 并发安全Map简单实现

XML/HTML代码
  1. type SafeMap struct {  
  2.     sync.RWMutex  
  3.     Map map[int64]string  
  4. }  
  5.   
  6. func NewSafeMap(size int) *SafeMap {  
  7.     sm :new(SafeMap)  
  8.     sm.Map = make(map[int64]string, size)  
  9.     return sm  
  10. }  
  11.   
  12. func (sm *SafeMap) ReadMap(key int64) string {  
  13.     sm.RLock()  
  14.     value :sm.Map[key]  
  15.     sm.RUnlock()  
  16.     return value  
  17. }  
  18.   
  19. func (sm *SafeMap) WriteMap(key int64, value string) {  
  20.     sm.Lock()  
  21.     sm.Map[key] = value  
  22.     sm.Unlock()  
  23. }  
  24.   
  25. // 用于for k,_ :range m.Keys(){v :m.ReadMap(k) ....}  
  26. func (sm *SafeMap) Keys() []int64 {  
  27.     sm.RLock()  
  28.     value :make([]int64, 0)  
  29.     for k, _ :range sm.Map {  
  30.         value = append(value, k)  
  31.     }  
  32.     sm.RUnlock()  
  33.     return value  
  34. }  

https://blog.csdn.net/qq_17612199/article/details/79601222

golang:An operation on a socket could not be performed because the system lacked sufficient buffer s

 1、问题 

conn, err := net.Dial(“tcp”, ‘127.0.0.1:50001’)

执行此语句报错详细报错信息 
dial tcp 127.0.0.1:50001: An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full.

此报错的原因一般是系统端口已用尽,无法再建立新的Socket连接

https://blog.csdn.net/xia_xing/article/details/53352658

服务器 TIME_WAIT和CLOSE_WAIT

https://blog.csdn.net/xia_xing/article/details/53352486

常见SOCKET错误参数

https://blog.csdn.net/macky0668/article/details/4257721

 

 

golang web xss攻击预防

 从上面访问的结果发现。我们这边的< 之类的符号已经被转义成html 特殊符

上面的方法也是可以进行简化的

 

package main  import ( 	"fmt" 	"html/template" 	"log" 	"net/http" )  func main() { 	//绑定路由 讲访问 / 绑定给  Handler 方法进行处理 	http.HandleFunc("/", Handler) 	http.ListenAndServe(":8080", nil) }  func Handler(w http.ResponseWriter, req *http.Request) { 	err := req.ParseForm() 	//如果解析失败 直接退出 输出对应的错误原因 	if err != nil { 		log.Fatal(nil) 	} 	//获取 传递的name 参数 	user_pro := req.FormValue("name") 	fmt.Fprintf(w, "%s", xss_hander(user_pro))  } func xss_hander(s string) string { 	return template.HTMLEscapeString(s) }https://blog.csdn.net/liangguangchuan/article/details/54617685

beego orm 调用多次sql的事物同步

 https://blog.csdn.net/easternunbeaten/article/details/72456240

 
https://beego.me/docs/mvc/model/transaction.md
Records:47123456