go高性能并发服务器,开发go并发服务器和请求客户端

服务端

package main

import (

"strings"

"fmt"

"net"

)

// 这是服务端接受参数,同时把参数返回回去,如果遇到参数为exit,那么断开连接

func handleConn (conn net.Conn){

// 获取连接着的ip

addrIP := conn.RemoteAddr().String()

fmt.Printf("%s 已连接", addrIP)

buf := make ([]byte, 1024*2)

// 这里要放到最前面,因为只有放到最前面才能被执行,否则的话,

// 下面退出了,结果这里还没有关闭,容易造成客户端长时间等待响应

defer conn.Close()

for {

n, err:= conn.Read(buf)

if err != nil {

fmt.Println("conn.Read err = ",err)

return

}

result := strings.ToUpper( string( buf[:n] ) )

fmt.Println( result )

// 检查是否是退出行为,也就是是否检测到了exit

//其实这里多了一个字符,那么需要把最后的\n去掉,然后再比较

if string( buf[:n - 2] ) == "exit" {

fmt.Printf("%s 已退出", addrIP)

return

}

// 把数据返回回去

conn.Write( []byte (result))

}

}

func main () {

// 创建一个服务

Server,err := net.Listen("tcp", "127.0.0.1:8000")

if err != nil {

fmt.Println("listen err = ",err)

return

}

defer Server.Close()

// for循环代表时刻保持连接

for {

conn, err:= Server.Accept()

if err != nil {

fmt.Println("conn err = ",err)

return

}

defer conn.Close()

go handleConn(conn)

}

}

客户端

package main

import (

"os"

"net"

"fmt"

)

func main ( ) {

conn,err := net.Dial("tcp", "127.0.0.1:8000");

if err != nil {

fmt.Println("conn err = ", err)

// 终止主协程

return

}

// defer conn.Close()

// 输入

str := make([]byte, 1024 * 2)

go func ( ) {

for {

n,err := os.Stdin.Read(str)

if err != nil {

fmt.Println("err = ", err)

}

// 拿到数据

// 去发送

// 发送之前判断,最好不要这样

// if string( str[:n-2] ) == "exit" {

// return

// }

conn.Write(str[:n]);

}

} ()

// 创建一个协程,,用来输入

for {

buf := make ( [] byte, 1024 * 2);

defer conn.Close()

n,err:=conn.Read(buf)

if err != nil {

return

}

result := string(buf[:n]);

fmt.Println("result = ",result)

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值