马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

简单的Socket通讯

[复制链接]
查看4503 | 回复2 | 2014-8-15 10:19:22 | 显示全部楼层 |阅读模式
直接上代码,一看就懂,一看就会。
[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);
            }
        }



C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
sherlockhomles | 2014-8-15 10:22:23 | 显示全部楼层
lldxy | 2014-8-18 14:55:09 | 显示全部楼层
此代码的接收部分成功读取,就是要注意每次收到的数据包是2048字长,还要学TCP基础啊
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则