• 如何为 Windows Phone 创建和使用 TCP 套接字客户端应用程序【msdn】


    1.连接到 TCP 套接字服务器

    使用 System.Net.Sockets API 创建一个套接字并连接到服务器。为了清楚起见,System.Net.Sockets API 的调用被封装在 SocketClient 类中。

    定义头(使用 _socket 变量存储 Socket 对象。_clientDone 变量是一个 ManualResetEvent,用于协调通过Sockets API 调用的异步调用):

    // Cached Socket object that will be used by each call for the lifetime of this class
            Socket _socket = null;
    
            // Signaling object used to notify when an asynchronous operation is completed
            static ManualResetEvent _clientDone = new ManualResetEvent(false);
    
            // Define a timeout in milliseconds for each asynchronous call. If a response is not received within this 
            // timeout period, the call is aborted.
            const int TIMEOUT_MILLISECONDS = 5000;
    
            // The maximum size of the data buffer to use with the asynchronous socket methods
            const int MAX_BUFFER_SIZE = 2048;

    在 SocketClient.cs 中,添加以下方法,该方法将创建 TCP 套接字,并向服务器发送异步连接请求。此操作的响应将由内联回调进行处理

      public string Connect(string hostName, int portNumber)
            {
                string result = string.Empty;
    
                DnsEndPoint hostEntry = new DnsEndPoint(hostName, portNumber);
    
                _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                
                // Create a SocketAsyncEventArgs object to be used in the connection request
                SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                socketEventArg.RemoteEndPoint = hostEntry;
    
                socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
                {
                    result = e.SocketError.ToString();
    
                    _clientDone.Set();
                });
    
                _clientDone.Reset();
    
                _socket.ConnectAsync(socketEventArg);
    _clientDone.WaitOne(TIMEOUT_MILLISECONDS); return result; }

    2.向 TCP 套接字服务器发送数据

    public string Send(string data)
            {
                string response = "Operation Timeout";
    
                // We are re-using the _socket object that was initialized in the Connect method
                if (_socket != null)
                {
                    // Create SocketAsyncEventArgs context object
                    SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
    
                    // Set properties on context object
                    socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
                    socketEventArg.UserToken = null;
    
                    // Inline event handler for the Completed event.
                    // Note: This event handler was implemented inline in order to make this method self-contained.
                    socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
                    {
                        response = e.SocketError.ToString();
    
                        // Unblock the UI thread
                        _clientDone.Set();
                    });
    
                    // Add the data to be sent into the buffer
                    byte[] payload = Encoding.UTF8.GetBytes(data);
                    socketEventArg.SetBuffer(payload, 0, payload.Length);
    
                    // Sets the state of the event to nonsignaled, causing threads to block
                    _clientDone.Reset();
    
                    // Make an asynchronous Send request over the socket
                    _socket.SendAsync(socketEventArg);
    
                    // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
                    // If no response comes back within this time then proceed
                    _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
                }
                else
                {
                    response = "Socket is not initialized";
                }
    
                return response;
            }

    3.接收来自 TCP 套接字服务器的数据

       public string Receive()
            {
                string response = "Operation Timeout";
    
                // We are receiving over an established socket connection
                if (_socket != null)
                {
                    // Create SocketAsyncEventArgs context object
                    SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
                    socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
    
                    // Setup the buffer to receive the data
                    socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
    
                    // Inline event handler for the Completed event.
                    // Note: This even handler was implemented inline in order to make this method self-contained.
                    socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
                    {
                        if (e.SocketError == SocketError.Success)
                        {
                            // Retrieve the data from the buffer
                            response = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred);
                            response = response.Trim('\0');
                        }
                        else
                        {
                            response = e.SocketError.ToString();
                        }
    
                        _clientDone.Set();
                    });
    
                    // Sets the state of the event to nonsignaled, causing threads to block
                    _clientDone.Reset();
    
                    // Make an asynchronous Receive request over the socket
                    _socket.ReceiveAsync(socketEventArg);
    
                    // Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
                    // If no response comes back within this time then proceed
                    _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
                }
                else
                {
                    response = "Socket is not initialized";
                }
    
                return response;
            }
    
            /// <summary>
            /// Closes the Socket connection and releases all associated resources
            /// </summary>
            public void Close()
            {
                if (_socket != null)
                {
                    _socket.Close();
                }
            }
  • 相关阅读:
    数组相关常见的三种错误
    JMeter连接MYSQL数据库并进行操作详解
    JMeter实现动态关联——两个接口在不同的线程组
    Android : kernel中添加虚拟文件节点
    Android O : 系统原生锁屏密码位数限制及自动检查
    Android O : DNS列表获取及IPv4/IPv6优先级修改
    Android 打印调用栈的方法
    Android TV : 系统分区配置及增加私有分区
    Android TV : Mstar平台Audio Path及声音曲线配置
    Android TV : Mstar平台 GPIO 调试
  • 原文地址:https://www.cnblogs.com/Yukang1989/p/2891565.html
Copyright © 2020-2023  润新知