下面是读《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(); } } }