ibcadmin 发表于 2014-8-15 10:19:22

简单的Socket通讯

直接上代码,一看就懂,一看就会。 /// <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;
                //存放之前收到的字节数据的数组
                byte[] recvBytes = new byte;
                //缓冲区
                byte[] bufferBytes = new byte;
                //每次接收到的字节数
                int bytes;
                //待接收的字节数
                int iLeftBytes;
                while (true)
                {
                  //接收数据
                  bytes = socket.Receive(bufferBytes, bufferBytes.Length, 0);//从服务器端接受返回信息   
                  if (bytes > 0)
                  {
                        //接收到数据!开始保存
                        totalBytes = new byte;
                        //复制旧数据
                        Array.Copy(recvBytes, totalBytes, recvBytes.Length);
                        //复制本次接收到的数据
                        Array.Copy(bufferBytes, 0, totalBytes, recvBytes.Length, bytes);
                        //将合并后的数据,保存为旧数据,留给下次循环使用
                        recvBytes = new byte;
                        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);
            }
      }


sherlockhomles 发表于 2014-8-15 10:22:23

:@:@:@:@:@:@

lldxy 发表于 2014-8-18 14:55:09

此代码的接收部分成功读取,就是要注意每次收到的数据包是2048字长,还要学TCP基础啊
页: [1]
查看完整版本: 简单的Socket通讯