1、第一个坑的就是,错误信息如下:

比较常见的错误“Connection reset by peer”,该错误和“Connection reset”是有区别的:

服务器返回了“RST”时,如果此时客户端正在从Socket套接字的输出流中数据则会提示Connection reset”;

服务器返回了“RST”时,如果此时客户端正在往Socket套接字的输入流中数据则会提示“Connection reset by peer”。

所以,很坑爹的一个就是,在连接TCP后,不能直接写数据,要让他睡睡。。。

下面是一个得到系统时间的server

也就是,我都还没第三次握手,我就send数据了。GG

https://my.oschina.net/xionghui/blog/508758

package main

import (
"fmt"
"net"
"os"
"time"
) func main() {
server := ":7777"
tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr) // pay atttion
checkError(err)
for {
conn, err := listener.Accept()
if err != nil {
continue
}
fmt.Println(conn.RemoteAddr())
go solve(conn)
}
} func solve(conn net.Conn) {
defer conn.Close()
dayTime := time.Now().String()
conn.Write([]byte(dayTime))
fmt.Println("teset")
} func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(-)
}
}

server

package main

import (
"fmt"
"io/ioutil"
"net"
"os"
"time"
) func main() {
tcpAddr, errOne := net.ResolveTCPAddr("tcp", "127.0.0.1:7777")
checkError(errOne)
conn, errTwo := net.DialTCP("tcp", nil, tcpAddr) defer conn.Close()
checkError(errTwo) time.Sleep(time.Second * ) // 睡睡 _, errThrid := conn.Write([]byte("hello"))
checkError(errThrid) result, errOne := ioutil.ReadAll(conn)
checkError(errOne)
fmt.Println(string(result)) } func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(-)
}
}

client

2、socket的读取数据很bug啊,如果读取数据不合适,就会一直卡在那儿,很头痛。

TCP版本的聊天程序,用一个bufio.NewReader(TCPconn)来读取

package main

import (
"bufio"
"fmt"
// "io/ioutil"
"net"
"os"
"strings"
"time"
) var ch chan string = make(chan string, ) func main() {
conn := newConnect()
conn.SetNoDelay(false)
fmt.Println("please enter your name")
input := bufio.NewReader(os.Stdin)
b, _, err := input.ReadLine()
checkError(err)
name := string(b)
conn.Write([]byte("add " + name))
// go func(conn net.Conn) {
// respond, err := ioutil.ReadAll(conn)
// checkError(err)
// if respond != "" {
// fmt.Println(string(respond))
// }
// }(conn) //go getMessage(conn)
go getMessage(conn)
go showMessage()
for {
time.Sleep(time.Microsecond * )
// helpUse()
//conn = newConnect()
request, err := input.ReadString('\n')
checkError(err) _, err1 := conn.Write([]byte(request))
checkError(err1)
}
defer conn.Close()
} func getMessage(conn *net.TCPConn) {
// var b []byte
// read_len, err := conn.Read(b)
// checkError(err)
// return string(b[:read_len]) // respond, err := ioutil.ReadAll(conn)
// checkError(err)
// return string(respond)
//
// fmt.Println("ff")
// var b []byte
// read_len, err := conn.Read(b)
// fmt.Println("gg")
// checkError(err)
// fmt.Println(string(b[:read_len])) // fmt.Print("\n")
r := bufio.NewReader(conn)
for {
str, err := r.ReadString('\n')
checkError(err)
res := strings.Split(str, "E")
// ch <- "\n"
for _, value := range res {
if value == "\n" {
// fmt.Print("\n")
ch <- "\n"
continue
}
// fmt.Println(value)
ch <- value
}
}
} func showMessage() {
for {
res := <-ch
if res == "\n" {
fmt.Println("")
} else {
fmt.Println(res)
}
}
} func helpUse() {
fmt.Println("------------------")
fmt.Println("1、add user")
fmt.Println("2、list all user online")
fmt.Println("3、send message to xxx with text")
fmt.Println("------------------")
} func newConnect() *net.TCPConn {
tcpAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8282")
checkError(err)
conn, err := net.DialTCP("tcp", nil, tcpAddr)
checkError(err)
return conn
} func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(-)
}
}

client

package main

import (
"fmt"
"net"
"os"
"strings"
"typeDefine"
) var Muser typeDefine.TotalUser func main() {
Muser.OnlineUser = make([]*typeDefine.User, , )
Muser.Mp = make(map[string]*net.TCPConn)
service := ":8282"
tcpAddr, err := net.ResolveTCPAddr("tcp", service)
checkError(err)
listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err) for {
conn, err := listener.AcceptTCP()
fmt.Println("new user come")
if err != nil {
continue
}
go solve(conn)
}
} func solve(conn *net.TCPConn) {
// conn.SetWriteBuffer(0)
defer conn.Close()
b := make([]byte, ) //看看是否需要放入去,这个也不清零啊
var name string
for { readLen, err := conn.Read(b)
if readLen == {
fmt.Println("bye~")
return
}
checkError(err)
request := strings.Split(string(b[:readLen]), " ")
fmt.Println(request)
// conn.Write([]byte("helloE"))
// continue
if request[] == "ADD" || request[] == "add" {
if name != "" {
continue
}
name = request[]
Muser.AddUser(request[], conn)
Muser.Mp[request[]] = conn
} else if request[] == "LIST" || request[] == "list" {
Muser.ShowAllUserOnline(conn)
} else {
var tot string = name + " say: "
for i := ; i < len(request); i++ {
tot += request[i]
tot += " "
}
Muser.SendMessage(name, request[], tot)
}
} } func checkError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(-)
}
} // -----------------

server

package typeDefine

import (
// "fmt"
"net"
) const MAXN = type TotalUser struct {
OnlineUser []*User
Mp map[string]*net.TCPConn
} type User struct {
Mes chan string
Name string
} func (user *TotalUser) AddUser(name string, conn net.Conn) {
if user.ExitUser(name, "") {
conn.Write([]byte("unsuccessfully, the user " + name + " is already exits\n"))
return
}
newUser := &User{nil, name}
newUser.Mes = make(chan string, MAXN)
user.OnlineUser = append(user.OnlineUser, newUser)
conn.Write([]byte("Login successfully\n")) return
} func (user *TotalUser) SendMessage(from string, to string, text string) {
for i := range user.OnlineUser {
onlineName := user.OnlineUser[i].Name
if onlineName == from {
continue
}
if onlineName == to {
conn, _ := user.Mp[to]
conn.Write([]byte(text + "\n"))
return
}
}
} func (user *TotalUser) ExitUser(findName string, expectName string) bool {
for i := range user.OnlineUser {
if user.OnlineUser[i].Name == expectName {
continue
}
if user.OnlineUser[i].Name == findName {
return true
}
}
return false
} func (user *TotalUser) ShowAllUserOnline(conn net.Conn) {
for i := range user.OnlineUser {
conn.Write([]byte(user.OnlineUser[i].Name + " onlineE"))
//fmt.Println(user.OnlineUser[i].Name + " online")
}
conn.Write([]byte("\n"))
}

typeDefine

3、按任意键退出

 fmt.Scanln()

4、超时机制,查看routines是否超时

可以用 <- time.After(time.Second)

https://gobyexample.com/timeouts

5、基于udp的聊天程序,

用udpListener.ReadFromUDP即可

bug1、还是读入问题,读入一行可以使用

input := bufio.NewScanner(os.Stdin)

input.Scan()

input.Text()

bgu2、map不了指针??所以把*net.UdpConn转换成string来map了

基本思路是:

1️⃣、

知道服务器监听的端口,LocalHost + ServerPort

然后客户端也是要监听端口的(看起来和服务器一样),因为服务器也要发送消息给它,服务器要记录客户端监听了什么端口

一个端口不能两个东西同时监听,所以客户端的监听端口要rand出来。同时要告诉服务器我监听的端口,然后服务器就可能链接去你这里了。

2️⃣、

心跳包可以使用Ticker实现,但是我这里没实现

reference  http://blog.csdn.net/ssnian_/article/details/22949965

3️⃣、可以用default来断开链接,清除记录了的数据,因为本来是客户端等待数据进入,一开始是空stirng,或者是quit,然后关闭客户端后,就是相当于控制台没输入,然后就是一开始的stirng值,(客户端也会进入一次判断的) 就相当于quit。

package main

import (
"errors"
"fmt"
"net"
"os"
"strings"
) type User struct {
Name string
userConn *net.UDPConn
ChatConn *net.UDPConn
} var ErrorCode = //监听的端口 && 地址
var ServerPort = ":1212"
var LocalHost = "127.0.0.1" //
var isOnline = make(map[string]*net.UDPConn)
var isUdpAddr = make(map[string]string)
var userSlice = make([]User, ) //心跳包检查,检测用户是否在线
func HeartCheck() { } // 得到连接
func getUdpConn(udpAddr string) (*net.UDPConn, error) {
// fmt.Println("+++", udpAddr)
// fmt.Println(isOnline["vimi"])
// fmt.Println(isUdpAddr[udpAddr])
if value, ok := isUdpAddr[udpAddr]; ok {
if udpConn, ok := isOnline[value]; ok {
return udpConn, nil
}
}
fmt.Println("not found this user")
return nil, errors.New("not found this user")
} func UdpHandle(udpListener *net.UDPConn) {
buff := make([]byte, )
readLen, udpAddr, err := udpListener.ReadFromUDP(buff) //得到udp地址,就是那个用户的
CheckError(err) // fmt.Printf("%+v %d\n", udpAddr, readLen) go func() {
if readLen > {
request := parseBuffer(buff, readLen) // 输出请求参数, debug
fmt.Println("---------")
for _, value := range request {
fmt.Println(value)
}
fmt.Println("**********") switch request[] {
case "add": //找到用户监听的端口
userUdpAddr, err := net.ResolveUDPAddr("udp", LocalHost+":"+request[])
CheckError(err) connClient, err := net.DialUDP("udp", nil, userUdpAddr) // 链接过去
CheckError(err) isOnline[request[]] = connClient
isUdpAddr[udpAddr.String()] = request[]
fmt.Println(udpAddr, " 上线了")
userSlice = append(userSlice, User{request[], connClient, nil}) case "show":
connClient, err := getUdpConn(udpAddr.String())
if err != nil {
break
}
for _, value := range userSlice { // 这个有bug,没删除元素,还没管理
sendMessage(value.Name+" online", connClient)
}
case "chat":
connClient, err := getUdpConn(udpAddr.String())
if err != nil {
break
}
_, ok := isOnline[request[]]
if !ok {
sendMessage("user "+request[]+" off line", connClient)
break
}
context := ""
for i := ; i < len(request); i++ {
context += request[i]
context += " "
}
sendMessage(context, isOnline[request[]])
default:
fmt.Println("bye~")
name := isUdpAddr[udpAddr.String()]
for i := ; i < len(userSlice); i++ {
if userSlice[i].Name == name {
if len(userSlice) == {
userSlice = make([]User, )
} else if i == {
userSlice = userSlice[:]
} else if i == len(userSlice)- {
userSlice = userSlice[:len(userSlice)-]
} else {
userSlice = userSlice[:i]
userSlice = append(userSlice, userSlice[i+:]...)
}
break
}
} delete(isOnline, isUdpAddr[udpAddr.String()])
delete(isUdpAddr, udpAddr.String())
}
} else {
fmt.Println("bye bye")
delete(isOnline, isUdpAddr[udpAddr.String()])
delete(isUdpAddr, udpAddr.String())
}
}()
} func sendMessage(context string, conn *net.UDPConn) {
conn.Write([]byte(context))
} // 把请求翻译出来
func parseBuffer(buff []byte, readLen int) []string {
buffString := string(buff[:readLen])
request := strings.Split(buffString, " ")
return request
} func main() {
udpAddr, err := net.ResolveUDPAddr("udp", LocalHost+ServerPort)
CheckError(err)
udpListener, err := net.ListenUDP("udp", udpAddr)
CheckError(err)
defer udpListener.Close()
go HeartCheck()
fmt.Println("开始监听") for {
UdpHandle(udpListener)
}
} func CheckError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(ErrorCode)
}
}

server

package main

import (
"bufio"
"fmt"
"math/rand"
"net"
"os"
"strconv"
"time"
) var ErrorCode = //监听的端口 && 地址
var ServerPort = ":1212"
var LocalHost = "127.0.0.1" //判断是否已经使用该端口
var isUsePort = make(map[int]bool) var op = map[string]string{
"登录": "add ",
"显示在线人数": "show ",
"聊天": "chat ",
} func CheckError(err error) {
if err != nil {
fmt.Println(err)
os.Exit(ErrorCode)
}
} func getMessage(udpListener *net.UDPConn) {
for {
var buff = make([]byte, )
readLen, _, err := udpListener.ReadFromUDP(buff)
CheckError(err)
if readLen > {
fmt.Println(string(buff[:readLen]))
}
}
} func getUdpListener() (*net.UDPConn, int) {
newSeed := rand.NewSource(int64(time.Now().Second()))
newRand := rand.New(newSeed) for {
randPort := newRand.Intn() +
if _, ok := isUsePort[randPort]; ok {
continue
}
//fmt.Println(randPort)
isUsePort[randPort] = true udpAddr, err := net.ResolveUDPAddr("udp", LocalHost+":"+strconv.Itoa(randPort))
CheckError(err) udpListener, err := net.ListenUDP("udp", udpAddr)
CheckError(err) return udpListener, randPort
}
} func main() {
var intServerPort int
for i := ; i < len(ServerPort); i++ {
intServerPort = intServerPort* + int(ServerPort[i]-'')
} isUsePort[intServerPort] = true udpAddr, err := net.ResolveUDPAddr("udp", LocalHost+ServerPort)
CheckError(err) udpConn, err := net.DialUDP("udp", nil, udpAddr)
CheckError(err) udpListener, port := getUdpListener() defer udpConn.Close()
defer udpListener.Close() name := ""
fmt.Println("please enter your name")
fmt.Scanf("%s", &name)
udpConn.Write([]byte(op["登录"] + name + " " + strconv.Itoa(port))) go getMessage(udpListener) input := bufio.NewScanner(os.Stdin) for {
opp := ""
fmt.Scanf("%s", &opp)
if opp == "show" {
udpConn.Write([]byte(op["显示在线人数"]))
} else if opp == "chat" {
input.Scan()
udpConn.Write([]byte(op["聊天"] + input.Text() + " text by " + name))
} else {
udpConn.Write([]byte("quit"))
break
}
}
}

client

----------------------------------

go web like java forward 跳转

http.Redirect(w, r, "/show", http.StatusFound)

go use telegram(token改变了的)

package main

import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net"
"net/http"
"net/url"
"strconv"
"time" ss "github.com/shadowsocks/shadowsocks-go/shadowsocks"
) var config struct {
server string
port int
password string
method string
} func handleError(err error) {
if err != nil {
log.Fatal(err)
}
}
func HTTPClientBySocks5(uri string) *http.Client {
parsedURL, err := url.Parse(uri)
handleError(err)
host, _, err := net.SplitHostPort(parsedURL.Host)
if err != nil {
if parsedURL.Scheme == "https" {
host = net.JoinHostPort(parsedURL.Host, "")
} else {
host = net.JoinHostPort(parsedURL.Host, "")
}
} else {
host = parsedURL.Host
}
rawAddr, err := ss.RawAddr(host)
handleError(err)
serverAddr := net.JoinHostPort(config.server, strconv.Itoa(config.port))
cipher, err := ss.NewCipher(config.method, config.password)
handleError(err)
dailFunc := func(network, addr string) (net.Conn, error) {
return ss.DialWithRawAddr(rawAddr, serverAddr, cipher.Copy())
}
//dailContext := func(ctx context.Context, network, addr string) (net.Conn, error) {}
tr := &http.Transport{
MaxIdleConns: ,
IdleConnTimeout: * time.Second,
TLSHandshakeTimeout: * time.Second,
ExpectContinueTimeout: * time.Second,
}
tr.Dial = dailFunc
return &http.Client{Transport: tr}
}
func Get(uri string) (resp *http.Response, err error) {
client := HTTPClientBySocks5(uri)
return client.Get(uri)
}
func Post(uri string, contentType string, body io.Reader) (resp *http.Response, err error) {
client := HTTPClientBySocks5(uri)
return client.Post(uri, contentType, body)
}
func PostForm(uri string, data url.Values) (resp *http.Response, err error) {
client := HTTPClientBySocks5(uri)
return client.PostForm(uri, data)
}
func Head(uri string) (resp *http.Response, err error) {
client := HTTPClientBySocks5(uri)
return client.Head(uri)
} type two struct {
Text string `json:"text"`
Url string `json:"url"`
} type one struct {
InlineKeyBodard [][]*two `json:"inline_keyboard"`
} type Message struct {
ChatID string `json:"chat_id"`
Text string `json:"text"`
ReplyMarkup *one `json:"reply_markup"`
ParseMode string `json:"parse_mode"`
} func testMe() {
item := &two{"go", "www.google.com"}
temp := &one{[][]*two{}} t := []*two{}
t = append(t, item)
t = append(t, item)
temp.InlineKeyBodard = append(temp.InlineKeyBodard, t) msg := &Message{
ChatID: "-264517585",
Text: "[test](www.baidu.com)",
ReplyMarkup: temp,
ParseMode: "markdown",
}
b, _ := json.Marshal(msg)
re := bytes.NewBuffer(b)
// fmt.Println(msg) fmt.Println(string(b)) Post("https://api.telegram.org/bot516690928:AAH4l2EyC8YAFalLut6oWv-1BrqgoAkfo/sendMessage", "application/json", re)
} func main() {
// for testing
config.method = "aes-256-cfb" // default method
config.password = "stupidone"
config.port = // your port
config.server = "95.163.202.160"
testMe() // var uri string = "https://api.telegram.org/bot516690928:AAH4EyC8YAFalLut6ZMoWv-1BrqgoAkfo/getMe"
// resp, err := Get(uri)
// handleError(err)
// defer resp.Body.Close()
// body, err := ioutil.ReadAll(resp.Body)
// handleError(err)
// fmt.Println(string(body))
}

这里想记录的是json出一个button是怎样做的,对应下面的

http://donggu.me/2018/03/15/Telegram%E5%BC%80%E5%8F%91%E5%B0%8F%E8%AE%B0/

golang http.get走本地代理

golang走代理

package main

import (
"fmt"
"io/ioutil"
"net/http"
"os"
"time" "golang.org/x/net/proxy"
) func main() { go func() {
select {
case <-time.After(time.Second * ):
break
}
os.Exit()
}() dialSocksProxy, err := proxy.SOCKS5("tcp", "127.0.0.1:1080", nil, proxy.Direct) if err != nil {
fmt.Println("Error connecting to proxy:", err)
return
}
tr := &http.Transport{Dial: dialSocksProxy.Dial}
// Create client
myClient := &http.Client{
Transport: tr,
}
response, err := myClient.Get("https://api.telegram.org/bot516690928:AAH4EyC8YAFalLut6ZMoWv-1BrqgoAkfo/getMe")
if err != nil {
fmt.Println(err)
return
}
defer response.Body.Close()
var by []byte
by, _ = ioutil.ReadAll(response.Body)
fmt.Println(string(by))
}

--------------------------------------------------------------------------------------------------------------------------------------------

golang写后台,java写client

package main

import (
"fmt"
"net" "github.com/sirupsen/logrus"
) const (
addr = ":7070"
netWork = "tcp"
) func checkErr(err error) {
if err != nil {
logrus.Error(err)
}
} func main() {
tcpAddr, err := net.ResolveTCPAddr(netWork, addr)
checkErr(err)
s, err := net.ListenTCP(netWork, tcpAddr)
checkErr(err) for {
fmt.Println("new")
conn, err := s.AcceptTCP()
if err != nil {
logrus.Error(err)
continue
}
go solve(conn)
}
} func solve(conn *net.TCPConn) {
defer conn.Close()
b := make([]byte, )
for {
readLen, err := conn.Read(b)
if readLen == {
fmt.Println("bye~")
return
}
if err != nil {
logrus.Error(err)
continue
}
fmt.Println(string(b))
_, err = conn.Write([]byte("Send OK\n"))
// time.Sleep(time.Second)
checkErr(err)
}
}

go-server

package main

import (
"bufio"
"fmt"
"net" "github.com/sirupsen/logrus"
) const (
addr = "47.106.195.179:7070"
netWork = "tcp"
) func checkErr(err error) {
if err != nil {
logrus.Error(err)
}
} func main() {
tcpAddr, err := net.ResolveTCPAddr(netWork, addr)
checkErr(err) conn, err := net.DialTCP(netWork, nil, tcpAddr)
checkErr(err) _, err = conn.Write([]byte("This is my homework of network ,I am happy!"))
checkErr(err) r := bufio.NewReader(conn)
b, _, err := r.ReadLine()
checkErr(err)
fmt.Println(string(b))
}

go-client

package room.vimi.crawler;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException; public class App {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("47.106.195.179", ); InputStreamReader reader = new InputStreamReader(socket.getInputStream());
BufferedReader buffer_reader = new BufferedReader(reader); PrintWriter writer = new PrintWriter(socket.getOutputStream()); String one = "hello";
writer.println(one);
writer.flush(); String res = buffer_reader.readLine();
System.out.println(res);
}
}

java-client

GO WEB的更多相关文章

  1. C# Web应用调试开启外部访问

    在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用.这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用. 目录 1. 设置内网访问 2. 设 ...

  2. 网页提交中文到WEB容器的经历了些什么过程....

    先准备一个网页 <html><meta http-equiv="Content-Type" content="text/html; charset=gb ...

  3. 闲来无聊,研究一下Web服务器 的源程序

    web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...

  4. java: web应用中不经意的内存泄露

    前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...

  5. 对抗密码破解 —— Web 前端慢 Hash

    (更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...

  6. 使用 Nodejs 搭建简单的Web服务器

    使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...

  7. 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)

    Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...

  8. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  9. Web性能优化:图片优化

    程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...

  10. 使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

随机推荐

  1. Umbraco中获取UmbracoContext

    在Umbraco项目中,获取当前的UmbracoContext几乎是都需要用到的,我们一般通过一个静态方法来获取,代码如下 public class ContextHelpers { public s ...

  2. 【Java学习】Java泛型详解

    1. 概述 在引入范型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入范型后,一个复杂类型就可以在细分成更多的类型.例如原先的类型List,现在在细分成List<Obje ...

  3. 关于AJAX异步加载节点无法触发点击事件问题的解决方式

    做练习的过程中遇到一个问题,使用AJAX异步新增一个节点,无法触发点击事件,经过查阅之后知道一个方式,使用JS的委托事件,在此做一个记录. $(document).on('click', '.recr ...

  4. kolla-build镜像时,问题汇总

    记录下kolla-build镜像时,遇到的一些问题,既为了方便自己以后问题的查找,也为了帮助别人避免踩这些坑.遇到的问题会持续更新在博客里面. 问题1:使用的kolla 版本是ocata版本,本地已经 ...

  5. localStorage、sessionStorage、cookie的有效期和作用域问题

    sessionStorage,localStorage,cookie都可以实现客户端存储,三者的区别有哪些了? cookie作为最早期的被设计web浏览器存储少量数据,从底层看,它是作为http协议的 ...

  6. Knights0.

    Knights t数轴上有n个骑士位于1,2,3,...n,移动速度相同,初始移动方向已知,当两个骑士相遇时,各有50%的概率赢,输了就死了,并且移动到0和n+1的位置时移动方向会翻转,问最右的骑士存 ...

  7. 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm

    [bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...

  8. git 日常使用从入门到真香

    目录 git 日常使用从入门到真香 一.Git简介 二.Git常用命令 三.git操作流程 四.报错处理 git 日常使用从入门到真香 一.Git简介 Git是一个开源的分布式版本控制系统,可以有效. ...

  9. [Groovy] Private fields and methods are not private in groovy

    如题,, 具体介绍请参看: http://refaktor.blogspot.com/2012/07/private-fields-and-methods-are-not.html

  10. C语言中的定义与声明

    什么是定义?什么是声明?它们有何区别? 举个例子: 1 2 A)int i; B)extern int i;(关于extern,后面解释) 哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的 ...