用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);

       }

  

好了,现在客户端就可以连上服务器了,好了,今天就写到这里了,准备睡觉了,明天继续……

posted @ 2012-05-27 00:51  inline  阅读(7587)  评论(5编辑  收藏  举报