直接上代码,一看就懂,一看就会。[C#] 纯文本查看 复制代码 /// <summary>
/// 请求时(支持所有外联平台为XML格式报文的接口):请求银行并接收银行返回的数据
/// </summary>
/// <param name="postData">XML内容</param>
/// <returns>银行返回的数据</returns>
public static string SendSocket(string postData)
{
//连接已经在监听的服务端
Socket socket; //定义socket
string recvStr = ""; //接收字符串
try
{
int port = 12345;
string host = "127.0.0.1";
///创建终结点EndPoint
IPAddress ip = IPAddress.Parse(host);
//把ip和端口转化为IPEndpoint实例
IPEndPoint ipe = new IPEndPoint(ip, port);
///创建socket并连接到服务器
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket
socket.Connect(ipe);//连接到服务器
byte[] bs = Encoding.GetEncoding("GB18030").GetBytes(postData);//把字符串编码为字节
if (socket == null || socket.Connected == false)
{
LogHelper.g_Logger.ErrorFormat("建行 socket为null,或者未连接到远程计算机");
throw new ArgumentException("socket为null,或者未连接到远程计算机");
}
if (bs == null || bs.Length == 0)
{
LogHelper.g_Logger.ErrorFormat("建行 socket buffer为null ,或者长度为 0");
throw new ArgumentException("buffer为null ,或者长度为 0");
}
///向服务器发送信息
socket.Send(bs, bs.Length, 0);
///接受从服务器返回的信息
//存放所有字节数据的数组
byte[] totalBytes = new byte[0];
//存放之前收到的字节数据的数组
byte[] recvBytes = new byte[0];
//缓冲区
byte[] bufferBytes = new byte[2048];
//每次接收到的字节数
int bytes;
//待接收的字节数
int iLeftBytes;
while (true)
{
//接收数据
bytes = socket.Receive(bufferBytes, bufferBytes.Length, 0);//从服务器端接受返回信息
if (bytes > 0)
{
//接收到数据!开始保存
totalBytes = new byte[recvBytes.Length + bytes];
//复制旧数据
Array.Copy(recvBytes, totalBytes, recvBytes.Length);
//复制本次接收到的数据
Array.Copy(bufferBytes, 0, totalBytes, recvBytes.Length, bytes);
//将合并后的数据,保存为旧数据,留给下次循环使用
recvBytes = new byte[totalBytes.Length];
Array.Copy(totalBytes, recvBytes, totalBytes.Length);
}
Thread.Sleep(50);
iLeftBytes = socket.Available;
if (0 == iLeftBytes)
{
//已收到全部数据,退出读取循环
break;
}
}
recvStr = Encoding.GetEncoding("GB18030").GetString(totalBytes, 0, totalBytes.Count());
return recvStr;
}
catch (Exception ex)
{
LogHelper.g_Logger.ErrorFormat("建行 socket 异常:" + ex.Message);
throw new Exception("批量提现异常,错误原因:" + ex.Message);
}
}
|