首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C# C/S 客户端不能准确接收服务器发来的第二次数据

2013-09-17 
C# C/S客户端不能正确接收服务器发来的第二次数据在登陆过程中客户端新建了个线程来和服务器会话 private

C# C/S 客户端不能正确接收服务器发来的第二次数据
在登陆过程中客户端新建了个线程来和服务器会话
 private void 登陆_Load(object sender, EventArgs e)
        {
            contactWithServer = new ContactWithServer(this, user);
            Thread clientcontactserverThread = new Thread(new ThreadStart(contactWithServer.contact));
            clientcontactserverThread.Start();           
        }
客户端接收程序
  public void contact()
     {
        //receiveIpep = new IPEndPoint(IPAddress.Parse(serverIP), 8888);
        ////sendIpep = new IPEndPoint(IPAddress.Parse(serverIP), 6666);       //服务器端接收端口
        //udpReceiveClient = new UdpClient(receiveIpep);
        receiveIpep = null;       
        try
        {
            udpReceiveClient = new UdpClient(8888);
            while (true)
            {
                MessageBox.Show("where"); 
                byte[] data = udpReceiveClient.Receive(ref receiveIpep);
                if (data.Length < 20)                       //只有命令
                    commandStr = Encoding.ASCII.GetString(data);
                else                                       //既有命令又有数据
                {


                    int i = 0;
                    ///取出命令
                    for (i = 0; i < leng; i++)
                    {
                        if (Convert.ToInt32(data[i]) == 0)    //寻找请求中的有效字符的最终位置
                            break;
                    }
                    byte[] cmdbyte = new byte[i];
                    for (int k = 0; k < i; k++)
                    {
                        cmdbyte[k] = data[k];
                    }
                    commandStr = Encoding.ASCII.GetString(cmdbyte);                    
                }
                MessageBox.Show(commandStr, "来自服务器的命令!");
                switch (commandStr)
                {
                    case "LoginSuccess":
                        {
                            登陆.LoginFormDelegate closeDelegate = new 登陆.LoginFormDelegate(loginFormAction);


                            loginForm.Invoke(closeDelegate, new String[] { "close" });
                            loginForm.isFirst = false;         //客户端已登陆成功,下次发给服务器的消息从另一端口发出
                            frm = new 申请及扫描(user, this);
                            frm.ShowDialog();
                        }
                        break;
                    case "LoginFail":
                        {
                            MessageBox.Show("用户名或者密码错误");
                            登陆.LoginFormDelegate clearDelegate = new 登陆.LoginFormDelegate(loginFormAction);
                            loginForm.Invoke(clearDelegate, new String[] { "clear" });
                        }
                        break;
                    case "ReFreshData":
                        buff = new byte[data.Length - leng];
                        for (int j = 0; j < data.Length - leng; j++)


                            buff[j] = data[leng + j];
                        memStream = new MemoryStream(buff);
                        memStream.Seek(0, SeekOrigin.Begin);
                        memStream.Flush();
                        DataTable dt = new DataTable();
                        dt = (DataTable)formatter.Deserialize(memStream);
                        memStream.Close();
                        MessageBox.Show("收到服务器的命令");
                        break;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
            
        }
客户端成功登陆后,程序执行到红字显示的内容后就去执行其它代码了,在此过程中服务器发过来的数据都不能接收,当客户端关闭后才能接收,不知道怎样修改
[解决办法]
ShowDialog会阻塞,你用异步来做就行了。
与服务器的通讯放在一个独立的线程中,这样与UI相关的交互就不会阻塞了。



[解决办法]
例子:http://download.csdn.net/detail/caozhy/5287998
[解决办法]
 frm = new 申请及扫描(user, this);
                            frm.ShowDialog();
包含在 while (true)里面,你每一次都new一个窗体,当然了应该是判断窗体为空才new

if(frm==null){ frm = new 申请及扫描(user, this);}
 frm.ShowDialog();

热点排行