zoukankan      html  css  js  c++  java
  • 用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);
    
           }
    

      

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

  • 相关阅读:
    在chrome上隐藏video的option按钮
    使用POST请求实现页面的跳转
    Write Sling Servlet using a resource type and selector
    HTL里面使用sling model的时候传参问题
    使用querybuilder做忽略大小写查询的例子
    AEM上的一个图片转换工具
    Oracle的Rman差异增量备份
    HDFS
    使用ROBOCOPY定时增量备份文件
    SOAP详解
  • 原文地址:https://www.cnblogs.com/inline/p/2519729.html
Copyright © 2011-2022 走看看