下面是读《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 = {"李四","王五","赵六"};
        , ,  };
        static void Main(string[] args)
        {
            Console.WriteLine("正在初始化Socket服务...");
            TcpListener listner;
            try
            {
                //监听端口号为60000
                listner = );
            }
            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);
                );
                arrCmd[] = arrCmd[].ToUpper();
                ] == "GET")
                {
                    ] == ")
                    {
                        ; 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);   //发送回应给客户端
                        }
                    }
                    ] == ")
                    {
                        ) != )
                        {
                            string str = "命令行错误,没有包含要查询的姓名" + Environment.NewLine;
                            byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());
                            socket.Send(res);
                        }
                        else
                        {
                            bool founded = false;
                            arrCmd[] = arrCmd[].Trim();
                            ; i < arrName.Length; i++)
                            {
                                ])
                                {
                                    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)
                            {
                                ], Environment.NewLine);
                                byte[] res = System.Text.Encoding.UTF8.GetBytes(str.ToCharArray());
                                socket.Send(res);
                            }
                        }
                    }
                }
                else
                {
                    ], 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)
             && args.Length != )
            {
                Console.WriteLine(args.Length);
                Console.WriteLine("参数错误!");
                return;
            }

            ].Trim();    //服务器地址
            ]);  //服务器端口

            string strCmd; //定义命令行
            )
            {
                //取所有人员的成绩
                strCmd = String.Format(], Environment.NewLine);
            }
            else
            {
                strCmd = String.Format(], args[], 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, , cmd.Length);
            //获取服务器端的反馈
            Console.WriteLine("结果为:");
            while (true)
            {
                //接收结果
                result = sr.ReadLine();
                if (result == "")
                {
                    break;
                }
                Console.WriteLine(result);
            }

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

C# TcpClient TcpListener 简单练习01的更多相关文章

  1. C#编程 socket编程之TcpClient,TcpListener,UdpClient

    应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务.这些协议类建立在 System.Net.So ...

  2. MySQL基本简单操作01

    MySQL基本简单操作 学会了安装Docker,那么就将它利用起来.(/滑稽脸) 之前想学习Mysql(Windows下配置真麻烦),学会了Docker就方便了,直接使用Docker创建一个Mysql ...

  3. Lucene.Net简单例子-01

    前面已经简单介绍了Lucene.Net,下面来看一个实际的例子 1.1 引用必要的bll文件.这里不再介绍(Lucene.Net  PanGu  PanGu.HightLight  PanGu.Luc ...

  4. Robberies(简单的01背包 HDU2955)

    Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. HDU 2602 (简单的01背包) Bone Collector

    很标准的01背包问题 //#define LOCAL #include <algorithm> #include <cstdio> #include <cstring&g ...

  6. python之简单入门01

     python简单的介绍使用: 一.个人感觉写Python程序,最好用的工具就是pycharm了,自动补全功能可以满足大多数不太喜欢记忆的人群: 安装pycharm之前应该先安装python解释器,目 ...

  7. poj3624 简单的01背包问题

    问题描述: 总共有N种宝石供挑选,宝石i的重量为Wi,吸引力为Di,只可以用一次.Bessie最多可负担的宝石手镯总重量为M.给出N,M,Wi,Di,求M. 非常标准的01背包问题.使用了优化的一维数 ...

  8. Python中的装饰器的简单介绍01

    一. 装饰器是什么? 简单来说,装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问. 二.装饰器语法 (1)无参数装 ...

  9. JQuery的一些简单操作01

    一.JQuery的隐藏和显示效果 1.hide/show/toggle hide隐藏效果,hide(1000)括号里面跟毫秒,show显示效果同样后面括号可以有数值,toggle开关按钮,交替作用隐藏 ...

随机推荐

  1. 在ubunut下使用pycharm和eclipse进行python远程调试

    我比较喜欢Pycharm,因为这个是JetBrains公司出的python IDE工具,该公司下的java IDE工具--IDEA,无论从界面还是操作上都甩eclipse几条街,但项目组里有些人使用e ...

  2. SharePoint 2013 开发——Provider-hosted APP准备工作

    博客地址:http://blog.csdn.net/FoxDave 后续的内容我们来一步一步开发一个SharePoint Porvider-hosted APP,本篇主要介绍一些准备工作. Sha ...

  3. Linux内核-模块编译和安装

    我安装Ubuntu的时候是没有安装源码的,在没有安装源码前 /usr/src/ 目录下是只有两个包含内核的头文件的文件夹的: 我的内核版本是: 所以接下来就是先安装内核源码: 执行后,/usr/src ...

  4. Nginx SSL配置过程

    1. 在godaddy购买了UCC SSL(最多5个域名)的SSL证书 2. 设置证书 -- 管理 -- 3. 需要制作证书申请CSR文件(在线工具制作或者openssl命令制作),保存CSR和key ...

  5. json_decode 与 json_encode 的区别

    1.json_decode对JSON格式的字符串进行编码 2.json_encode对变量进行 JSON 编码 3.unset()是注销定义的变量 4.urlencode()函数原理就是首先把中文字符 ...

  6. task2

    1. 邮件修改Mailtemplatereportfieldlink带<>的都改翻译${MAWBTask} 2.测试发邮件 3.找出能做成模版的所有地方,改成模版,复杂的地方记录下来

  7. php大力力 [018节]如何联系大力力

    有事儿就注册博客园,给我发 博客园站内的 短消息呗,唉,没有人联系我呀,啦啦啦,爱我爱我,快点爱我 2015-08-26 php大力力018.如何联系大力力

  8. LINQ学习之旅(六)

    Insert/Update/Delete操作 插入(Insert) 1.简单形式 说明:new一个对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges()提 ...

  9. Redis - hash类型操作

    hash 类型操作设置操作:hset:    hset key filed value        创建指定key的filed-value名值对 hsetnx:    hsetnx key file ...

  10. aspx页面图片用作html中img的url

    背景:如果无法直接访问保存图片的服务器,我们可以先制作一个aspx页面用来接受服务器发送过来的图片,然后html页面请求aspx页面.对图片服务器起一定的缓冲保护作用,预防对黑客攻击造成危害. 注意: ...