GO WEB
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的更多相关文章
- C# Web应用调试开启外部访问
在用C#开发Web应用时有个痛点,就是本机用VS开启Web应用调试时外部机器无法访问此Web应用.这里将会介绍如何通过设置允许局域网和外网机器访问本机的Web应用. 目录 1. 设置内网访问 2. 设 ...
- 网页提交中文到WEB容器的经历了些什么过程....
先准备一个网页 <html><meta http-equiv="Content-Type" content="text/html; charset=gb ...
- 闲来无聊,研究一下Web服务器 的源程序
web服务器是如何工作的 1989年的夏天,蒂姆.博纳斯-李开发了世界上第一个web服务器和web客户机.这个浏览器程序是一个简单的电话号码查询软件.最初的web服务器程序就是一个利用浏览器和web服 ...
- java: web应用中不经意的内存泄露
前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
- 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)
Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- 使用ServiceStack构建Web服务
提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...
随机推荐
- 市场上主流的BI产品的“答案之书”
本文来自网易云社区. 从20世纪80年代开始,商业智能的定义出现在人们面前,早期商业智能十分基础和杂乱,不仅仅会把数据处理放进去.还包含有一些可视化方面内容等.这个时期的BI主要的功能是支持多维分析和 ...
- CS基本网络中Agent使用双网卡进行流量划分
两台服务器,一台服务器作为管理节点[单网卡],一台服务器作为计算节点[双网卡] ------------------------------------------------------------ ...
- 从理论认识J2EE
前言 在学习J2EE这块,看了成套的视频,感觉,感觉,感觉收获不是特别大,没用马老师讲得好,但是多少还是和J2EE打了个招呼,比如J2EE著名的十三个规范,他们有的人说不算什么规范,顶多可以理解为十三 ...
- server2008 IIS7配置全过程(包括发布ASP网站)
一.安装IIS 1.打开服务器管理器->角色->添加角色,选中WEB服务器(IIS),记得要把包括之后出现的ASP相关的东西都选中并安装,安装成功后,打开http://localhost/ ...
- DevExpress ASP.NET Dev控件客户端事件 ClientSideEvents
原文地址:http://www.cnblogs.com/allenlf/p/4171189.html
- atcoder/CODE FESTIVAL 2017 qual B/B(dfs染色判断是否为二分图)
题目链接:http://code-festival-2017-qualb.contest.atcoder.jp/tasks/code_festival_2017_qualb_c 题意:给出一个含 n ...
- poj1753(高斯消元解mod2方程组)
题目链接:http://poj.org/problem?id=1753 题意:一个 4*4 的棋盘,初始时上面放满了黑色或白色的棋子.对 (i, j) 位置进行一次操作后 (i, j), (i + 1 ...
- 对于vue的一些理解
首先是组件之间的通信方式 父组件到子组件的通信: props和$refs 子组件到父组件的通信: events 和 $parents 以及 $root 组件之间的通信 eventBus和vuex ev ...
- P3941 入阵曲
\(\color{#0066ff}{ 题目描述 }\) 小 F 很喜欢数学,但是到了高中以后数学总是考不好. 有一天,他在数学课上发起了呆:他想起了过去的一年.一年前,当他初识算法竞赛的 时候,觉得整 ...
- 「BZOJ3065」带插入区间第K小值 替罪羊树×线段树
题目描述 从前有\(n\)只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力\(a_i\).跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间\(k\)小值.他 ...