面对着这么多的聊天工具,我们每个人都会用到好几种,因此我们在基于学习的基础上也做了一个简单的控制台聊天工具。我们在写这个应用程序时要用到一些协议来约束,沟通这个过程,即网络通信协议。
协议:协商,妥协,商议,定议。沟通的语言。
经常用到的几种协议: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;////// 做一个读取的方法,用来接收用户的要求或命令/// 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;////// 做一个读取的方法,用来读取服务器的回应/// 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得到充分的利用。
加油加油!!!