一、服务器
1.创建服务器
func Listen(net, laddr string) (Listener, error)
func ListenTCP(net string, laddr *TCPAddr) (*TCPListener, error) //TCP
func ListenUnix(net string, laddr *UnixAddr) (*UnixListener, error) // Unix
ln, err := net.Listen("tcp", ":8080")
if err != nil {
// handle error
}
for {
conn, err := ln.Accept()
if err != nil {
// handle error
continue
}
go handleConnection(conn)
}
2.接收客户端
func (l *TCPListener) Accept() (Conn, error) //TCP
func (l *TCPListener) AcceptTCP() (*TCPConn, error)
func (l *UnixListener) Accept() (c Conn, err error) //Unix
func (l *UnixListener) AcceptUnix() (*UnixConn, error)
3.读写
- func (c *TCPConn) Read(b []byte) (int, error) //TCP
- func (c *TCPConn) ReadFrom(r io.Reader) (int64, error)
- func (c *TCPConn) Write(b []byte) (int, error)
- func (c *UnixConn) Read(b []byte) (int, error) //Unix
- func (c *UnixConn) ReadFrom(b []byte) (int, Addr, error)
- func (c *UnixConn) ReadFromUnix(b []byte) (n int, addr *UnixAddr, err error)
- func (c *UnixConn) ReadMsgUnix(b, oob []byte) (n, oobn, flags int, addr *UnixAddr, err error)
- func (c *UnixConn) Write(b []byte) (int, error)
- func (c *UnixConn) WriteTo(b []byte, addr Addr) (n int, err error)
- func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (n int, err error)
- func (c *UnixConn) WriteMsgUnix(b, oob []byte, addr *UnixAddr) (n, oobn int, err error)
4.实例应用
package main
import (
"fmt"
"net"
)
func main() {
// 监听
ser, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println(err.Error())
return
}
for {
// 接受新的客户端
client, err := ser.Accept()
if err != nil {
fmt.Println(err.Error())
continue
}
// 开启协程 单独一条线负责和客户端交互
// 即一个客户端对应一个协程
go func(conn net.Conn) {
buf := make([]byte, 4096)
for {
// 获取客户端发来的书籍
count, err := conn.Read(buf)
if err != nil {
//fmt.Println(err.Error())
continue
}
clientMsg := string(buf[:count])
fmt.Printf("收到%v的消息:%s\r\n", conn.RemoteAddr(), clientMsg)
if clientMsg == "off" {
// 关闭客户端
conn.Close()
break
} else {
// 发送数据给客户端
client.Write([]byte("已阅" + clientMsg))
}
}
}(client)
}
}
二、客户端
1.创建客户端
- func Dial(network, address string) (Conn, error)
- func DialTimeout(network, address string, timeout time.Duration) (Conn, error)
- func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) //TCP
- func DialUnix(net string, laddr, raddr *UnixAddr) (*UnixConn, error) //Unix
conn, err := net.Dial("tcp", "google.com:80")
if err != nil {
// handle error
}
fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
status, err := bufio.NewReader(conn).ReadString('\n')
// ...
2.读写
读写同服务器
3.实例应用
package main
import (
"bufio"
"fmt"
"log"
"net"
"os"
)
func main() {
dial, err := net.Dial("tcp", ":8080")
if err != nil {
fmt.Println(err.Error())
return
}
bufRead := make([]byte, 4096)
for {
// 获取客户端输入
reader := bufio.NewReader(os.Stdin)
// 读取一行
bufWrite, _, err := reader.ReadLine()
if err != nil {
continue
}
if string(bufWrite[:]) == "off" {
// 客户端输入off,发送给服务器 我要关闭了
if _, err := dial.Write(bufWrite); err != nil {
log.Fatal(err)
}
// 关闭客户端
dial.Close()
break
} else {
// 发送给服务器数据
if _, err := dial.Write(bufWrite); err != nil {
log.Fatal(err)
}
// 获取服务器发送来的数据
c,_ := dial.Read(bufRead)
fmt.Println("服务器说:" + string(bufRead[:c]))
}
}
}