服务器端:Java编写.
客户端: C#.情况1: 服务器放在XP系统下运行,客户端放在Win7下运行.并且与服务器端进行通讯,一段时间内客户端Socket连接会自动断开(通讯状态下、非通讯状态下现象相同).另服务器有心跳机制。情况2:  服务器与客户端均放在XP系统下,服务器与客户端进行连接,无论是否进行通讯。均未出现连接中断现象.情况3: 服务器放在Win7系统下,客户端放在XP系统下.服务器与客户端进行连接,无聊是否进行通讯。均未出现连接中断现象.求高手指点原因.   IPVN6已禁用.通讯socketc#服务器xp

解决方案 »

  1.   

     //登录方法
            private void login()
            {
                try
                {
                    bw = new BackgroundWorker();
                    //支持实时报告进度
                    //支持取消
                    bw.WorkerReportsProgress = true;
                    bw.WorkerSupportsCancellation = true;
                    //注册事件
                    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
                    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
                    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
                    //启动线程
                    bw.RunWorkerAsync();
                }
                catch (System.Exception)
                {
                    Methods.showAlert(this, "登录时出现异常");
                }
            } #region 线程启动
            //线程启动时调用的方法
            private void bw_DoWork(object sender, DoWorkEventArgs e)
            {
                BackgroundWorker bw = sender as BackgroundWorker;
                //调用登录平台函数
                if (checkBox1.Checked)
                    Socket_link("loginserver", "XXX.XXX.XXX.XXX", Int32.Parse("XX22"), bw, e);
                else
                    Socket_link("loginserver", "XXX.XXX.XXX.XXX", Int32.Parse("XX22"), bw, e);
                //Socket_link("loginserver", "XXX.XXX.XXX.XXX", Int32.Parse("XX22"), bw, e);
        
            }
            #endregion
      private void Socket_link(string posid, string ip, int port, BackgroundWorker worker, DoWorkEventArgs e)
            {
                pid = posid;
                //定义byte数组,存放消息
                byte[] message = new byte[1024];
                byte[] rev = new byte[1024];
                try
                {
                    if (!sendMessage.Connected)
                    {                    //定义目标主机的IP,与端口
                        ipp = new IPEndPoint(IPAddress.Parse(ip), port);
     
                        //创建套接字
                        sendMessage = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                    //连接目标主机(服务器)
                        sendMessage.Connect(ipp);
                        byte[] re = new byte[1024];                    //发送报文类
                        SendMessage POSsendMessage = new SendMessage();
                        POSsendMessage.setPid(pid);                    //接受报文类
                        ReceiveMessage receiveMessage = new ReceiveMessage();                    //发送报文
                        sendMessage.Send(Encoding.UTF8.GetBytes(pid));                    //接收报文
                        sendMessage.Receive(re);
                        string strMessage = Encoding.UTF8.GetString(re, 0, re.Length);
                        strMessage = strMessage.Replace("\0", "").Trim();
                        if (!strMessage.StartsWith("loginsuccess"))
                        {
                            sendMessage.Close();
                            ReceiveUtil.sendMessage = null;
                            Methods.showInfo(this, "登陆失败");
                            labelMessage = "";
                            this.toolStrip.Text = "";
                            return;
                        }
                        else
                        {
                            string[] str = strMessage.Trim().Split(';');
                            string[] temp = str[0].Trim().Split(',');
                            string MyPort = temp[1].Trim().Substring(temp[1].Trim().IndexOf("=") + 1);
                            string tempHost = str[2].Trim();
                            string hostName = str[2].Trim().Substring(str[2].Trim().IndexOf(":") + 1);
                            string MyIp = str[1].Trim().Substring(str[1].Trim().IndexOf(":") + 1);
                            string myO = " 用户名:" + hostName.Trim().Replace(@"\0", "");
                            string myP =" IP: " + MyIp.Trim() + " 端口号: " + MyPort.Trim();
                            labelMessage = myO + myP;
                            this.toolStrip.BeginInvoke(new System.EventHandler(ChangeLabel_UI), labelMessage);
                        }
                    }
                    //设置控件
                    listenThread.Start();
                    this.btnLogin.BeginInvoke(new System.EventHandler(LoginUI), "退出");
                    timer2.Start();
                    ReceiveUtil.sendMessage = sendMessage;
                    Methods.showInfo(this, "登陆成功");
                    sendMessage.Send(Encoding.UTF8.GetBytes("refreshusers"));
                }
                catch (Exception ex)
                {
                    sendMessage.Close();
                    ReceiveUtil.sendMessage = null;
                    e.Cancel = true;
                    if (ex.ToString().Contains("由于目标机器积极拒绝,无法连接"))
                    {
                        Methods.showInfo(this, "服务器连接失败");
                    }
                    else if (ex.ToString().Contains("由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。"))
                    {
                        Methods.showInfo(this, "服务器连接失败");
                    }
                }        }