面对着这么多的聊天工具,我们每个人都会用到好几种,因此我们在基于学习的基础上也做了一个简单的控制台聊天工具。我们在写这个应用程序时要用到一些协议来约束,沟通这个过程,即网络通信协议。
协议:协商,妥协,商议,定议。沟通的语言。
经常用到的几种协议: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);
P.S.线程:应用程序执行的路径
Thread
对于CPU来说,在同一时刻之内只能运行一个程序。
一定有一个主线程。可能会有多个子线程。
使用多线程的优势在于节省时间资源。让CPU得到充分的利用。
加油加油!!!
转载于:https://blog.51cto.com/7607889/1298709