diff --git a/networkProgram/NetworkProgram.log b/networkProgram/NetworkProgram.log new file mode 100644 index 0000000..4064c7a --- /dev/null +++ b/networkProgram/NetworkProgram.log @@ -0,0 +1,19 @@ +物理层: +它主要规定了网络的一些电气特性,作用是负责传送0和1的电信号。 +数据链路层: +单纯的0和1没有任何意义,所以我们使用者会为其赋予一些特定的含义,规定解读电信号的方式 +一组电信号构成一个数据包,叫做"帧"(Frame)。每一帧分成两个部分:标头(Head)和数据(Data)。 +其中"标头"包含数据包的一些说明项,比如发送者、接受者、数据类型等等;“数据"则是数据包的具体内容。 +以太网规定,连入网络的所有设备都必须具有"网卡"接口。数据包必须是从一块网卡,传送到另一块网卡。网卡的地址,就是数据包的发送地址和接收地址,这叫做MAC地址。 +每块网卡出厂的时候,都有一个全世界独一无二的MAC地址,长度是48个二进制位,通常用12个十六进制数表示。 +前6个十六进制数是厂商编号,后6个是该厂商的网卡流水号。有了MAC地址,就可以定位网卡和数据包的路径了。 +网络层: +必须找到一种方法区分哪些MAC地址属于同一个子网络,哪些不是。如果是同一个子网络,就采用广播方式发送,否则就采用"路由"方式发送。这就导致了"网络层"的诞生。 +它的作用是引进一套新的地址,使得我们能够区分不同的计算机是否属于同一个子网络。这套地址就叫做"网络地址",简称"网址"。 +规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址。目前,广泛采用的是IP协议第四版,简称IPv4。 +IPv4这个版本规定,网络地址由32个二进制位组成,我们通常习惯用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。 +传输层: +我们如何区分某个数据包到底是归哪个程序的呢? +也就是说,我们还需要一个参数,表示这个数据包到底供哪个程序(进程)使用。这个参数就叫做"端口”(port),它其实是每一个使用网卡的程序的编号。 +每个数据包都发到主机的特定端口,所以不同的程序就能取到自己所需要的数据。 +“端口"是0到65535之间的一个整数,正好16个二进制位。0到1023的端口被系统占用,用户只能选用大于1023的端口。有了IP和端口我们就能实现唯一确定互联网上一个程序,进而实现网络间的程序通信。 diff --git a/networkProgram/TCP_client.go b/networkProgram/TCP_client.go new file mode 100644 index 0000000..280919c --- /dev/null +++ b/networkProgram/TCP_client.go @@ -0,0 +1,42 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "net" + "os" + "strings" +) + +//TCP client端 + +func main() { + + //1.与server端建立链接 + conn, err := net.Dial("tcp", "127.0.0.1:20000") + if err != nil { + log.Fatal("dial server failed on:", err) + } + defer conn.Close() + //2.发送数据 + reader := bufio.NewReader(os.Stdin) + buf := make([]byte, 1024) + for { + fmt.Print("请发送信息:") + msg, _ := reader.ReadString('\n') + msg = strings.TrimSpace(msg) + if msg == "exit" { + break + } + conn.Write([]byte(msg)) + fmt.Println("等待回复中..") + n, err := conn.Read(buf) + if err != nil { + log.Fatal("读取信息失败", err) + } + fmt.Println(string(buf[:n])) + + } + +} diff --git a/networkProgram/TCP_server.go b/networkProgram/TCP_server.go new file mode 100644 index 0000000..c1861d6 --- /dev/null +++ b/networkProgram/TCP_server.go @@ -0,0 +1,52 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "net" + "os" + "strings" +) + +//TCP server端 + +func process(conn net.Conn) { + var tmp = make([]byte, 1024) + reader := bufio.NewReader(os.Stdin) + for { + n, err := conn.Read(tmp[:]) + if err != nil { + log.Fatal("read failed on:", err) + return + } + fmt.Println(string(tmp[:n])) + fmt.Print("请回复:") + msg, _ := reader.ReadString('\n') + msg = strings.TrimSpace(msg) + if msg == "exit" { + break + } + conn.Write([]byte(msg)) + fmt.Println("等待回复中..") + } +} + +func main() { + //1.本地端口启动服务 + listener, err := net.Listen("tcp", "127.0.0.1:20000") + if err != nil { + log.Fatal("start Tcp server failed on:", err) + return + } + //2.等待别人来跟我建立链接 + for { + conn, err := listener.Accept() + if err != nil { + log.Fatal("accept failed on:", err) + } + //3与客户端通信 + go process(conn) + } + +} diff --git a/sync/atomic.go b/sync/atomic.go new file mode 100644 index 0000000..7905807 --- /dev/null +++ b/sync/atomic.go @@ -0,0 +1,5 @@ +package main + +func main() { + +}