Go语言-使用去程的Echo服务器

废话不说了,直接上代码.里面注释应该很清楚了

/**
 * Created with IntelliJ IDEA.
 * User: Admin
 * Date: 12-8-30
 * Time: 下午1:27
 * To change this template use File | Settings | File Templates.
 */
package main

import (
	"fmt"
	"net"
	"os"
	"io"
)

type tcpPacket struct {
	data string;
	con net.Conn;
}

func main() {
	fmt.Println("启动服务器... (Ctrl-C 停止)");
	var (
		host = "0.0.0.0";
		port = "12345";
		laddr = host + ":" + port;
	)
	//创建data_cn程道,所有的客户端连接都会通过data_cn程道将消息发送到handle去程处理
	data_ch := make(chan tcpPacket);
	//实施listen去程,将所有客户端发来的消息,发送给data_cn程道
	go listen(data_ch, laddr);
	//死循环
	for {
		//当程道data_ch收到消息时,实施handle去程
		go handle( <- data_ch );
	}
}

/*
    监听端口
 */
func listen(data_ch chan tcpPacket, laddr string) {
	fmt.Println("开始监听");
	lis, error := net.Listen("tcp", laddr);
	//函数结束后,监听关闭
	defer lis.Close();
	if error != nil {
		fmt.Printf("监听出错: %s\n", error );
		os.Exit(1);
	}
	//死循环
	for {
		//获取连接和错误信息
		con, error := lis.Accept();
		if error != nil { fmt.Printf("接收到意外数据: %s\n", error); os.Exit(2); }
		//实施listen_socket去程
		go listen_socket(data_ch, con);
	}
}

/*
	处理单独连接
 */
func listen_socket(data_ch chan tcpPacket, con net.Conn) {
	fmt.Printf("[新连接]参数: %s \n", con.RemoteAddr());
	data   := make([]byte, 1024);
	defer con.Close();
	for {
		n, error := con.Read(data);
		switch error {
		case nil:
			packet := tcpPacket{ string(data[0:n]), con };
			data_ch <- packet;
		case io.EOF:
			fmt.Printf("警告!连接已断开: %s \n", error);
			return;
		default:
			fmt.Printf("错误!收到意外的数据 : %s \n", error);
			return;
		}
	}
}

/*
	处理客户端连接发送来的消息
 */
func handle(packet tcpPacket) {
	// 读取客户端连接信息
	addr := packet.con.RemoteAddr();
	fmt.Printf("从 %s 收到数据: '%s'\n", addr.String(), packet.data);
	// 将接受到的数据发送回客户端(echo)
	packet.con.Write([]byte(packet.data));
}

转载于:https://my.oschina.net/nalan/blog/75626

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值