面对着这么多的聊天工具,我们每个人都会用到好几种,因此我们在基于学习的基础上也做了一个简单的控制台聊天工具。我们在写这个应用程序时要用到一些协议来约束,沟通这个过程,即网络通信协议

协议:协商,妥协,商议,定议。沟通的语言。

经常用到的几种协议:TCP/IP协议、UDP协议、HTTP协议、FTP协议......

**TCP/IP协议(传输控制协议/因特网互联协议)是Internet最基本的协议,也是目前最常用的一种通信协议。具有很强的灵活性,支持任意规模的网络,几乎可连接所有服务器和工作站。这种协议就像打电话一样,是一对一的,一台服务器链接一个客户端,连接上了才能发送消息,所以使用这种协议的时候我们都会先问服务器三个问题:

1.你活着没?我活着呢。
2.你忙不忙?我不忙。
3.我将要发送数据了啊?发吧。

这三个问题俗称为TCP/IP的三次握手,完成以后,真正的数据才开始发送,这种协议可以确保数据的准确性和完整性。

下面来一个具体的程序:简单的聊天工具,在其上可以自由交流,发信息

第一步:先建立服务器

class Program
{
static void Main(string[] args)
{
//生成一个TcpListener类的对象,将端口传进去,相当于理发店在哪栋楼的哪一层,listener是理发店
TcpListener listener = new TcpListener(10003);
//理发店开门了
listener.Start();
//利用listener得到一个TcpClient类的对象server,理发店中的服务人员
TcpClient server = listener.AcceptTcpClient();
ns = server.GetStream();
//创建一个写入的流,通过ns这个管道传递
StreamWriter sw = new StreamWriter(ns);
//将读取的过程做成一个线程,让读取和写入分开来,互相不影响
Thread t = new Thread(new ThreadStart(Read));
t.Start();
while (true)
{
Console.Write("我说:");
string s = Console.ReadLine();
if (s=="退出")
{
break;
}
sw.WriteLine(s);
sw.Flush();
}
sw.Close();
ns.Close();
server.Close();
listener.Stop();
}
//能在Main方法中被访问,设置管道中开始时什么都没有
static NetworkStream ns = null;
/// <summary>
/// 做一个读取的方法,用来接收用户的要求或命令
/// </summary>
static void Read()
{
Console.WriteLine("我开始读取了。。。哈哈哈");
//创建一个读取的流,从管道中读取用户的要求
StreamReader sr = new StreamReader(ns);
while (true)
{
string s = sr.ReadLine();
if (s == null)
{
break;
}
Console.WriteLine("客户端说:"+s);
}
sr.Close();
}
}

第二步:建立客户端

class Program
{
static void Main(string[] args)
{
////创建一个客户端,“127.0.0.1”是服务器地址,10003是接入的端口(相当于理发店在哪栋楼的哪一层)
TcpClient client = new TcpClient("127.0.0.1", 10003);
//建立管道,让客户端可以和服务器互相沟通
ns = client.GetStream();
//创建一个写入流,在管道中写入用户的要求和命令
StreamWriter sw = new StreamWriter(ns);
//将读取的过程做成一个线程,让读取和写入分开来,互相不影响
Thread t = new Thread(new ThreadStart(Read));
//启动线程
t.Start();
while (true)
{
Console.Write("我说:");
string s = Console.ReadLine();
sw.WriteLine(s);
sw.Flush();
}
sw.Close();
ns.Close();
client.Close();
}
//能在Main方法中被访问,设置管道中开始时什么都没有
static NetworkStream ns = null;
/// <summary>
/// 做一个读取的方法,用来读取服务器的回应
/// </summary>
static void Read()
{
//创建一个读取的流,从管道中读取服务器的回应
StreamReader sr = new StreamReader(ns);
while (true)
{
string response = sr.ReadLine();
Console.WriteLine("服务器说:" + response);
}
sr.Close();
}
}

用这个应用程序我们就可以实现在控制台上的自由交流了

**UDP协议用户数据报协议):提供面向事务的简单不可靠信息传送服务。这种协议像广播一样,不关心对方是否收到。所以效率高,但是准确性和完整性不太满意。

下面来看一个简单的例子:

第一步:建立服务器

Console.WriteLine("可以开始读取啦。。。");//广播
//创建一个UdpClient类的对象服务器,将端口放入其中
UdpClient server = new UdpClient(10001);
//定义一个终结点
IPEndPoint remote =null;
//接收客户端发来的消息
byte[] bs = server.Receive(ref remote);
Encoding encoding = Encoding.GetEncoding("gb2312");
string s = encoding.GetString(bs);
Console.WriteLine(s);
Console.WriteLine(remote);

第二步:建立服务器

Console.WriteLine("开始传送了。。。。。。");
//创建一个UdpClient类的客户端对象,连接到服务器上
UdpClient client = new UdpClient("127.0.0.1", 10001);
//客户端要发送的数据
string s="I 老虎 Y!";
//设置编码格式
Encoding encoding=Encoding.GetEncoding("gb2312");
//根据要发送的字符串得到一个byte数组
byte[]bs=encoding.GetBytes(s);
//将数据发送过去
int a=client.Send(bs,bs.Length);

在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

P.S.线程:应用程序执行的路径

Thread
对于CPU来说,在同一时刻之内只能运行一个程序。

一定有一个主线程。可能会有多个子线程。
使用多线程的优势在于节省时间资源。让CPU得到充分的利用。

加油加油!!!