C# TcpClient TcpListener 简单练习01
下面是读《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的更多相关文章
- C#编程 socket编程之TcpClient,TcpListener,UdpClient
应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制协议 (TCP) 和用户数据文报协议 (UDP) 服务.这些协议类建立在 System.Net.So ...
- MySQL基本简单操作01
MySQL基本简单操作 学会了安装Docker,那么就将它利用起来.(/滑稽脸) 之前想学习Mysql(Windows下配置真麻烦),学会了Docker就方便了,直接使用Docker创建一个Mysql ...
- Lucene.Net简单例子-01
前面已经简单介绍了Lucene.Net,下面来看一个实际的例子 1.1 引用必要的bll文件.这里不再介绍(Lucene.Net PanGu PanGu.HightLight PanGu.Luc ...
- Robberies(简单的01背包 HDU2955)
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 2602 (简单的01背包) Bone Collector
很标准的01背包问题 //#define LOCAL #include <algorithm> #include <cstdio> #include <cstring&g ...
- python之简单入门01
python简单的介绍使用: 一.个人感觉写Python程序,最好用的工具就是pycharm了,自动补全功能可以满足大多数不太喜欢记忆的人群: 安装pycharm之前应该先安装python解释器,目 ...
- poj3624 简单的01背包问题
问题描述: 总共有N种宝石供挑选,宝石i的重量为Wi,吸引力为Di,只可以用一次.Bessie最多可负担的宝石手镯总重量为M.给出N,M,Wi,Di,求M. 非常标准的01背包问题.使用了优化的一维数 ...
- Python中的装饰器的简单介绍01
一. 装饰器是什么? 简单来说,装饰器其实也就是一个函数,一个用来包装函数的函数,返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问. 二.装饰器语法 (1)无参数装 ...
- JQuery的一些简单操作01
一.JQuery的隐藏和显示效果 1.hide/show/toggle hide隐藏效果,hide(1000)括号里面跟毫秒,show显示效果同样后面括号可以有数值,toggle开关按钮,交替作用隐藏 ...
随机推荐
- 2013年9月份第1周51Aspx源码发布详情
大型B2B家具门户网源码 2013-9-6 [VS2008]功能描述: 1.门户信息管理 安全取数据即使数据库连接中断不会报错 2.稳定性 每句代码经过3次以上检查.此网站还在运营3年了,没有出过问 ...
- self进行weak化
创建block匿名函数之前一般需要对self进行weak化,否则造成循环引用无法释放controller: __weak MyController *weakSelf = self 或者 __weak ...
- Python闭包实现的计数器
#!/usr/bin/env python #coding=utf-8 def generate_counter(): CNT = [0] def add_one(): CNT[0] = CNT[0] ...
- (转)Sqlite中INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用
原文:http://www.cnblogs.com/peida/archive/2008/11/29/1343832.html Sqlite中INTEGER PRIMARY KEY AUTOINCRE ...
- 2016-1-9 Quartz框架的学习,写字板demo
一:自定义view .h文件中代码如下 #import <UIKit/UIKit.h> @interface ZLpaintView : UIView @property(nonatomi ...
- js中的apply调用
今天看了阮一锋老师的一篇文章,感觉很明了对闭包的理解,尤其是文章中的apply的介绍 apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象. ...
- BZOJ 2200 道路与航线
好厉害呀这道题,有种豁然开朗的感觉.... 按拓扑顺序跑最短路. 然后注意细节,像WA的代码犯下的错是一笔带过没有丝毫考虑的...然而就是错了. 考试的时候一定要拍啊. #include<ios ...
- BZOJ 3687 简单题
bitset维护某个和是否存在. bit<<x:所有子集的和+x. #include<iostream> #include<cstdio> #include< ...
- PHP中使用mysql处理结果集
一.从结果集中将记录取出 mysql_fetch_row($result); 从结果集中取得一行作为枚举数组 mysql_fetch_row($result mysql_fetch_assoc( ...
- ecpilise引入Maven项目目录不正常,无JRE,无Maven Dependencies
原因是我的eclipse默认open perspective是java ee,改成java就恢复正常了.