You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Mesnac.Basic
{
public class SocketClient
{
public static Socket m_clientSocket;
private byte[] m_receiveBuffer = new byte[1024];
private IPEndPoint remoteEndPoint;
public string receiveStr;
public bool connFlag = false;
public static string serverIp
{
get
{
return ConfigurationManager.AppSettings["ListenServerIP"];
}
}
public static string serverPort
{
get
{
return ConfigurationManager.AppSettings["Port"];
}
}
public SocketClient()
{
remoteEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), Convert.ToInt32(serverPort));
m_clientSocket = new Socket(remoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
}
public bool Connect()
{
bool reC = false;
try
{
IAsyncResult result = m_clientSocket.BeginConnect(remoteEndPoint, null, null);
result.AsyncWaitHandle.WaitOne(500);
//m_clientSocket.Connect(remoteEndPoint);
if (m_clientSocket.Connected)
{
reC = true;
connFlag = true;
m_clientSocket.BeginReceive(m_receiveBuffer, 0, m_receiveBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
}
}
catch
{
}
finally
{
}
return reC;
}
private void ReceiveCallBack(IAsyncResult ar)
{
try
{
int REnd = m_clientSocket.EndReceive(ar);
string strReceiveData = Encoding.UTF8.GetString(m_receiveBuffer, 0, REnd);
this.HandleMessage(strReceiveData);
if (string.IsNullOrEmpty(strReceiveData))
{
connFlag = false;
}
else
{
m_clientSocket.BeginReceive(m_receiveBuffer, 0, m_receiveBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
}
//m_clientSocket.BeginReceive(m_receiveBuffer, 0, m_receiveBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null);
}
catch (Exception ex)
{
connFlag = false;
}
}
/// <summary>
/// 处理接收到的数据
/// </summary>
private void HandleMessage(string message)
{
message = message.Replace("/0", "");
if (!string.IsNullOrEmpty(message))
{
receiveStr = message;
}
}
/// <summary>
/// 客户端尝试重连服务器端
/// </summary>
public void ReConnect()
{
try
{
if (m_clientSocket != null && m_clientSocket.Connected)
{
m_clientSocket.Close();
m_clientSocket.Disconnect(false);
m_clientSocket = null;
}
m_clientSocket.Close();
remoteEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), Convert.ToInt32(serverPort));
m_clientSocket = new Socket(remoteEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
this.Connect();
}
catch (System.Exception)
{
//logBundle.DBLog(App.FormName, 1, "网络已经断开", "");
}
}
}
}