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开关按钮,交替作用隐藏 ...
随机推荐
- iOS开发之单例设计模式(完整正确版本)
单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...
- Mac下为我们开发的App制作gif动画演示(不仅仅针对开发者,想做gif图片的也可参考)
趁着工作不忙,就闲着倒腾自己的事情,把自己写的一个完整App<丁丁印记>整理了一番,总结其中用到的技术和实现的功能,并想把一些用到的技术分享给各位工友们,因为我自学iOS开发得益于大家的分 ...
- Hibernate xml格式和anno格式 mappedby
xml配置的时候多对一 一对多的外键可以配置一样,但是anno不太好弄,多这边配完了,一那边用个mappedby"“自己在对方的属性”就可以,不然要建一张中间表.xml的mappedby因为 ...
- 毕向东Java基础:day09_3-4
day09-03 1.匿名内部类的使用场景. Body{ //身体 包括心脏 private class XinZhang{ // 心脏 可以body的成员变量.如果不想被别人访问,加上priv ...
- 团队SCRUM会议(第一次)
每日Scrum:第一天 会议时间:4.30.晚八点半 会议地点:基础教学楼一楼大厅 小组成员:郭庆樑,林彦汝,张金 团队PM:张金 会议进程 • 首先我们讨论了实验第一个Sprint1要实现的功能,我 ...
- SQL中让某一字段更新时自动加1
update 表 set 字段名=字段名+1 where ....
- HTML的定位属性
position 用于定义一个元素是否absolute(绝对),relative(相对),static(静态),或者fixed(固定) top层距离顶点纵坐标的距离 left层距离顶点横坐标的距 ...
- 安装webmin
wget http://nchc.dl.sourceforge.net/project/webadmin/webmin/1.740/webmin-1.740.tar.gz 解压缩文件,命令是:tar ...
- linux邮件服务器postfix配置实例
linux邮件服务器postfix配置实例(超级详细!!!) 2013-03-13 13:30:21 标签:邮件服务器 linux 1. 系统安装:1)centos4.3 选上MAIL组件里的全部.2 ...
- 7、C#基础整理(类)
String类 概念:是一个class类型的类,里面包含许多处理字符串的方法和属性 1.length方法. 例: string s = "hello"; Console.Write ...