|
using System; using System.IO; using System.ComponentModel; using System.Collections; using System.Diagnostics; using System.Net; using System.Net.Sockets; using System.Threading; namespace GPS { /**/ /// <summary> /// MyTcpIpClient 提供在Net TCP_IP 協(xié)議上基于消息的客戶端 /// </summary> public class MyTcpIpClient : System.ComponentModel.Component { private int bufferSize = 2048; private string tcpIpServerIP = "127.0.0.1"; private int tcpIpServerPort = 11000; private Socket ClientSocket = null; private ManualResetEvent connectDone = new ManualResetEvent(false); private ManualResetEvent sendDone = new ManualResetEvent(false); private void ConnectCallback(IAsyncResult ar) { try { Socket client = (Socket)ar.AsyncState; client.EndConnect(ar); } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } finally { connectDone.Set(); } } private void SendCallback(IAsyncResult ar) { try { Socket client = (Socket)ar.AsyncState; int bytesSent = client.EndSend(ar); //Console.WriteLine(bytesSent); } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } finally { sendDone.Set(); } } private void ReceiveCallback(IAsyncResult ar) { Socket handler = null; try { lock (ar) { StateObject state = (StateObject)ar.AsyncState; handler = state.workSocket; int bytesRead = handler.EndReceive(ar); if (bytesRead > 0) { int ReadPiont = 0; while (ReadPiont < bytesRead) { if (state.Cortrol == 0 && ReadPiont < bytesRead) { long bi1 = state.buffer[ReadPiont]; bi1 = (bi1 << 24) & 0xff000000; state.packSize = bi1; ReadPiont++; state.Cortrol = 1; } if (state.Cortrol == 1 && ReadPiont < bytesRead) { long bi1 = state.buffer[ReadPiont]; bi1 = (bi1 << 16) & 0x00ff0000; state.packSize = state.packSize + bi1; ReadPiont++; state.Cortrol = 2; } if (state.Cortrol == 2 && ReadPiont < bytesRead) { long bi1 = state.buffer[ReadPiont]; bi1 = (bi1 << 8) & 0x0000ff00; state.packSize = state.packSize + bi1; ReadPiont++; state.Cortrol = 3; } if (state.Cortrol == 3 && ReadPiont < bytesRead) { long bi1 = state.buffer[ReadPiont]; bi1 = bi1 & 0xff; state.packSize = state.packSize + bi1 - 4; ReadPiont++; state.Cortrol = 4; } if (state.Cortrol == 4 && ReadPiont < bytesRead) { long bi1 = state.buffer[ReadPiont]; bi1 = (bi1 << 24) & 0xff000000; state.residualSize = bi1; ReadPiont++; state.Cortrol = 5; state.packSize -= 1; } if (state.Cortrol == 5 && ReadPiont < bytesRead) { long bi1 = state.buffer[ReadPiont]; bi1 = (bi1 << 16) & 0x00ff0000; state.residualSize = state.residualSize + bi1; ReadPiont++; state.Cortrol = 6; state.packSize -= 1; } if (state.Cortrol == 6 && ReadPiont < bytesRead) { long bi1 = state.buffer[ReadPiont]; bi1 = (bi1 << 8) & 0x0000ff00; state.residualSize = state.residualSize + bi1; ReadPiont++; state.Cortrol = 7; state.packSize -= 1; } if (state.Cortrol == 7 && ReadPiont < bytesRead) { long bi1 = state.buffer[ReadPiont]; bi1 = bi1 & 0xff; state.residualSize = state.residualSize + bi1; state.Datastream.SetLength(0); state.Datastream.Position = 0; ReadPiont++; state.Cortrol = 8; state.packSize -= 1; } if (state.Cortrol == 8 && ReadPiont < bytesRead) { int bi1 = bytesRead - ReadPiont; int bi2 = (int)(state.residualSize - state.Datastream.Length); if (bi1 >= bi2) { state.Datastream.Write(state.buffer, ReadPiont, bi2); ReadPiont += bi2; OnInceptEvent(new InceptEventArgs(state.Datastream, handler)); state.Cortrol = 9; state.packSize -= bi2; } else { state.Datastream.Write(state.buffer, ReadPiont, bi1); ReadPiont += bi1; state.packSize -= bi1; } } if (state.Cortrol == 9 && ReadPiont < bytesRead) { int bi1 = bytesRead - ReadPiont; if (bi1 < state.packSize) { state.packSize = state.packSize - bi1; ReadPiont += bi1; } else { state.Cortrol = 0; ReadPiont += (int)state.packSize; } } } } else { throw (new Exception("讀入的數(shù)據(jù)小于1bit")); } if (handler.Connected == true) { handler.BeginReceive(state.buffer, 0, bufferSize, 0, new AsyncCallback(ReceiveCallback), state); } } } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } } /**/ /// <summary> /// 連接服務(wù)器 /// </summary> public void Conn() { try { ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ipAddress = IPAddress.Parse(tcpIpServerIP); IPEndPoint remoteEP = new IPEndPoint(ipAddress, tcpIpServerPort); connectDone.Reset(); ClientSocket.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), ClientSocket); connectDone.WaitOne(); StateObject state = new StateObject(bufferSize, ClientSocket); ClientSocket.BeginReceive(state.buffer, 0, bufferSize, 0, new AsyncCallback(ReceiveCallback), state); } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } } /**/ /// <summary> /// 斷開連接 /// </summary> public void Close() { try { if (ClientSocket.Connected == true) { ClientSocket.Shutdown(SocketShutdown.Both); ClientSocket.Close(); } } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } } /**/ /// <summary> /// 發(fā)送一個流數(shù)據(jù) /// </summary> /// <param name="Astream">數(shù)據(jù)流</param> public void Send(Stream Astream) { try { if (ClientSocket.Connected == false) { throw (new Exception("沒有連接服務(wù)器不可以發(fā)送信息!")); } Astream.Position = 0; byte[] byteData = new byte[bufferSize]; int bi1 = (int)((Astream.Length + 8) / bufferSize); int bi2 = (int)Astream.Length; if (((Astream.Length + 8) % bufferSize) > 0) { bi1 = bi1 + 1; } bi1 = bi1 * bufferSize; byteData[0] = System.Convert.ToByte(bi1 >> 24); byteData[1] = System.Convert.ToByte((bi1 & 0x00ff0000) >> 16); byteData[2] = System.Convert.ToByte((bi1 & 0x0000ff00) >> 8); byteData[3] = System.Convert.ToByte((bi1 & 0x000000ff)); byteData[4] = System.Convert.ToByte(bi2 >> 24); byteData[5] = System.Convert.ToByte((bi2 & 0x00ff0000) >> 16); byteData[6] = System.Convert.ToByte((bi2 & 0x0000ff00) >> 8); byteData[7] = System.Convert.ToByte((bi2 & 0x000000ff)); int n = Astream.Read(byteData, 8, byteData.Length - 8); while (n > 0) { ClientSocket.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), ClientSocket); sendDone.WaitOne(); byteData = new byte[bufferSize]; n = Astream.Read(byteData, 0, byteData.Length); } } catch (Exception e) { OnErrorEvent(new ErrorEventArgs(e)); } } /**/ /// <summary> /// 構(gòu)造 /// </summary> /// <param name="container">父控件</param> public MyTcpIpClient(System.ComponentModel.IContainer container) { container.Add(this); InitializeComponent(); // // TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼 // } /**/ /// <summary> /// 構(gòu)造 /// </summary> public MyTcpIpClient() { InitializeComponent(); // // TODO: 在 InitializeComponent 調(diào)用后添加任何構(gòu)造函數(shù)代碼 // } //Component Designer generated code; #region Component Designer generated code /**/ /// <summary> /// 設(shè)計器支持所需的方法 - 不要使用代碼編輯器修改 /// 此方法的內(nèi)容。 /// </summary> private void InitializeComponent() { } #endregion /**/ /// <summary> /// 要連接的服務(wù)器IP地址 /// </summary> public string TcpIpServerIP { get { return tcpIpServerIP; } set { tcpIpServerIP = value; } } /**/ /// <summary> /// 要連接的服務(wù)器所使用的端口 /// </summary> public int TcpIpServerPort { get { return tcpIpServerPort; } set { tcpIpServerPort = value; } } /**/ /// <summary> /// 緩沖器大小 /// </summary> public int BufferSize { get { return bufferSize; } set { bufferSize = value; } } /**/ /// <summary> /// 連接的活動狀態(tài) /// </summary> public bool Activ { get { if (ClientSocket == null) { return false; } return ClientSocket.Connected; } } /**/ /// <summary> /// 接收到數(shù)據(jù)引發(fā)的事件 /// </summary> public event InceptEvent Incept; /**/ /// <summary> /// 引發(fā)接收數(shù)據(jù)事件 /// </summary> /// <param name="e">接收數(shù)據(jù)</param> protected virtual void OnInceptEvent(InceptEventArgs e) { if (Incept != null) { Incept(this, e); } } /**/ /// <summary> /// 發(fā)生錯誤引發(fā)的事件 /// </summary> public event ErrorEvent Error; /**/ /// <summary> /// 引發(fā)錯誤事件 /// </summary> /// <param name="e">錯誤數(shù)據(jù)</param> protected virtual void OnErrorEvent(ErrorEventArgs e) { if (Error != null) { Error(this, e); } } } /**/ /// <summary> /// 接收數(shù)據(jù)事件 /// </summary> public class InceptEventArgs : EventArgs { private readonly Stream datastream; private readonly Socket clientSocket; /**/ /// <summary> /// 構(gòu)造 /// </summary> /// <param name="Astream">接收到的數(shù)據(jù)</param> /// <param name="ClientSocket">接收的插座</param> public InceptEventArgs(Stream Astream, Socket ClientSocket) { datastream = Astream; clientSocket = ClientSocket; } /**/ /// <summary> /// 接受的數(shù)據(jù)流 /// </summary> public Stream Astream { get { return datastream; } } /**/ /// <summary> /// 接收的插座 /// </summary> public Socket ClientSocket { get { return clientSocket; } } } /**/ /// <summary> /// 定義接收委托 /// </summary> public delegate void InceptEvent(object sender, InceptEventArgs e); /**/ /// <summary> /// 錯處事件 /// </summary> public class ErrorEventArgs : EventArgs { private readonly Exception error; /**/ /// <summary> /// 構(gòu)造 /// </summary> /// <param name="Error">錯誤信息對象</param> public ErrorEventArgs(Exception Error) { error = Error; } /**/ /// <summary> /// 錯誤信息對象 /// </summary> public Exception Error { get { return error; } } } /**/ /// <summary> /// 錯誤委托 /// </summary> public delegate void ErrorEvent(object sender, ErrorEventArgs e); }
|
|
|
來自: 昵稱15965102 > 《C#》