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