zoukankan      html  css  js  c++  java
  • TCP跟UDP乱侃

    原文链接http://www.cnblogs.com/xiaoEight/archive/2013/02/19/2917814.html

    由于最近在恶补关于网络编程的东西,所以决定做个简单的记录。之前做过的东西,虽然有涉及具体的功能实现,但是没有深层系统的去了解过各层各个部分,只是浅尝辄止,实现功能就停了。今天就了解了下传输层,传输层(Transport Layer)是OSI中最重要, 最关键的一层,是唯一负责总体的数据传输和数据控制的一层.传输层提供端到端的交换数据的机制,检查分组编号与次序。

         先贴上一张对于程序员的网络分层图:

                                                           

         传输层的协议主要有两个比较重要的协议:

         1.用户数据报协议UDP (User Datagram Protocol)
         2.传输控制协议TCP (Transmission Control Protocol)

         首先说说我自己对这俩协议的简单理解:

          UDP可以类似看作单发或群发短信(无接收报告的那种 - -!~),只用知道对方的号码(IP地址跟要发送程序进程的端口号)不用事先征求就可以跟对方发。UDP的优点就是消耗小,UDP将网络数据流量压缩成数据报的形式,每一个数据报用8个字节(8 X 8位=64位)描述报头信息,剩余字节包含具体的传输数据。相比TCP报头变小了就好比短信比电话要便宜一样。但得到好处的同时在另一方面,UDP提供的服务是不可靠的,而且不能保证数据报的顺序。在此还有一点,UDP可分为广播组播。

          

          TCP就如同打电话,第一步就是要拨通对方电话,然后别人确认接你的电话。第二步接通电话之后你还要说声喂,然后得到对面的确认回复一声喂,确认连接上。最后就可以通信了。通信完成后,挂电话要是相互知会通知一声。TCP是一种面向连接的,可靠的,基于字节流的传输层通信协议,相比UDP而言可靠性更高,并且基于字节流使得数据是有序的。

          

          由报文的格式图不难看到两个报文的异同,TCP比UDP而言更为复杂。对于两者的使用而言,暂时用比较熟悉的.net稍微提及一下(后面如果有机会我会尝试使用C++在linux环境下对其OS他环境进行通信),在网络编程上微软封装好了,所以也就导致我开篇提到的问题,可能程序员知道怎么用但是不知道原理是什么,甚至都不知道到底是怎么来通信的。(不知道是幸运还是不幸,仁者见仁智者见智吧)。

          关于UDP

       a.发送   

    复制代码
            private UdpClient sendUdpClient;
            private bool isAnonymous;
            private void udpSend(object sender, EventArgs e)
            {
               
                // 选择发送模式
                if (isAnonymous)
                {
                    // 匿名模式(套接字绑定的端口由系统随机分配)
                    sendUdpClient = new UdpClient(0);
                }
                else
                {
                    // 实名模式(套接字绑定到本地指定的端口)
                    IPAddress localIp = IPAddress.Parse("localip!!!!");
                    IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse("localPort!!!!"));
                    sendUdpClient = new UdpClient(localIpEndPoint);
                }
    
                Thread sendThread = new Thread(SendMessage);
                sendThread.Start("the message for  send!!!");
            }
    
            // 发送消息方法
            private void SendMessage(object obj)
            {
                string message = (string)obj;
                byte[] sendbytes = Encoding.Unicode.GetBytes(message);
                IPAddress remoteIp = IPAddress.Parse("sendtoIp!!!!");
                IPEndPoint remoteIpEndPoint = new IPEndPoint(remoteIp, int.Parse("sendtoport!!!!"));
                sendUdpClient.Send(sendbytes, sendbytes.Length, remoteIpEndPoint);
              
                sendUdpClient.Close();
    
            }
    复制代码

        b.接收

    复制代码
            private UdpClient receiveUpdClient;
     
            // 接受消息
            private void udpReceive(object sender, EventArgs e)
            {
                // 创建接收套接字
                IPAddress localIp = IPAddress.Parse(“localIp!!! ");
                IPEndPoint localIpEndPoint = new IPEndPoint(localIp, int.Parse("localPort!!!"));
                receiveUpdClient = new UdpClient(localIpEndPoint);
    
    
                Thread receiveThread = new Thread(ReceiveMessage);
                receiveThread.Start();
            }
    
            // 接收消息方法
            private void ReceiveMessage()
            {
                IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                while (true)
                {
                    try
                    {
                        // 关闭receiveUdpClient时此时会产生异常
                        byte[] receiveBytes = receiveUpdClient.Receive(ref remoteIpEndPoint);
    
                        string message = Encoding.Unicode.GetString(receiveBytes);
    
                    }
                    catch
                    {
                        break;
                    }
                }
            }
    复制代码


               关于TCP

       a.服务器端接受开始监听

    复制代码
            private TcpListener tcpLister;
            private BinaryReader reader; 
            private BinaryWriter writer;

    // 开始监听 private void tcpListerStart(object sender, EventArgs e) { tcpLister = new TcpListener(ipaddress,Port); tcpLister.Start(); // 启动一个线程来接受请求 Thread acceptThread =new Thread(acceptClientConnect); acceptThread.Start(); } // 接受请求 private void acceptClientConnect() { Thread.Sleep(1000); try { //等待连接 tcpClient = tcpLister.AcceptTcpClient(); if (tcpLister != null) { networkStream = tcpClient.GetStream(); reader = new BinaryReader(networkStream); writer = new BinaryWriter(networkStream); } } catch { // 停止监听; Thread.Sleep(1000); } }
    复制代码

       b.客户端连接服务器

    复制代码
            private BinaryReader reader; 
            private BinaryWriter writer;
    // 连接服务器方法,建立连接的过程 private void ConnectToServer() { try { //对IP端口进行检查 //.......................... IPAddress ipaddress = IPAddress.Parse("serverIp"); tcpClient = new TcpClient(); tcpClient.Connect(ipaddress, int.Parse("serverPort")); // 延时操作 Thread.Sleep(1000); if (tcpClient != null) { networkStream = tcpClient.GetStream(); reader = new BinaryReader(networkStream); writer =new BinaryWriter(networkStream); } } catch { Thread.Sleep(1000); } }
    复制代码

       c.客户端发送消息

    复制代码
            private BinaryWriter writer;

    // 发送消息 private void clientTcpSend(object sender, EventArgs e) { Thread sendThread = new Thread(SendMessage); sendThread.Start("the message for send!!!"); } private void SendMessage(object state) { try { writer.Write(state.ToString()); Thread.Sleep(5000); writer.Flush(); } catch { if (reader != null) { reader.Close(); } if (writer != null) { writer.Close(); } if (tcpClient != null) { tcpClient.Close(); } //"断开了连接" } }
    复制代码

             最后

             码了这些代码之后,小Eight许久没有码代码,考虑后续尝试下完成一个可用的具体小例子。由于这次的内容有点小多也是有点小乱,写到最后自己也凌乱了,可能会出现错误或者不对的地方,希望大家给予指正。后面还会的对UDP的组播和广播,TCP的详细使用进行进一步的了解,一步一步的迈向网络的“深渊”。

  • 相关阅读:
    带色彩恢复的多尺度视网膜增强算法(MSRCR)的原理、实现及应用。
    索引图像的那些事啊
    调整图像 自动对比度、自动色阶算法
    图像处理界双线性插值算法的优化
    共享收集的图像处理方面的一些资源和网站。
    Wellner 自适应阈值二值化算法
    基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理、实现及效果
    VB6.0用GDI+保存图像为BMP\JPG\PNG\GIF格式终结版。
    关于.net中获取图像缩略图的函数GetThumbnailImage的一些认识。
    限制对比度自适应直方图均衡化算法原理、实现及效果
  • 原文地址:https://www.cnblogs.com/yzl050819/p/6201572.html
Copyright © 2011-2022 走看看