[Golang]Socket编程01----实现基本功能的Client和Server
2017-01-13 00:00
253 查看
支持多连接。
Server运行之后,进入Accept阻塞状态。Accept得到一个Conn之后,开启一个协程,分别有两个协程阻塞在Read和Write。当Read一个数据之后,将Read得到的数据写入readChannel中,之后再对其进行处理。在writeChannel得到一个数据之后,向Conn写入数据。
Client运行后,接入Server,之后开启两个协程阻塞在Read和Write的Channel中。在Scan得到一个数据之后,向writeChannel写入数据,唤醒阻塞的协程向Conn中写入数据。当Server中有数据返回时,read协程被唤醒,将数据写入readChannel中。
当然,还有诸多细节要处理。比如Conn的关闭在什么时候等等。
客户端源码
服务端代码:
Server运行之后,进入Accept阻塞状态。Accept得到一个Conn之后,开启一个协程,分别有两个协程阻塞在Read和Write。当Read一个数据之后,将Read得到的数据写入readChannel中,之后再对其进行处理。在writeChannel得到一个数据之后,向Conn写入数据。
Client运行后,接入Server,之后开启两个协程阻塞在Read和Write的Channel中。在Scan得到一个数据之后,向writeChannel写入数据,唤醒阻塞的协程向Conn中写入数据。当Server中有数据返回时,read协程被唤醒,将数据写入readChannel中。
当然,还有诸多细节要处理。比如Conn的关闭在什么时候等等。
客户端源码
package client import ( "net" "git.oschina.net/sdlszjb/unix_socket/errs" "fmt" ) func StartClient1() { tcpAddress, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:1300") if err != nil { errs.Error_exit(err) } conn, err := net.DialTCP("tcp", nil, tcpAddress) if err != nil { errs.Error_exit(err) } writeChan := make(chan []byte, 1024) readChan := make(chan []byte, 1024) go writeConnection(conn, writeChan) go readConnection(conn, readChan) //go handleReadChannel(readChan) for { var s string fmt.Scan(&s) writeChan <- []byte(s) } } func readConnection(conn *net.TCPConn, channel chan []byte) { defer conn.Close() buffer := make([]byte, 2048) for { n, err := conn.Read(buffer) if err != nil { errs.Error_print(err) return } println("Received from:", conn.RemoteAddr(), string(buffer[:n])) //channel <- buffer[:n] } } func writeConnection(conn *net.TCPConn, channel chan []byte) { defer conn.Close() for { select { case data := <- channel: _, err := conn.Write(data) if err != nil { errs.Error_exit(err) } println("Write to:", conn.RemoteAddr(), string(data)) } } }
服务端代码:
package server import ( "net" "git.oschina.net/sdlszjb/unix_socket/errs" "fmt" ) var client_num int = 0 func StartServer1() { l, err := net.Listen("tcp", ":1300") if err != nil { errs.Error_exit(err) } defer l.Close() for { conn, err := l.Accept() if err != nil { errs.Error_print(err) continue } client_num++ fmt.Printf("A new Connection %d.\n", client_num) go handlerConnection(conn) } } func handlerConnection(conn net.Conn) { defer closeConnection(conn) readChannel := make(chan []byte, 1024) writeChannel := make(chan []byte, 1024) go readConnection(conn, readChannel) go writeConnection(conn, writeChannel) for { select { case data := <- readChannel: if string(data) == "bye" { return } writeChannel <- append([]byte("Back"), data...) } } } func writeConnection(conn net.Conn, channel chan []byte) { for { select { case data := <- channel: println("Write:", conn.RemoteAddr().String(), string(data)) _, err := conn.Write(data) if err != nil { errs.Error_print(err) return } } } } func readConnection(conn net.Conn, channel chan []byte) { buffer := make([]byte, 2048) for { n, err := conn.Read(buffer) if err != nil { errs.Error_print(err) channel <- []byte("bye") //这里须要进一步改进! break } println("Recei:", conn.RemoteAddr().String(), string(buffer[:n])) channel <- buffer[:n] } } func closeConnection(conn net.Conn) { conn.Close() client_num-- fmt.Printf("Now, %d connections is alve.\n", client_num) }
相关文章推荐
- Socket编程--基础(基本server/client实现)
- 套接字(socket)编程简单实现server-client聊天程序
- python socket 编程01-实现基本点对点通信
- 【Socket编程】使用C++实现Server端和Client端
- Java网络编程ServerSocket的实现服务器与用户之间的通信的基本步骤
- 一个java网络编程Socket的例子,实现Server与Client聊天
- 通过ClientSocket 与 ServerSocket实现简单的聊天功能.
- Python Socket实现简单TCP Server/client功能示例
- 使用Java实现简单的server/client回显功能的方法介绍
- C# socket 简单实现server呈现client发送信息
- socket通信实现server端和client端互发消息
- Rails实现一个blog项目01-基本功能blog和comment的实现
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能(一)
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能(一)
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能(一)
- [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select
- Delphi 实现传送文件 <TServerSocket/TClientSocket>
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能(一)
- socket 编程 TCP 实现简单聊天功能
- Socket编程:得到本地Server主机IP和对方Client主机IP