zoukankan      html  css  js  c++  java
  • Socket入门Demo

    一、简单介绍下Socket编程    申明:.net网络编程

      1)什么是Socket编程?

        Socket编程就是常说的网络通讯编程,套接字编程。一般应用于软件聊天通讯,以及软件与硬件之间的通讯。

        

        通熟易懂点就是下边这个意思:

      2)需要用套接字编程,那么套接字有那几个成员?

        流式套接字(SOCK_STREAM):提供了一种可靠的、面向连接的双向数据传输服务。实现了数据无差错,无重复的发送,内设流量控制,被传输的数据被看做无记录边界的字节流

        数据报套接字(SOCK_DGRAM):提供了一种无连接、不可靠的双向数据传输服务。数据以独立的包形式被发送,并且保留了记录边界,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端数据按发送顺序接收。

        原始套接字(SOCK_RAW):该套接字允许对较低层协议(如IP或ICMP)进行直接访问。

        说了这么多,其实无非想告诉我们第一种就是Tcp使用在下图层级的第四层,第二种Udp使用同样在第四层,第三种底层开发使用在第三层网络层,也就是刚刚入门不需要使用,开发IP协议使用。这个就和网络七层协议有关了。这个层级关系如下图

      3)如何在代码实现?通信的基本步骤是什么?

     

        服务器端:

        第一步:创建一个用于监听连接的Socket对像;

        第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;

        第三步:用socket对像的Bind()方法绑定EndPoint;

        第四步:用socket对像的Listen()方法开始监听;

        第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;

        第六步:通信结束后一定记得关闭socket;

        客户端:

        第一步:建立一个Socket对像;

        第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;

        第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;

        第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;

        第五步:用socket对像的Receive()方法接受服务器发来的信息 ;

        第六步:通信结束后一定记得关闭socket;

    二、代码实现篇

      1)创建项目。添加类库,将类库的输出类型改成输出型类改为控制台应用程序。如下图

      2)前两个类库是tcp协议下的服务端与客户端的实例。第三个类库则为udp协议下的通讯。

      3)TCP通讯中,设置前两个类库为启动项,启动。按顺序输入访问。

      4)启动测试UDP如下图

      5)源码下载: http://pan.baidu.com/s/1c2cq8hE

      

      总结:1)很简单在Udp链接中,我们必须保持发送端口与接受端口一致,因为只有这样才能从客户端发送给服务端接收,也就是”127.0.0.1:2313<<<大家是否“。再返回到客户端信息。

         2)IPEndPoint相关信息详见:http://www.cnblogs.com/ssor/archive/2009/08/28/1555904.html

         3)多线程并行编程:http://www.cnblogs.com/ChineseMoonGod/p/5341253.html

         4)最后代码讲解示例下:

    static void Main(string[] args)
            {
                Socket socket = null;
                try
                {
                    ushort localPort, remotePort;
                    IPAddress address;
                    InitMsg();
    
    
                    do
                    {
                        Show("请输入本地端口号:", false);
                        //.TryParse(Read(), out localPort)把输入的强转,然后赋值给参数localPort
                        if (ushort.TryParse(Read(), out localPort) == false)
                        {
                            Show("端口号无效");
                        }
                    } while (localPort == 0);
    
                    do
                    {
                        Show("请输入远程IP:", false);
    
                        if (IPAddress.TryParse(Read(), out address) == false)
                        {
                            Show("远程IP无效");
                        }
                    } while (address == null);
    
                    do
                    {
                        Show("请输入远程端口号:", false);
                        if (ushort.TryParse(Read(), out remotePort) == false)
                        {
                            Show("端口号无效");
                        }
                    } while (remotePort == 0);
    
                    var localPoint = new IPEndPoint(0, localPort);
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                    socket.Bind(localPoint);
    
                    // 启动新线程负责接收数据
                    ThreadPool.QueueUserWorkItem(OnReceive, socket);
                    Show("服务准备就绪");
    
                    do
                    {
                        try
                        {
                            Show("请输入消息:", false);
                            var msg = Read();
                            if (string.IsNullOrEmpty(msg))
                            {
                                msg = GetMsgRandom();
                            }
                            var sendBuffer = Encoding.Default.GetBytes(msg);
                            // 发送数据
                            EndPoint sendPoint = new IPEndPoint(address, remotePort);
                            var sendLength = socket.SendTo(sendBuffer, sendPoint);
                            if (sendLength != sendBuffer.Length)
                            {
                                Show("发送失败");
                            }
                            else
                            {
                                Show(string.Format("{0}:{1,-5} >>> {2}", localPoint.Address, localPoint.Port, msg));
                            }
                        }
                        catch (SocketException exception)
                        {
                            Show("");
                            Show(exception.Message);
                        }
                        catch (Exception exception)
                        {
                            Show("");
                            Show(exception.Message);
                            Thread.Sleep(100);
                        }
                    } while (true);
                }
                catch (Exception exception)
                {
                    Show(exception.Message);
                }
                finally
                {
                    if (socket != null)
                    {
                        CloseSocket(socket);
                    }
                }
            }

                初始化信息的集合(可发动的内容)

                接收输入的本地端口

                IPEndPoint  本地端口,IP

                多线程实现接收数据

                主机向服务器发动数据,一个信息流。一个IPEndPoint就可以了

                显示传输数据

  • 相关阅读:
    [组合数取模] 方法汇总
    机房收费系统(VB.NET)——存储过程实战
    Remove Duplicates from Sorted Array
    Android ListFragment实例Demo(自己定义适配器)
    混合模式程序集是针对“v1.1.4322”版的执行时生成的,在没有配置其它信息的情况下,无法在 4.0 执行时中载入该程序集。
    小编接地气——第六届中国云计算大会攻略Q&amp;A
    有统计的百度分享
    Yii CGridView 基本使用(三)关联表相关字段搜索
    扯谈网络编程之Tcp SYN flood洪水攻击
    多平台响应键盘事件!(适用于Cocos2dx 3.0 alpha以上版本号)
  • 原文地址:https://www.cnblogs.com/wenlong512/p/7389502.html
Copyright © 2011-2022 走看看