http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 3747|回复: 4

[其他] socket 编程问题

[复制链接]
发表于 2016-1-31 18:35:26 | 显示全部楼层 |阅读模式
如下的服务端与客户端代码,为何客户端按钮要点击 2 次,才能发送信息,如何修改代码才能使之正常

/////////////////////////////////////////
服务端

private void button_Accept_Click(object sender, EventArgs e)
        {
            MyInitSocket();
        }

private void MyInitSocket()
        {
            mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            string strHostName = Dns.GetHostName();
            IPHostEntry myIPHostEntry = Dns.GetHostEntry(strHostName);
            IPAddress myIPAddress = myIPHostEntry.AddressList[1];
            int port = 9999;
            IPEndPoint localEP = new IPEndPoint(myIPAddress, port);
            mySocket.Bind(localEP);
            mySocket.Listen(5);



            ParameterizedThreadStart ptsAccept = new ParameterizedThreadStart(MyAcceptThreadFunc);
            Thread MyAcceptThread = new Thread(ptsAccept);
            MyAcceptThread.Start();


        }

        private void MyAcceptThreadFunc(object obj)
        {
            while (true)
            {
                Socket myAcceptSocket = mySocket.Accept();
                ParameterizedThreadStart ptsAnswer = new ParameterizedThreadStart(MyAnswerThreadFunc);
                Thread MyAnswerThread = new Thread(ptsAnswer);
                MyAnswerThread.Start(myAcceptSocket);
            }
        }

        private void MyAnswerThreadFunc(object obj)
        {
            Socket myAnswerSocket = obj as Socket;
            NetworkStream ns = new NetworkStream(myAnswerSocket);
            while(true)
            {
                byte[] bufferTemp = new byte[512];
                byte[] bufferRecv = new byte[512];
                int nReadAlready = ns.Read(bufferRecv, 0, 512);
                //假设现在读取到的数据大于512字节,那么一定读满512个字节
                do
                {
                    bufferTemp = bufferRecv;
                    nReadAlready = ns.Read(bufferRecv, 0, 512);
                    bufferTemp.Concat(bufferRecv);//不知道内存是否够大

                } while (nReadAlready == 512);
                string strReadAlready = Encoding.Default.GetString(bufferTemp);


                //byte[] datasize = new byte[4];
                //ns.Read(datasize, 0, 4);
                //int size = BitConverter.ToInt32(datasize, 0);
                //byte[] message = new byte[size];
                //int dataleft = size;
                //int start = 0;
                //while(dataleft>0)
                //{
                //    int recv = ns.Read(message, start, dataleft);
                //    start += recv;
                //    dataleft -= recv;
                //}

                //string strReadAlready = Encoding.Default.GetString(message);

                MyShowText(strReadAlready);
            }
        }





////////////////////////////////////////////////////////////////////////////////////
客户端

        Socket mySocket;

        private void MyConnectServer()
        {
            mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress myIp = IPAddress.Parse("192.168.0.100");
            int port = 9999;
            mySocket.Connect(myIp, port);
            if(mySocket.Connected)
            {
                string strConnectInfo = mySocket.RemoteEndPoint.ToString();
                label_status.Text = "已连接" + strConnectInfo;
            }
        }


        //发送信息的按钮事件
        private void button_Send_Click(object sender, EventArgs e)
        {
            string strSend = textBox_Send.Text;
            byte[] btSend = Encoding.Default.GetBytes(strSend);
            NetworkStream ns = new NetworkStream(mySocket);
            ns.Write(btSend, 0, btSend.Length);
        }

        private void button_Connect_Click(object sender, EventArgs e)
        {
            MyConnectServer();
        }



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2016-1-31 22:13:43 | 显示全部楼层
发表于 2016-2-1 10:23:56 | 显示全部楼层
我只是路过打酱油的。
发表于 2016-2-1 11:24:22 | 显示全部楼层
发表于 2016-2-3 15:27:26 | 显示全部楼层
没看太懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-23 18:28

© 2014-2021

快速回复 返回顶部 返回列表