正文

Socket Visual 2005调试通过代码经典例子2007-02-08 10:19:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/Csharpsky/23159.html

分享到:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Text;
using System.IO;
namespace SocketRun
{
    // State object for receiving data from remote device.
    public class StateObject
    {
        // Client socket.
        public Socket workSocket = null;
        // Size of receive buffer.
        public const int BufferSize = 256;
        // Receive buffer.
        public byte[] buffer = new byte[BufferSize];
        // Received data string.
        public StringBuilder sb = new StringBuilder();
    }

    public partial class _Default : System.Web.UI.Page
    {
        // ManualResetEvent instances signal completion
        private static ManualResetEvent allDone = new ManualResetEvent(false);
        private static ManualResetEvent sendDone = new ManualResetEvent(false);
        private static ManualResetEvent receiveDone = new ManualResetEvent(false);
        // Received data string.
        private StringBuilder sb = new StringBuilder();
         //取得预保存的文件名  
        private string fileName = @"E:\WebLib\ReadXML\TestResults.txt";
        protected void Page_Load(object sender, EventArgs e)
        {
            string host = @"219.238.192.100";
            int port = 34200;
            string Request = "kw=日本人&page=1";
            #region  测试数据
            //string host = @"http://www.um114.com";
            //int port = 8000;

            //Socket tempSocket = new Socket(IPAddress.Parse(host).AddressFamily,
            // SocketType.Stream,
            // ProtocolType.Tcp);
            //tempSocket.Connect(IPAddress.Parse(host), port);
            //if (tempSocket.Connected)
            //    this.lbInfo.Text = "Ok";

            #endregion
            try
            {
                StartClient(host, port, Request);
            }
            catch (Exception ex)
            {
                this.lbInfo.Text = ex.Message;
            }

        }
        /// <summary>
        /// 发起一次异步连接尝试
        /// </summary>
        /// <param name="ar"></param>
        private void ConnectCallback(IAsyncResult ar)
        {
            allDone.Set();
            Socket s = (Socket)ar.AsyncState;
            s.EndConnect(ar);
        }
        /// <summary>
        /// 发送函数
        /// </summary>
        /// <param name="client"></param>
        /// <param name="data"></param>
        private void Send(Socket client, string data)
        {
            // Convert the string data to byte data using Default encoding.
            byte[] byteData = Encoding.Default.GetBytes(data);
            // Begin sending the data to the remote device.
            client.BeginSend(byteData, 0, byteData.Length, 0,
                new AsyncCallback(SendCallback), client);
        }
        /// <summary>
        /// 接受函数
        /// </summary>
        /// <param name="client"></param>
        private void Receive(Socket client)
        {
            try
            {
                // Create the state object.
                StateObject state = new StateObject();
                state.workSocket = client;
                // Begin receiving the data from the remote device.
                client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReceiveCallback), state);
            }
            catch
            {
            }
        }
        /// <summary>
        /// 发送异步
        /// </summary>
        /// <param name="ar"></param>
        private void SendCallback(IAsyncResult ar)
        {
            try
            {
                // Retrieve the socket from the state object.
                Socket client = (Socket)ar.AsyncState;

                // Complete sending the data to the remote device.
                int bytesSent = client.EndSend(ar);

                // Signal that all bytes have been sent.
                sendDone.Set();
            }
            catch
            {
            }
        }

        /// <summary>
        /// 接受异步
        /// </summary>
        /// <param name="ar"></param>
        private void ReceiveCallback(IAsyncResult ar)
        {
          
            // The response from the remote device.
            string response = string.Empty;
            try
            {
                // Retrieve the state object and the client socket
                // from the asynchronous state object.
                StateObject state = (StateObject)ar.AsyncState;
                Socket client = state.workSocket;
                // Read data from the remote device.
                int bytesRead = client.EndReceive(ar);
                if (bytesRead > 0)
                {
                    // There might be more data, so store the data received so far.
                    state.sb.Append(Encoding.Default.GetString(state.buffer, 0, bytesRead));

                    // Get the rest of the data.
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                        new AsyncCallback(ReceiveCallback), state);
                }
                else
                {
                    // All the data has arrived; put it in response.
                    if (state.sb.Length > 1)
                    {
                        response = state.sb.ToString();
                    }
                    //将所读取的字符串转换为字节数组  
                    byte[] content = Encoding.Default.GetBytes(response);
                    try
                    {
                        //创建文件流对象实例  
                        FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                        //写入文件  
                        fs.Write(content, 0, content.Length);
                        fs.Close();
                        fs.Dispose();
                    }
                    catch (Exception ex)
                    {
                        this.lbInfo.Text = "文件创建/写入错误:" + ex.Message;
                    }
                    // Signal that all bytes have been received.
                    receiveDone.Set();
                }
            }
            catch
            {
            }
        }

        /// <summary>
        /// Asynchronous connect using the host name
        /// </summary>
        /// <param name="host"></param>
        /// <param name="port"></param>
        private Socket ConnectSocket(string host, int port)
        {
            Socket s = null;
            #region 测试数据
            //IPHostEntry hostEntry = null;
            //try
            //{
            //    hostEntry = Dns.GetHostEntry(host);
            //}
            //catch (Exception ex)
            //{
            //    this.lbInfo.Text = ex.Message;
            //    return null;
            //}
            //IPAddress address = hostEntry.AddressList[0];
            //IPEndPoint ipe = new IPEndPoint(address, port);
            #endregion
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(host), port);
            Socket tempSocket = new Socket(ipe.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            allDone.Reset();
            try
            {
                tempSocket.BeginConnect(ipe, new AsyncCallback(ConnectCallback), tempSocket);
            }
            catch (Exception ex)
            {
                this.lbInfo.Text = ex.Message;
            }
            // wait here until the connect finishes. 
            // The callback sets allDone.
            allDone.WaitOne();
            if (tempSocket.Connected)
            {
                s = tempSocket;
            }
            return s;
        }
        /// <summary>
        /// This method requests the home page content for the specified server.
        /// </summary>
        /// <param name="server"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        private void StartClient(string server, int port, string Request)
        {
            try
            {
                // Create a socket connection with the specified server and port.
                Socket s = ConnectSocket(server, port);
                if (s == null)
                    return;//("Connection failed");
                //设置为非阻塞状态  
                s.Blocking = false;
                //  //向主机发送请求 
                // Send test data to the remote device.
                Send(s, Request);
                sendDone.WaitOne();
                // Receive the response from the remote device.
                Receive(s);
                receiveDone.WaitOne();
                s.Blocking = true;
                //禁用Socket  
                s.Shutdown(SocketShutdown.Both);
                //关闭Socket  
                s.Close();
            }
            catch (Exception e)
            {
            }
        }

    }
}

阅读(4068) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册