前期准备
- 需要
import "net"包 IP类型,其中一个重要的方法是IP.ParseIP(ipaddr string)来判断是否是合法的IP地址
func (c *TCPConn) Write(b []byte) (n int, err os.Error)用于发送数据,返回发送的数据长度或者返回错误,是TCPConn的方法func (c *TCPConn) Read(b []byte) (n int, err os.Error)用于接收数据,返回接收的长度或者返回错误,是TCPConn的方法-
TCPAddr类型,保存TCP的地址信息,包括地址和端口type TCPAddr struct { IP IP Port int } func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)获取一个TCPAddr,参数都是string类型,net是个const string,包括tcp4,tcp6,tcp一般使用tcp,兼容v4和v6,addr表示ip地址,包括端口号,如www.google.com:80之类的func DialTCP(net string, laddr, raddr *TCPAddr) (c *TCPConn, err os.Error)用来连接(connect)到远程服务器上,net表示协议方式,tcp,tcp4或者tcp6,laddr表示本机地址,一般为nil,raddr表示远程地址,这里的laddr和raddr都是TCPAddr类型的,一般是上一个函数的返回值。-
作为一个TCP的客户端,基本的操作流程如下:
service="www.google.com:80" tcpAddr, err := net.ResolveTCPAddr("tcp4", service) conn, err := net.DialTCP("tcp", nil, tcpAddr) _, err = conn.Write([]byte("HEAD / HTTP/1.0\r\n\r\n")) _, err = conn.Read(b) / result, err := ioutil.ReadAll(conn)
func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error)用来监听端口,net表示协议类型,laddr表示本机地址,是TCPAddr类型,注意,此处的laddr包括端口,返回一个*TCPListener类型或者错误func (l *TCPListener) Accept() (c Conn, err os.Error)用来返回一个新的连接,进行后续操作,这是TCPListener的方法,一般TCPListener从上一个函数返回得来。-
服务器的基本操作流程为:
service:=":9090" tcpAddr, err := net.ResolveTCPAddr("tcp4", service) l,err := net.ListenTCP("tcp",tcpAddr) conn,err := l.Accept() go Handler(conn) //此处使用go关键字新建线程处理连接,实现并发
实现一个公共聊天服务器。
- 服务器接收客户端的信息
- 接收完以后将客户端的信息发送到所有的客户端上
- 客户端使用
/quit退出聊天 - 只使用一套代码,通过命令行参数启动服务器还是客户端
实现:
- package main
- import(
- "fmt"
- "os"
- "net"
- )
- //
- //错误检查
- //
- func checkError(err error,info string) (res bool) {
- if(err != nil){
- fmt.Println(info+" " + err.Error())
- return false
- }
- return true
- }
- //
- //服务器端接收数据线程
- //参数:
- // 数据连接 conn
- // 通讯通道 messages
- //
- func Handler(conn net.Conn,messages chan string){
- fmt.Println("connection is connected from ...",conn.RemoteAddr().String())
- buf := make([]byte,1024)
- for{
- lenght, err := conn.Read(buf)
- if(checkError(err,"Connection")==false){
- conn.Close()
- break
- }
- if lenght > 0{
- buf[lenght]=0
- }
- //fmt.Println("Rec[",conn.RemoteAddr().String(),"] Say :" ,string(buf[0:lenght]))
- reciveStr :=string(buf[0:lenght])
- messages
关注打赏
立即登录/注册
微信扫码登录
