#浅析TCP连接过程中server异常处理
基础环境:腾讯云ubuntu虚拟机
前置基础:对TCP连接有一个基本认识,能写进行简单socket编程
先简单介绍一下TCP编程流程
TCP简易编程流程
1.TCP服务器端编程流程如下:
- 创建套接字socket;
- 绑定套接字bind;
- 设置套接字为监听模式,进入被动接受连接状态listen;
- 接受请求,建立连接accpet;
- 读写数据read/write;
- 终止连接close。
2.TCP客户端编程流程如下:
- 创建套接字socket;
- 与远程服务器建立连接connect;
- 读写数据read/write;
- 终止连接close。
使用GO的示例代码
这个是最简单的server client模式:
server是Listen、Accept、Read/Write;client是Dial、Read/Write
client的Dial即包含了自动创建一个socket并connect的操作)
package main
import (
"fmt"
"net"
"os"
)
func checkError(err error){
if err != nil {
fmt.Println("Error: %s", err.Error())
os.Exit(1)
}
}
func recvConnMsg(conn net.Conn) {
// var buf [50]byte
buf := make([]byte, 50)
defer conn.Close()
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn closed")
return
}
//fmt.Println("recv msg:", buf[0:n])
fmt.Println("recv msg:", string(buf[0:n]))
}
}
func main() {
listen_sock, err := net.Listen("tcp", "localhost:10000")
checkError(err)
defer listen_sock.Close()
for {
new_conn, err := listen_sock.Accept()
if err != nil {
continue
}
go recvConnMsg(new_conn)
}
}
package main
import (
"fmt"
"net"
"os"
)
func checkError(err error){
if err != nil {
fmt.Println("Error: %s", err.Error())
os.Exit(1)
}
}
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:10000")
checkError(err)
defer conn.Close()
conn.Write([]byte("Hello world!"))
fmt.Println(&