用socket来写一个聊天软件吧(一)
首先看网络通信的前提:
网络通信还是要基于协议的规范,从一个通信软件到另一个通信软件,要从应用层、传输层、网络层、物理层。IIS服务器上运用到了应用层上http协议,传输层上的tcp协议。聊天软件上以QQ和FQ为代表类型,QQ是一种广域网的聊天软件,它是一种基于面象连接的TCP协议,FQ(飞秋)局域网聊天软件应用到了基于非连接的UDP(登陆广播)和TCP(消息单播文件单传)。
网络连接的宗旨无非要resqust(请求)和response(响应)。连接到哪儿,谁接收?那就要靠IP地址来找到对应的主机(host),发送或请求通信的软件在哪里?那就要看我们的端口来找到它了。
在传输层,遵循那种规范?ipv4,ipv6,传输方式,面象连接TCP还是非连接UDP。
好了,现在不多说了,那就做个简单的类似QQ聊天软件来理解socket内部原理吧。
QQ聊天软件是一个面象连接的软件,它有一个服务器中转站,我们都是用它的客户端。客户端发送消息到服务器,服务器记录下聊天记录并转发给另一个客户端。
首先来理一个思路:
第一步,先实现客户给服务器发消息:
1、创建一个服务端 Server
1.1、在服务器上用一个socket绑定一个端点IPEndPoint(它包含ip地址和商品号)。
1.2、用这个socket在服务器端不断的监听来自客户端的请求,如果接到一个请求就创建一个负责通信的socket 。
1.3、用这个连接的socket收发消息。
2、客户端 Client
2.1、在客户端用一个socket负责和服务器端握手并建立连接连接。
来写代码吧:
//构建一个负责监听的socket,它有三个枚举类型的参数,分别定义了连接方式、传输流、传输协议,我这里是(ipv4,字节流,面象连接) Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Parse(txtServer.Text); IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); //把一个IP地址和对应的商品绑定到一个socket,监听…… socket.Bind(point); //这里的Listen方法来开始监听,一个规定只能处理一个请求的队列 socket.Listen(10); ShowMsg("开始监听");
//由于服务器端要不断的要接收来自客户端请求( socket.Accept()),所以要创建一个线程来执行它 Thread th = new Thread(ResMsg); th.IsBackground = true; //start方法只能传一个object th.Start(socket); //这个方法ResMsg //监听用户 void ResMsg(object o) { //由于要接收多个用户的请求,每来一个用户就创建一个负责连接的socket while (true) { Socket socket = o as Socket; Socket consocket = socket.Accept(); string conneip = consocket.RemoteEndPoint.ToString(); ShowMsg("\r\n" + conneip + "连接成功"); } }
客户端
Thread th; Socket socket; private void List_Load(object sender, EventArgs e) { //创建连接的socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定服务器的ip和端口号 IPAddress ip = IPAddress.Parse("192.168.1.102"); IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(50000)); //连接 socket.Connect(point); }
好了,现在客户端就可以连上服务器了,好了,今天就写到这里了,准备睡觉了,明天继续……