首先是类文件
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Xml;
namespace Common
{
public class SocketWbHelper
{
[DllImport(@"D:\delphi_test.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern bool Submit(int iMainType, byte[] pchar_in, int len_in, byte[] pchar_out, ref int len_out);
private static object obj = new object();
/// <summary>
/// Socket发送数据处理
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static Socket ConnectSvr()
{
string sip = System.Configuration.ConfigurationManager.AppSettings["SockIP"];
IPAddress ip = IPAddress.Parse(sip);
IPEndPoint ipe = new IPEndPoint(ip, 35232);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(ipe);
return c;
}
/// <summary>
/// Socket发送数据处理
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static Socket CloseConnectSvr(Socket c)
{
c.Shutdown(SocketShutdown.Both);
c.Close();
return c;
}
/// <summary>
/// Socket发送数据处理
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static List<string> SendMsg(string str, Socket c)
{
lock (obj)
{
byte[] bsHead = BitConverter.GetBytes(2875566949);
byte[] bsData = Encoding.Default.GetBytes(str);
byte[] bsDataLength = BitConverter.GetBytes(bsData.Length);
byte[] bsNull = BitConverter.GetBytes(0);
byte[] bsSend = new byte[bsData.Length + 20];
bsHead.CopyTo(bsSend, 0);
bsDataLength.CopyTo(bsSend, 4);
bsNull.CopyTo(bsSend, 8);
bsNull.CopyTo(bsSend, 12);
bsNull.CopyTo(bsSend, 16);
bsData.CopyTo(bsSend, 20);
List<string> list = new List<string>();
byte[] recvBytes = new byte[20];
byte[] recvBytesEnd = null;
StringBuilder recvStrSb = new StringBuilder();
try
{
c.Send(bsSend, bsSend.Length, 0);
int bytes = 0;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);
if (bytes > 0)
{
//获取到返回信息的长度
int lenth = BitConverter.ToInt32(recvBytes, 4);
recvBytesEnd = new byte[lenth];
bytes = c.Receive(recvBytesEnd, recvBytesEnd.Length, 0);
recvStrSb.Append(Encoding.Default.GetString(recvBytesEnd, 0, bytes));
}
list.Add("0");
list.Add(recvStrSb.ToString());
}
catch { list.Add("-10001"); }
return list;
}
}
/// <summary>
/// Socket发送数据处理
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static string MsgSend(string str,out int iResult,string sywid)
{
iResult = 0;
byte[] bsSend = Encoding.Default.GetBytes(str);
List<string> list = new List<string>();
StringBuilder recvStrSb = new StringBuilder();
byte[] outpchar = new byte[20000];
int out_len = 20000;
bool bResult = false;
try
{
bResult = Submit(Convert.ToInt32(sywid), bsSend, bsSend.Length, outpchar, ref out_len);
}
catch (Exception ex)
{
iResult = -1;
return "失败Submit:" + ex.Message;
}
try
{
if (bResult == true)
{
recvStrSb.Append(Encoding.Default.GetString(outpchar, 0, out_len));
}
else
{
iResult = -2;
recvStrSb.Append(Encoding.Default.GetString(outpchar, 0, out_len));
recvStrSb.Append(",接口调用失败!out_len:" + out_len);
}
}
catch (Exception ex)
{
iResult = -3;
return "失败recvStrSb:out_len," + out_len + "::" + ex.Message;
}
return recvStrSb.ToString();
}
/// <summary>
/// 获取XML对象
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static XmlDocument GetXMLDoc(string str)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(str.ToString());
return xmlDoc;
}
}
}
以下是调用方法
private static ReturnDto SendSortInfo(string sRevMobile, string iRevProductid, string sAccount, int iTime=0, string sName = "桔子", string sywid = "1")
{
var sSendData = "<?xml version=\"1.0\" encoding=\"GB2312\"?><xml><sRevMobile>" + sRevMobile +
"</sRevMobile><iRevProductid>" + iRevProductid +
"</iRevProductid><iTime>" + iTime +
"</iTime><sAccount>" + sAccount +
"</sAccount><sName>" + sName +
"</sName></xml>";
var model = new ReturnDto();
int iInterfaceResult = 0;
string listResult = SocketWbHelper.MsgSend(sSendData, out iInterfaceResult, sywid);
if (iInterfaceResult < 0)
{//查询异常
if (iInterfaceResult == -2)
{
//接口返回错误信息
XmlDocument docValue = new XmlDocument();
docValue.LoadXml(listResult);
model.msg = docValue.SelectNodes("//Msg")[0].InnerText;
}
else
{
model.msg = listResult;
}
model.code = -1;
return model;
}
else
{
var docValue = new XmlDocument();
docValue.LoadXml(listResult);
model.msg = docValue.SelectNodes("//Msg")[0].InnerText;
}
model.code = model.msg.Trim().ToLower().Equals("ok") ? 1 : -2;
return model;
}
注意:
1.DLL的路径要用绝对路径,如果要用相对路径的话,自己要放在对的位置。
2.这个demo用的是 XML 参数传递方式,传入和返回都是XML。
3.在调用的地方,可根据自己的需求写,这只是个我用的方法。