tcp 客户端/服务端常用读写函数
func (c *TCPConn) Write(b []byte) (n int, err os.Error)
func (c *TCPConn) Read(b []byte) (n int, err os.Error)
服务端监听端口函数
func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error)
服务端接收客户端请求函数
func (l *TCPListener) Accept() (c Conn, err os.Error)
客户端向服务端发起请求函数
func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error)
// net参数是"tcp4"、"tcp6"、"tcp"中的任意一个,分别表示TCP(IPv4-only)、TCP(IPv6-only)或者TCP(IPv4,IPv6的任意一个)
// laddr表示本机地址,一般设置为nil
// raddr表示远程的服务地址
TCPAddr类型
type TCPAddr struct {
IP IP
Port int
}
// 获取 TCPAdder 类型函数
func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)
tcp 链接控制函数
// 设置连接的超时时间,客户端和服务器端都适用,当超过设置的时间时该连接就会失效
func (c *TCPConn) SetTimeout(nsec int64) os.Error
// 设置客户端是否和服务器端一直保持着连接,即使没有任何的数据发送
func (c *TCPConn) SetKeepAlive(keepalive bool) os.Error
example:
server 端代码
package main
import (
"fmt"
"net"
"os"
// "io/ioutil"
)
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[0])
os.Exit(1)
}
service := os.Args[1]
// 指定要访问的服务端地址
tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
checkError(err)
// 向服务端发起请求
conn, err := net.DialTCP("tcp4", nil, tcpAddr)
checkError(err)
// 往服务端写入数据
_, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n"))
checkError(err)
// ioutil.ReadAll 会阻塞到产生err或则读取到EOF才会返回
// result, err := ioutil.ReadAll(conn)
// checkError(err)
var buf = make([]byte, 1024)
// 阻塞式读取服务端返回的数据
n, err := conn.Read(buf)
fmt.Println("read %d bytes, content is %s\n", n, string(buf[:n]))
os.Exit(0)
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
}
client 端代码
package main
import (
"fmt"
"net"
"os"
// "io/ioutil"
)
func main() {
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "Usage: %s host:port ", os.Args[0])
os.Exit(1)
}
service := os.Args[1]
// 指定要访问的服务端地址
tcpAddr, err := net.ResolveTCPAddr("tcp4", service)
checkError(err)
// 向服务端发起请求
conn, err := net.DialTCP("tcp4", nil, tcpAddr)
checkError(err)
// 往服务端写入数据
_, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n"))
checkError(err)
// ioutil.ReadAll 会阻塞到产生err或则读取到EOF才会返回
// result, err := ioutil.ReadAll(conn)
// checkError(err)
var buf = make([]byte, 1024)
// 阻塞式读取服务端返回的数据
n, err := conn.Read(buf)
fmt.Println("read %d bytes, content is %s\n", n, string(buf[:n]))
os.Exit(0)
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
os.Exit(1)
}
}