运用去里面的净包中的相关方法来实现一个基于tcp的简单多人聊天室,用一个服务器来管理,主要反馈客户端是否连接成功并显示客户端输入的内容,并且发送给每一个在服务器上连接的客服端、下面话不多说了,来一起看看详细的介绍吧。
<>强服务器代码强>
//服务器 主要包 导入( “fmt” “净” ) var ConnMap map [string] * net.TCPConn func checkErr int(错错误){ 如果犯错!=nil { 如果err.Error ()==癊OF”{ fmt.Println(“用户退出”) 返回0 } fmt.Println(“发生错误”) 返回1 } 返回1 } func表示(tcpConn * net.TCPConn) { 为{ 数据:=([]字节,256) 总犯错:=tcpConn.Read(数据) 如果犯错!=nil { fmt.Println (string(数据总量[:]),呃) 其他}{ fmt.Println (string(数据总量[:])) } 国旗:=checkErr (err) 如果标志==0 { 打破 } _,康涅狄格州:=范围ConnMap { 如果conn.RemoteAddr () .String ()==tcpConn.RemoteAddr () .String () { 继续 } conn.Write(数据(总):) } } } 函数main () {//var康涅狄格州net.TCPConn//localAddr:=conn.LocalAddr () .String ()//fmt.Println (localAddr)//tcpAddr _:=net.ResolveTCPAddr (“tcp localAddr) tcpAddr _:=净。ResolveTCPAddr (“tcp”、“192.168.128.216:8080”) tcpListen _:=净。tcpAddr ListenTCP (tcp) ConnMap=使(map [string] * net.TCPConn) 为{ tcpConn _:=tcpListen.AcceptTCP () 推迟tcpConn.Close () .String ConnMap [tcpConn.RemoteAddr () ())=tcpConn fmt。Println(“连接客户端信息:“,tcpConn.RemoteAddr () .String ()) 去说(tcpConn) } }
本来打算用系统的<代码> LocalAddr() 代码>函数来直接调用本地网络地址,但是这里调用一直报格式的错误,所以这里用本地地址直接输在里面,端口是8080//192.168.247.128:8080,也可以改成和客户端相似的代码来进行调用,但鉴于服务器唯一,所以就不做更改了
<强>客户端代码强>
//客户端 主要包 导入( “fmt” “净” “操作系统” ) var ch陈int=让陈(int) var昵称字符串 func读者(康涅狄格州* net.TCPConn) { 迷:=([]字节,256) 为{ j,犯错:=conn.Read(浅黄色) 如果犯错!=nil { ch & lt; - 1 打破 } fmt。Printf (" % s \ n ",迷[0:j]) } } 函数main () { 如果len (os.Args) !=2 { fmt.Fprintf(操作系统。Stderr,“用法:% s主机:端口”,os.Args [0]) os.Exit (1) } 服务:=os.Args [1] TcpAdd _:=净。ResolveTCPAddr (“tcp服务)//TcpAdd _:=净。ResolveTCPAddr (“tcp”、“localhost: 8080”) 康涅狄格州,犯错:=净。DialTCP (tcp, nil, TcpAdd) 如果犯错!=nil { fmt.Println(“服务没打开”) os.Exit (1) } 推迟conn.Close () 读者(康涅狄格州) fmt.Println(“请输入昵称”) fmt.Scanln(及昵称) fmt。Println(“你的昵称是:“,昵称)//var str字符串 为{ var味精字符串 fmt.Scan(和味精) fmt.Print (“& lt;”+昵称+“比”;+ "说:")//因为我_:=范围味精{//fmt。Printf (" % c”、味精[我])//} fmt.Println(味精) b:=[]字节(“& lt;”+昵称+“比”;+ "说:" +味精) conn.Write (b) 选择{ 案例& lt; ch: fmt.Println(“服务器发生错误,请重新连接”) os.Exit (2) 默认值: } } }
客户端主要就是向服务器发起连接,然后发送和接收数据,原计划定义一个字符切片来存储读来的数据,但是出现了调用fmt.Println()来输出是时候显示ASCII码的错误,所以改成直接往一个空字符串里面读写,然后再来调用<代码> fmt.Println() 代码>,显示出正确的字符串
<>强运行服务器强>
<代码>去构建server.go 代码>
<代码>。/服务器代码>
或,<代码>去运行server.go 代码>
<>强运行客户端强>
<代码>去构建client.go 代码>
。/客户服务器地址:端口(上面例子是192.168.247.128:8080)