go-网络编程
基本介绍
golang的主要设计目标之一就是面向大规模后端服务器程序,网络通信这块是服务端程序必不可少的,也是至关重要的 网络编程有两种
TCP socket编程,是网络编程的主流。之所以叫Tcp socket编程,是因为底层是基于TCP/IP协议的 b/s结构的http编程,使用浏览器去访问服务器时,使用的就是http协议,而http底层依旧是用tcp socket实现的
基本知识
TCP/IP(Transmission Control Protocol/Internet Protocol)的简写,中文译名为传输控制协议/因特网协议,又叫网络通讯协议,这个协议是Internet最基本的协议、Internet国际或联网的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的
ip地址:每个internet上的主机和路由器都有一个ip地址,它包括网络号和主机号,ip地址有ipv4(32位)或者ipv6(128位)。 端口port:
只要是做服务程序,都必须监听一个端口 端口就是其他程序和该服务通讯的通道 一个计算机有65535个端口 1-65535 一旦一个端口被某个程序监听(占用),那么其他的程序就不能在该端口监听 分类:
0号是保留端口 1-1024是固定端口或有名端口 1025-65535是动态端口
注意事项:
在计算机要尽可能的少开端口 一个端口只能被一个程序监听 若使用netstat -an
可以查看本机中有哪些端口在监听 可以使用netstat -anb
来查看监听端口的pid,再结合任务管理器关闭不安全的端口
快速入门
处理流程
服务端的处理流程
监听端口 8888 接收客户端的tcp连接,建立客户端和服务端的链接 创建goroutine,处理该连接的请求
客户端的处理流程
建立与服务器端的链接 发送请求数据,接收服务器端返回的结果数据 关闭链接
package main
import (
"fmt"
"io"
"net"
)
func main ( ) {
listener, err := net. Listen ( "tcp" , "0.0.0.0:8888" )
if err != nil {
fmt. Println ( "listener err: " , err)
return
}
defer listener. Close ( )
for {
fmt. Println ( "等待客户端连接" )
conn, err2 := listener. Accept ( )
if err2 != nil {
fmt. Println ( "accept err2: " , err2)
} else {
fmt. Printf ( "success conn: %v\n" , conn)
go proccess ( conn)
}
}
}
func proccess ( conn net. Conn) {
defer conn. Close ( )
for {
buf := make ( [ ] byte , 1024 )
n, err := conn. Read ( buf)
if err != nil && err != io. EOF {
fmt. Printf ( "server conn read err: %v\n" , err)
} else if err == io. EOF {
fmt. Printf ( "%v client exit" , conn. RemoteAddr ( ) )
return
}
fmt. Print ( conn. RemoteAddr ( ) , ": " )
fmt. Println ( "client Data : " , string ( buf[ : n] ) )
switch string ( buf[ : n] ) {
case "hello\n" :
conn. Write ( [ ] byte ( "hello" ) )
case "go\n" :
conn. Write ( [ ] byte ( "study golang" ) )
case "dlmu\n" :
conn. Write ( [ ] byte ( "211 school" ) )
default :
conn. Write ( [ ] byte ( "I don't know" ) )
}
}
}
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main ( ) {
conn, err := net. Dial ( "tcp" , "127.0.0.1:8888" )
if err != nil {
fmt. Println ( "client dial err: " , err)
}
defer conn. Close ( )
fmt. Printf ( "client success conn: %v\n" , conn)
for {
reader := bufio. NewReader ( os. Stdin)
line, err2 := reader. ReadString ( '\n' )
if err2 != nil {
fmt. Println ( "readString err: " , err2)
}
if line == "exit\n" {
break
}
_ , err3 := conn. Write ( [ ] byte ( line) )
if err3 != nil {
fmt. Println ( "conn.Write err: " , err3)
}
buf := make ( [ ] byte , 1024 )
n, err4 := conn. Read ( buf)
if err4 != nil {
fmt. Println ( "client read err: " , err4)
}
fmt. Printf ( "server: %v\n" , string ( buf[ : n] ) )
}
}