áá¥ááá«
á á áá©
áœáá á áµá°ááá ášáášá ááµá°áááá áá°ášá³á ááá®áœ á«á¥á«á«á, áá³áááœá á°áá£á«á á«á°ááá
ášáááᣠáá¥áá¥á áá®á¶á®á
á á°áá«á© á áµá°áááᜠáá á áá°á© ášáá°áá áªá« áá°á¶áœ áá«ášá áááá«á³á áááááµá á«ááá£áᢠášáá°áá áªá« á¥áá³ á áá»áᣠááá«á áááááµ áá°á¶áœá á áá¥á³ ášáá«ááá á°áᥠáááµááá¢
áá ášáá°ášáá (á áµááá ášáá) ášáá°áá áªá« áá¥áá¥á ááááá¶áœá áá° ááá¥á«á®áœ á áášááá á¥á á á¥á«áá³áá³ážá áá ášáááᣠáá¥áá¥á á«áµáá á áášáá ááá¢
ášáá«á ášáááá£á áá¥áá¥á áááá áá° ááªá ášá áá³áš áášá¥ áá¥áá¥á á«ááá, ááá á ááµááá áá¥áá¥á áá¬áµ (á³á³áá«á) ááµá¥ á°áá ááá«á. á ááá á«á áášášá» áá ášá áá³ášáášá¥ áá¥áá¥á ášáááᣠáá¥áá¥á áááá ášá³á³áá«á á áá¥á¶ áá° áááá£á áá¥áá¥á á«áááᢠá ááá á ášáááá£á áá¥áá¥á ášá°áá ááá ááá á«á«áá³á áµááá á ááá¡ áá°áá£á© áá°áá áªá« ášááá áááá.
á áµá°ááá ášááᥠááµá°ááá áááááœ
áá á áá á°á ááá± á á°á á á á»áá áá á áµá°ááá ášáášá ááµá°ááá
á á£á ááá áá³á. ášááªá ááá á ááá ááá¡á ášáááá áœáá ááá áá, á ááµá¡ ášá«ááá áá¬áµ ááá¥á«á á¥á áá° á°áá¡ ááá«á.
á áááá
package main
import (
"log"
"net"
)
func main() {
// IP-аЎÑÐµÑ ÑеÑвеÑа О пПÑÑ
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
// ÑПзЎаеЌ ÑÐŸÐºÐµÑ Ñ Ð¿ÐŸÑÑПЌ
serverConn, err := net.ListenUDP("udp", serverAddr)
if err != nil {
log.Fatal(err)
}
// ПÑлПжеММПе закÑÑÑОе ÑПеЎОМеМОÑ
defer serverConn.Close()
// ÑПзЎаеЌ бÑÑÐµÑ ÐŽÐ»Ñ ÐŽÐ°ÐœÐœÑÑ
buf := make([]byte, 1024)
// жЎеЌ ÑПеЎОМеМОе
for {
// ÑОÑаеЌ запÑПÑ
n, addr, err := serverConn.ReadFromUDP(buf)
// пеÑеЎаеЌ ЎаММÑе в ÐÐРХÐÐÐ ÑÑПвеМÑ: в МаÑеЌ ÑлÑÑае stdout
println(string(buf[0:n]), " form ", addr.IP.String())
if err != nil {
log.Fatal(err)
}
// ПÑвеÑа МеÑ, Ñ.к. ÑÑП UDP + МаЎежМÑй каМал
}
}
á°áá á
package main
import (
"fmt"
"log"
"net"
"time"
)
func main() {
// IP-аЎÑÐµÑ ÑеÑвеÑа О пПÑÑ
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:12000")
if err != nil {
log.Fatal(err)
}
// лПкалÑÐœÑй IP-аЎÑÐµÑ Ðž пПÑÑ
localAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
if err != nil {
log.Fatal(err)
}
// ÑÑÑаМПвка ÑПеЎОМеМОÑ
conn, err := net.DialUDP("udp", localAddr, serverAddr)
if err != nil {
log.Fatal(err)
}
// ПÑлПжеММПе закÑÑÑОе ÑПеЎОМеМОÑ
defer conn.Close()
for {
// пПлÑÑеМОе ЎаММÑÑ
ÐŸÑ ÐÐРХÐÐÐÐ ÑÑПвМÑ
fmt.Print("ÐвеЎОÑе ÑÑÑПÑМПе пÑеЎлПжеМОе > ")
var msg string
_, err := fmt.Scanf("%s", &msg)
if err != nil {
log.Fatal(err)
}
// пеÑеЎаеÑÑÑ Ð¿ÐŸÑПк байÑ, а Ме ÑÑÑПка
buf := []byte(msg)
// запОÑÑ (пеÑеЎаÑа) в ÑПеЎОМеМОе
_, err = conn.Write(buf)
if err != nil {
log.Fatal(err)
}
// 1 ÑекÑМЎПÑкÑ
time.Sleep(time.Second * 1)
}
}
ááá ášááœá áµá á°á¶áœ á£áá áµ á°áᥠáá á áµá°ááá ášááᥠááµá°ááá
áá£á© á¥ááá ááá ášáá°ááá á¥áœáᜠá á°áá©á áµ á á°á á°ášá°á á¥áá°á°áá á ááááµ áá ᣠáá á ááµá£ážá á«ááµ á¢áµáµ áá áá¹ ááœáá áááá«á±á á»áá á áá³ááµ áá áášáááœá á á°áᣠááá© áµááá«áµá°ááá ááá¢
á áá ááá³, ášáášá°ááµ ááŽáᜠá¥á á áá áááá.
- áµá á°áµ ááá ááááµ;
- áá¥ášáááµ;
- á¥áá°áá ááµá°ááá.
á¥á áá áááµáá á°áá³á³á ááŽáᜠá«áážá á áµá°ááá ášááᥠááµá°ááá áá®á¶á®áᜠá áá¶áá²á á°á°ááá áµáááᜠ(ARQ) áá®á¶á®áᜠáá£ááá¢
á á°ášááªá ᣠá°áá£á© á á«á ášáášášá»áá áá¬áµ ááµá°ááá áµááá«áµášáµáá áá€áµ ááá áášá á áááá áá áµ áá á°ášá°áᜠáá áµá
á°á¶áœ ááá© á¥áá°ááœá áááµ ááµá¥ ááµáá£áµ á°áᢠááá¢
ášáá
áœáá áááµá á TCP ááµá¥á á¥á
á áá ášáá, ášáá¬á±á á°ášá³á³á áá¥á ášá«á á á²áµ ááµá áá° ášááᥠáá¬áµ áášá áá.
á áµá°ááá ášááᥠááµá°ááá á áá¬áµ ááá£áµ á¥á áªá³á« áááá«áµ á ááá³áá á»áá áá
ášááá£áµ áá, á áá«á³áá ááá³, á á áá³áš áášá¡ ááµá¥ ášáá¬áµ áá¥ááµ á á.
á¥á áá
áá áœáá áááá³áµ, ááŽáᜠá«áµáááá:
- ášáá¬áµ áá¥ááµ á¥ááá³ ááá°á;
- ášá á á¥áœááœá áá°áá£á© á á«á á¥áá°áá ááµášáµ á¢
á á°ášááªá ášá¥á
á áá¥ááµ á á°ášá᪠á°ášá°áá ášáá£áµ á¥áµáá ááá ááá ááá á«áá á, á á
ááŠá±á á ášáá°á áááášáµ áá
ášá¥ á áµááá áá. á ááá ááá³ááœ, á°áá³á³á ááá áášáááá: á¥áœá á¥áá°áá áá°áááá. ááá áááá£á á áá
áᎠášááá« áá áá£áªá áá ááá, áá
á ášá¥á á áááá áášášá» áááá°á á«áµáœááá³á. áµááá
á á¥á
á ááµá¥
// defaultTCPKeepAlive is a default constant value for TCPKeepAlive times
// See golang.org/issue/31510
const (
defaultTCPKeepAlive = 15 * time.Second
)
ááªá á ááµ áá¬áµ á á°ááá áá¥á (ášááááªá«á á¥á ááá°á áá) ášá°ááµ áá£áª ááµáá³áµ á«áµáááááᣠášá°ááµ áá£áªáá ááá«ášáŠáœ ááá£á á© á¥á á«áááµá¢
áµááá ᣠá áµá°ááá ášáášá ááµá°ááá áá®á¶á®ááœá ááá á áá°-áá³áŠáœá á ááááá¡-
- áŒá®áœ;
- ášá¥á áᜠá á°á á°ášá°á áá¥á®áœ;
- á°ááµ áá£áªááœ;
- á ááá³á á¥á á áá³á á°ášá°ááœ.
áá á« á¥á» á áá°áá!
á áµá°ááá ášááᥠááµá°ááá áá®á¶á®á ášá§á᧠ááµáá áá
á áµááµáá á£ášáá áá©ááµá£ á áµá°ááá ášááµášáµ áá®á¶á®á á á£á áá€á³á á áá°ááᢠRTT á¥ášášááš á²ááµ á áááá á»áá ášáá°á áá áµáááµ "ááááá" áááá«á. áá€á³ááá±á ááášáá á¥á ášáááá á»áá á á áá á á°á»á ááá³ ááá áá, ášá§á᧠ááµáá®áœ á¥á á áá áááá.
ášá§á᧠ááµáá á á ááá áá°áá ááá«á-
- ááá ášá°áá© á¥áœáᜠ(ášáµáá ááµá°áááᜠá áµá°áá) á áá© ááá³ áá³áá áµááá£ážá ášá°ášá³á³á áá¥á®áœ á¥ááµ áášááá¢
- á ááµá°áááá« á¥á á á°áá£á ááᜠáá áá á®ááœá ášáášáá á áµáááááµ.
ášá°ášá³á³á áá¥á ááá á¥á ášáášáá» áá á ááµááá¶áœ áá®á¶á®á ááá¬áµ ááµáᣠáªá³á« á¥á áááášáµ ááᜠá áááµá³ážá á¥ááááᜠáá ááá°ášá³áᢠášá§á᧠ááµááá á á°ááášá° áµá á°á¶áœá áááµá°á«ášá áááµ ááŽáᜠá á-
- N áá¬á¶áœá ááá°á ááááµ;
- ášá°áášá áµááááœ.
áá° áá ááááµ N áá¬á¶áœ - á°áážá«á³áœ ááµá®áµ áá®á¶á®á
ááªá á¶áµáµ á áááµ ááµá°á¶áœá áá°áá á áá áµá¡-
- á ášáá°á á°ášá áá®á¶á®á áá°ááᢠášááᥠááá á°áá£á "ášáá" á°á¥á á áá á«á áµ áá, ášááªá áá á ááááªá« ášááµá®á±á ááááµ á°ášá ááášáá«á (áá á N ášá°áá© ááá¥áá¶áœ á°ášá°á ááá áá ášáá á£á á). ááµá®á± á£á¶ ášáá, á á²áµ áá¬áµ ááá á«á á¥á áá°áááá, á¥á á°áááá á¥áŽá¶á¹ á°ááááá. á«áá áá᫠ᣠášááªá ááá áášáá áá° áááá áá¥áá¥á áááá³á ᣠá¥á áá ááµá®á± áááá±á ášáá«ááááµ ááᢠá á°ááᶠášáááá áá¥áá¥á ášá°áá°á áá á áá ááá¡á á¥áá°áá áááµá°ááá áááá«áᢠá á°ášá£á á ááá¬áœá ááªá ááá¡á ááášáµ (áá²á«áá ášááá ááá ) ááá ášááá³á°á áᎠ(á¥áá° áŽááá ááá á£áá²á«) á«áá á²áá áá á ášáááá áœáá ášááá á°áá£áá ášáá á«á ááµá®á± á£á¶ á²áá á¥á» ááᢠ.
- áášááá« ááá á. á áá®á¶á®á ááµá¥á£ á°ášá³á³á áá¥á N ááá áá¬áµá£ áš N ááµáá á«á á°ášá³á³á áá¥á®áœ á«áážá ááá á¥áœáᜠá á°á³á« ááá³ áááá³ážáá ášáá«ááááµ á á ááá á¥áá á á°á°á¥á·áá¢
- ášáá á£á áá«á áá á ááá á³á. ášáá¬á¶áœ á¥á á°ášá°áᜠášáá¥ááµ á¥á ášáááášá¶áœ á¥ááá³ááœá áááá°á áá®á¶á®á áá áá£áªá áá áááᢠášáá áá¥áá«á áá á«ááᣠášááªá ááá áááá á«áá³áá á¥áœáᜠá¥áá°áá ááá«áá¢
ášá°áášá áµááááœ
ášááµá®á± áá á á¥á ášáá°áááá«-áá®áááá³ áááášá± áááµ áµáá á²áá, á¥á áá¥á á«áážá áá¬á¶áœ á á§á᧠ááµáá ááµá¥ ááá ááœáá. á á¥áá°áá ááááµ ááá³, áá á áá¬áµ áµá á°áµ á¥á áá¥á á«áážá áá¬á¶áœ á¥áá°áá á¥áá²á°ááá áá«á°áá ááœáá, á á¥áááá¹ á á«áµáááá.
ááá³á:
ášááá ááá¥
á áááá
package main
import (
"bufio"
"fmt"
"log"
"net"
"strings"
)
func main() {
// ÑПзЎаеЌ ÑÐŸÐºÐµÑ Ñ Ð¿ÐŸÑÑПЌ
ln, err := net.Listen("tcp", ":8081")
if err != nil {
log.Fatalln(err)
}
// ПжОЎаМОе вÑзПва
conn, _ := ln.Accept()
for {
// ÑÑОÑÑваМОе ЎаММÑÑ
msg, err := bufio.NewReader(conn).ReadString('n')
if err != nil {
log.Fatalln(err)
}
// вÑвПЎ ÑППбÑÐµÐœÐžÑ Ð² stdout
fmt.Print("Message Received:", string(msg))
// пеÑевПЎ ÑÑÑПкО в веÑÑ
МОй ÑегОÑÑÑ
newMsg := strings.ToUpper(msg)
// ПÑпÑавка ЎаММÑÑ
conn.Write([]byte(newMsg + "n"))
}
}
á°áá á
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
)
func main() {
// ÑÑÑаМПвка ÑПеЎОМеМОÑ
conn, err := net.Dial("tcp", "127.0.0.1:8081")
if err != nil {
log.Fatalln(err)
}
for {
// ÑÑОÑÑваМОе ЎаММÑÑ
Ñ stdin
reader := bufio.NewReader(os.Stdin)
fmt.Print("Text to send: ")
// пПÑÑÑПÑМП
text, err := reader.ReadString('n')
if err != nil {
log.Fatalln(err)
}
// ПÑпÑавка
fmt.Fprintf(conn, text+"n")
// пÑОеЌ
msg, err := bufio.NewReader(conn).ReadString('n')
if err != nil {
log.Fatalln(err)
}
// вÑвПЎ пПлÑÑеММПгП ПÑвеÑа
fmt.Print("Msg from Server: " + msg)
}
}
áá°áá°áá«
á áµá°ááá ášááᥠááµá°ááá á¥á á á áááá ááášááᥠášáášá± ááŽááœ
áá ášá
áááášá», á áµá°á«ášáµ
áµááá á«ášááá¡
á áá°ááá áá¬áµ ááµá¥ ášá¢áµ áµá
á°á¶áœá áááášáµ á¥á
á áá áááá
á°ááµ áá£áª
ášáá áá¥áá« ááá ááá¥á«á á¥á ááá á¥áá³áá áá áááᢠášáááá áááµ á ášáá°á á°ášá ááµá á áá°áááá áµ áá áá¬á ááá á°ášá°á áá ááᢠá ááµ áá¬áµ á áááášá± ášá°ášá°á£ ááá áá á«áá á (ášáá áá¥áá« ááá á«ááá áµ)ᣠááá á°ášá°á ášá áᣠá¥áá°áá ááµá°ááá á á°áá£á© ááá áá áá°á°á£á á¥á
á ááá«áá¢
á°ášá³á³á áá¥á
ášá᪠áá° á°áá£á© ášáá°ááá ášááᥠáá¬ááœá á á
á°á á°ášá°á áá¥á áááµá áµ á¥á
á áá ááááᢠá á°áá ááµ á¥áœáᜠá°ášá³á³á áá¥á®áœ áá á«á ááá°á¶áœ á°áá£á© ášáá¬áµ áªá³á«á á¥áá²á«áá
á«áµáœáááᢠá°áá³á³á ášáá¬áµ á
á°á á°ášá°á áá¥á®áœ áááµ á¥áœáᜠá¥ááµ á ááµ ášá°á£á áážá
áášááá«
á á°áá£á© áášášá» ášáááš á¥á á°áá³á áá¬áµ ááá ášá¥á
áᜠá¡áµá á á°á³á« ááá³ ááá áá áá° ááªá á«áááá³áᢠá á°ááᶠá¥áá
áá á á°á³á« ááá³ ášá°áá á á¥áœáᜠá°ášá³á³á áá¥á®áœ áááᢠá áá®á¶á®á áá á áááµášáµ ášááá°á¥ á¥á ášá¡áµá áášááá«áᜠá°ááá°áá
á áá³á áášááá«
áá¬á á áµá
á°áµ ááá áá ááªá ááá³áá
á°áá£á© á°á á
áá á³áᢠá áá³á á¥áá
á á¥ááá áá á áµááá á«áá°ášá°áá ášáá¬á±á á°ášá³á³á áá¥á á«á«áµá³á
ááµá®áµ, áááá£
á¥áœááœá áááµá°ááá ášáá«áááá á°ášá³á³á áá¥á®áœá áááµá¡á¢ ááá²á«áµáµ á¥á á¥á
áášá£á ᥠááµááááœá ášáá á á
áá á²áá»ážá ášáá®á¶á®á áá áá á á¥á
á áášáá ááœááᢠá¥áá°ááášá ášááµá®á± áá á á á°áá£á© á«á ášááá á« á¥á ášááášá« áœáá³áᜠá¥áá²áá á ááµááá áááµ á°ášá áá á°ááµáᶠáá°á ááœáá.
Go áá áá³áš áášá¥ ášáá áá á°ášá᪠áá³áááœ
ááá: hab.com