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. 第6章 jQuery与Ajax的应用

    6.1 Ajax的优势和不足 6.1.1 Ajax的优势 1.不需要插件支持 2.优秀的用户体验 3.提高Web程序的性能 Ajax模式只是通过XMLHttpRequest对象向服务器端提交希望提交的 ...

  2. 1、Tomcat7性能监控与优化

    1.   目的 通过优化tomcat提高网站的并发能力. 2.   服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有决定性影响. 3.   优化配置 3.1. 配置tomcat管理员账户 ...

  3. MVC5中的路由

    [Route("dazhao/{id}")] [Route("xixi/index")] [Route("xiaohan")] public ...

  4. SuperSocket1.6电子书离线版

    使用离线浏览器制作,格式为chm,本人不对电子书内容具有任何权利!简体中文,适用于.NET开发. 下载地址

  5. ASP前端控件设置只读不要用enabled

    会导致后台取不到这个控件的值,应该用readonly

  6. CSS之引入样式

    CSS引入样式 内部样式 内嵌式是将CSS代码集中写在HTML文档的head头部标签中,并且用style标签定义,其基本语法格式如下: <head> <style type=&quo ...

  7. P2381 圆圆舞蹈

    题意:一个圆,上面有n头牛(卧槽) 给出相邻两头牛顺时针的距离 问两只最远的牛的距离(min(顺时针距离,逆时针距离)) 最远距离一定$\le$距离和/2 先求个前缀和 那么问题转化为:找到 $s_j ...

  8. [CEOI2008]order BZOJ1391 网络流

    题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成. 现在给出这些参数,求最大利润 输入输出格式 输入格式 ...

  9. Centos6.8 yum安装LNMP

    1.Centos6系统库中默认是没有nginx的rpn包的,所以我们需要先更新下rpm依赖库 (1):使用yum安装nginx,安装nginx库 rpm -Uvh http://nginx.org/p ...

  10. php 在 匿名函数中 调用自身。。

    //php闭包实现函数的自调用,也就是实现递归 function closure($n,$counter,$max){ //匿名函数,这里函数的参数加&符号是,引址调用参数自己 $fn = f ...