C# TcpClient TcpListener 简单练习01_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C# TcpClient TcpListener 简单练习01

C# TcpClient TcpListener 简单练习01

 2013/7/11 21:14:49  水果饮料  博客园  我要评论(0)
  • 摘要:下面是读《VisualC#.Net网络编程》整理的练习代码。客户端发送命令给服务端,从服务器端获取所有人员的成绩或者指定人员的成绩。命令格式为GET0|1[Name]。0为获取所有人员的成绩,1为获取指定姓名的人员成绩客户端参数为:IP地址端口0|1[Name]。例如client127.0.0.1600001李四服务器端的大体流程为:定义TcpListener对象、打开端口、进入循环开始监听客户端的连接、如果有连接读取数据并进行反馈。客户端的大体流程为:定义TcpClient对象、连接服务器端
  • 标签:C# list client Ten

下面是读《Visual C#.Net 网络编程》整理的练习代码。

客户端发送命令给服务端,从服务器端获取所有人员的成绩或者指定人员的成绩。

命令格式为 GET 0|1 [Name]。0为获取所有人员的成绩,1为获取指定姓名的人员成绩

客户端参数为:IP地址 端口 0|1 [Name]。例如client 127.0.0.1 60000 1 李四

服务器端的大体流程为:定义TcpListener对象、打开端口、进入循环开始监听客户端的连接、如果有连接读取数据并进行反馈。

客户端的大体流程为:定义TcpClient对象、连接服务器端、发送命令、进入循环读取服务器端返回的结果。

代码下载:

服务器端代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.IO;

namespace Server
{
    class Program
    {
        public static string[] arrName = {"李四","王五","赵六"}; 
        public static int[] arrGrade = { 80, 90, 100 };
        static void Main(string[] args)
        {
            Console.WriteLine("正在初始化Socket服务...");
            TcpListener listner;
            try
            {
                //监听端口号为60000
                listner = new TcpListener(60000);
            }
            catch
            {
                Console.WriteLine("创建监听端口失败!");
                return;
            }

            listner.Start(); //开始监听
            Console.WriteLine("Scoket服务初始化完毕,正在等待连接...");
            bool loop = true;
            //进入监听循环,由于没有应用多线程,所以不支持多用户并发访问
            while (loop)
            {
                Socket socket = listner.AcceptSocket();  //监听客户端的连接,线程阻塞,直到有客户端连接为止
                NetworkStream ns = new NetworkStream(socket);    //创建网络流对象
                StreamReader reader = new StreamReader(ns);
                string cmd = reader.ReadLine();  //读取客户端发送过来的命令
                char split = ' ';    //定义命令分隔符,协议类似 GET 0|1 [name],0代表获取所有人员的成绩,1代表获取name的成绩
                string[] arrCmd; //定义一个数组,用于存放解析出来的命令参数
                //解析命令字符串
                arrCmd = cmd.Split(split);
                int paramCount = arrCmd.GetLength(0);
                arrCmd[0] = arrCmd[0].ToUpper();
                if (arrCmd[0] == "GET")
                {
                    if (arrCmd[1] == "0")
                    {
                        for (int i = 0; i < arrName.Length; i++)
                        {
                            string str = String.Format("{0} {1}\r\n", arrName[i], arrGrade[i]);
                            //byte[] res = Encoding.ASCII.GetBytes(str.ToCharArray());
                            byte[] res = Encoding.UTF8.GetBytes(str.ToCharArray());
                            socket.Send(res);   //发送回应给客户端
                        }
                    }
                    else if (arrCmd[1] == "1")
                    {
                        if (arrCmd.GetLength(0) != 3)
                        {
                            string str = "命令行错误,没有包含要查询的姓名" + Environment.NewLine;
                            byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());
                            socket.Send(res);
                        }
                        else
                        {
                            bool founded = false;
                            arrCmd[2] = arrCmd[2].Trim();
                            for (int i = 0; i < arrName.Length; i++)
                            {
                                if (arrName[i] == arrCmd[2])
                                {
                                    string str = String.Format("{0} {1}\r\n", arrName[i], arrGrade[i]);
                                    byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());
                                    socket.Send(res);
                                    founded = true;
                                    break;
                                }
                            }

                            if (founded == false)
                            {
                                string str = String.Format("没有找到姓名为【{0}】的成绩!{1}", arrCmd[2], Environment.NewLine);
                                byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());
                                socket.Send(res);
                            }
                        }
                    }
                }
                else
                {
                    string str = String.Format("命令错误,当前命令头是{0},命令头应该为GET{1}", arrCmd[0], Environment.NewLine);
                    byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());
                    socket.Send(res);
                }

                //发送一个空行,客户端以此来确定,数据接收完毕,客户端退出
                string endFlag = Environment.NewLine;
                byte[] endRes = System.Text.Encoding.UTF8.GetBytes(endFlag.ToCharArray());
                socket.Send(endRes);
            }
        }
    }
}

客户端代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpClient client = null;
            
            //判断参数是否准确,参数应为:服务器IP 端口(60000)选项(0或1) [姓名](如果选项为1)
            if (args.Length != 3 && args.Length != 4)
            {
                Console.WriteLine(args.Length);
                Console.WriteLine("参数错误!");
                return;
            }

            string strHost = args[0].Trim();    //服务器地址
            ushort uiPort = Convert.ToUInt16(args[1]);  //服务器端口

            string strCmd; //定义命令行
            if (args.Length == 3)
            {
                //取所有人员的成绩
                strCmd = String.Format("GET {0}{1}", args[2], Environment.NewLine);
            }
            else
            {
                strCmd = String.Format("GET {0} {1}{2}", args[2], args[3], Environment.NewLine);
            }

            Console.WriteLine("开始初始化客户端...");
            Console.WriteLine(String.Format("开始连接到 {0}:{1}...", strHost, uiPort));
            try
            {
                client = new TcpClient(strHost, uiPort);
            }
            catch
            {
                Console.WriteLine("不能连接到服务器端!");
                return;
            }

            //初始化网络输入输出流
            NetworkStream ns = client.GetStream();
            System.IO.StreamReader sr = new System.IO.StreamReader(ns);
            Console.WriteLine(String.Format("已经连接到 {0}:{1}...", strHost, uiPort));

            string result;
            Console.WriteLine(strCmd);
            byte[] cmd = System.Text.Encoding.UTF8.GetBytes(strCmd.ToCharArray());

            //发送请求通讯指令
            ns.Write(cmd, 0, cmd.Length);
            //获取服务器端的反馈
            Console.WriteLine("结果为:");
            while (true)
            {
                //接收结果
                result = sr.ReadLine();
                if (result == "")
                {
                    break;
                }
                Console.WriteLine(result);
            }

            Console.WriteLine("正在关闭连接...");
            //断开连接
            client.Close();
            Console.WriteLine("按任意键退出");
            Console.ReadLine();
        }
    }
}

 

发表评论
用户名: 匿名