jack_muyi 2017-08-28 02:23 采纳率: 0%
浏览 2247

C# socket物理断线重连,报错。

代码如下,提示错误 1 非静态的字段、方法或属性“com.tchuin.channel.IChannel.Start()”要求对象引用 C:\Users\Administrator\Desktop\FTU代码--断线重连\源代码\Maintenance\Channel\network\ChannelTcpIpClient.cs 185 13 Channel
错误。
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;

namespace com.tchuin.channel.network
{
///************************************************************************
//* 原不可断线重连的Socket的类
class ChannelTcpIpClient : IChannel
{
#region IChannel 成员

    public event Action<byte[]> ReadByteArrayEvent;
    public event Action<byte[]> WroteByteArrayEvent;

    bool IChannel.IsStart
    {
        get
        {
            if (mSocket == null)
                return false;
            else
                return mSocket.Connected;
        }
    }

    void IChannel.Start()
    {
        mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint iep = new IPEndPoint(mServerIpAddress, mServerPort);
        mSocket.BeginConnect(iep, ConnectCallBack, mSocket);
    }

    void IChannel.Stop()
    {
        if (mSocket != null)
        {
            if (mSocket.Connected)
                mSocket.Shutdown(SocketShutdown.Both);
            mSocket.Close();
            mSocket = null;
        }
    }

    int IChannel.Write(byte[] buffer)
    {
        if (mSocket == null)
            return -1;

        if (mSocket.Connected)
        {
            int wroteLen = mSocket.Send(buffer);
            byte[] temp = new byte[wroteLen];
            Array.Copy(buffer, temp, temp.Length);
            if (WroteByteArrayEvent != null)
                WroteByteArrayEvent(temp);
            return wroteLen;
        }
        else
            return -1;
    }

    int IChannel.Read(byte[] buffer)
    {
        int readLen = mSocket.Receive(buffer);
        byte[] temp = new byte[readLen];
        Array.Copy(buffer, temp, temp.Length);
        if (ReadByteArrayEvent != null)
            ReadByteArrayEvent(buffer);
        return readLen;
    }


    #endregion


    public ChannelTcpIpClient(IPAddress address, int port)
    {
        mDataBuffer = new Byte[1024 * 4];
        mServerIpAddress = address;
        mServerPort = port;
    }

    private void RecieveCallBack(IAsyncResult result)
    {
        Socket client = (Socket)result.AsyncState;
        if (client == null)
            return;
        if (client.Connected)
        {
            int recvByteCount;
            try
            {
                recvByteCount = client.EndReceive(result);
                if (recvByteCount > 0)
                {
                    byte[] buffer = new byte[recvByteCount];
                    Array.Copy(mDataBuffer, buffer, buffer.Length);
                    if (socketDataArrival != null)
                    {
                        socketDataArrival(buffer);
                    }
                }
                else
                {
                    if (mSocket.Connected)
                    {
                        if (socketDisconnected != null)
                        {
                            socketDisconnected();
                            return;
                        }
                    }
                }
                //继续监听下一次的数据接收
                client.BeginReceive(mDataBuffer, 0, mDataBuffer.Length, SocketFlags.None, RecieveCallBack, client);
            }
            catch (SocketException ex)
            {
                if (socketDisconnected != null)
                {
                    socketDisconnected();
                    return;
                }
                else
                {
                    MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    ((IChannel)this).Stop();
                }

            }
        }
    }

    private void ConnectCallBack(IAsyncResult result)
    {
        Socket client = (Socket)result.AsyncState;
        try
        {
            client.EndConnect(result);
            client.BeginReceive(mDataBuffer, 0, mDataBuffer.Length, SocketFlags.None, RecieveCallBack, client);
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message);

        }
        finally
        {
            TimeoutObject.Set();
        }
       /*
        if (client == null)
            return;
        if (client.Connected)
        {
            client.EndConnect(result);
            client.BeginReceive(mDataBuffer, 0, mDataBuffer.Length, SocketFlags.None, RecieveCallBack, client);
        }
        */
    }

    private static void socketDataArrivalHandler(byte[] data)
    {}

    private static void socketDisconnectedHandler()
    {
        Reconnect();
    }

    private static void Reconnect()
    {
        //关闭socket
        mSocket.Shutdown(SocketShutdown.Both);

        mSocket.Disconnect(true);

        mSocket.Close();

        //创建Socket
        IChannel.Start();
    }

    //委托
    private delegate void delSocketDataArrival(byte[] data);
    static delSocketDataArrival socketDataArrival = socketDataArrivalHandler;

    private delegate void delSocketDisconnected();
    static delSocketDisconnected socketDisconnected = socketDisconnectedHandler;

    private static Socket mSocket = null;
    private static byte[] mDataBuffer = null;
    private static int mServerPort;
    private static IPAddress mServerIpAddress;
    private static ManualResetEvent TimeoutObject = new ManualResetEvent(false);
}
  • 写回答

1条回答 默认 最新

  • dabocaiqq 2018-06-02 15:09
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题