我在学习服务端和客户端的过程中,制作了一个客户端输入用户名和密码,在服务端能显示出来的程序,可是我的客户端向服务端发送成功数据之后,就回出现一个异常错误:“远程主机强迫关闭了一个连接”,但是用再用客户端来发送数据,服务端也照样能收到,就是一个问题老弹出这个异常对话框,其他的都正常,这个是怎么回事呢?
while (true)
            {
                try
                {
                    Byte[] rec = new Byte[100];
                    int receiveCount =accsocket.Receive(rec);
                    //NetworkStream netstream = new NetworkStream(accsocket);
                    if (receiveCount>0)
                    {
                        //netstream.Read(rec, 0, rec.Length);
                        string recmessage = Encoding.UTF8.GetString(rec);
                        if (recmessage.Substring(0, 6) == "USER--")
                        {
                            recmessage = recmessage.Substring(6, 94).Trim('^');
                            listBox1.Items.Add("用户名:" + recmessage);
                        }
                        else
                        {
                            recmessage = recmessage.Substring(6, 94).Trim('^');
                            listBox1.Items.Add("密码:" + recmessage);
                        }
                    }
                    else
                    {
                        accsocket.Close();
                        break;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    break;
                }            }
 

解决方案 »

  1.   

    int receiveCount =accsocket.Receive(rec);//在这里会发生异常,是什么原因呢?
      

  2.   

    是不是客户端关闭了socket啊,但是也不会出现远程主机强迫关闭连接的提示啊,能把代码贴全吗
    你客户端再发送是不是又新new了一个socket所以服务器也新产生了一个accsocket来处理你的请求
    还有你在    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                        break;
                    } 
    里没有关闭socket这是不对的
      

  3.   

    namespace 服务器端1
    {
        public partial class Form1 : Form
        {
            private IPAddress myip = IPAddress.Parse("127.0.0.1");
            private Socket listener;
            private Socket accsocket;
                        public Form1()
            {
                InitializeComponent();
            }
           /* public delegate void InvokeDelegate();        public void ItemsAdd(string str)
            {
                listBox1.Items.Add(str);
            } */
            private void button1_Click(object sender, EventArgs e)
            {
                Thread acceptThread = new Thread(new ThreadStart(AcceptWorkThread));
                acceptThread.Start();
            }
            private void AcceptWorkThread()
            {
                listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint locEP = new IPEndPoint(myip, 8888);
                listener.Bind(locEP);//要与 Socket 关联的本地 EndPoint
                listener.Listen(100);//指定队列中最多可容纳的等待接受的传入连接数
                string str = "开始监听8888……";
                listBox1.Items.Add(str);
                while (true)
                {
                    accsocket = listener.Accept();
                    if (accsocket.Connected)
                    {
                        listBox1.Items.Add("与客户端成功连接……");
                        Thread.CurrentThread.IsBackground = true;
                        Thread thread = new Thread(new ThreadStart(ReceiveWorkThread));
                        thread.Start();
                    }
                   
                }
            }
            private void ReceiveWorkThread()
            {
                Thread.CurrentThread.IsBackground = true;
                //Socket socket = (Socket)obj;
                
                           // string sql = "select password from users where username=" + user;
                           // OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +"./data/user.mdb");
                          //  conn.Open();
                           // OleDbCommand cmd = new OleDbCommand(sql, conn);
                           // OleDbDataReader reader=cmd.ExecuteReader();
                           // if (reader.Read())
                           // {
                               // pass1 = reader["password"].ToString();
                           // }
                           // else
                            //{
                               // pass1=null;
                           // }
                
                while (true)
                {
                    try
                    {
                        Byte[] rec = new Byte[100];
                        //NetworkStream netstream = new NetworkStream(accsocket);
                        if (receiveCount>0)
                        {
                            //netstream.Read(rec, 0, rec.Length);
                            string recmessage = Encoding.UTF8.GetString(rec);
                            if (recmessage.Substring(0, 6) == "USER--")
                            {
                                recmessage = recmessage.Substring(6, 94).Trim('^');
                                listBox1.Items.Add("用户名:" + recmessage);
                            }
                            else
                            {
                                recmessage = recmessage.Substring(6, 94).Trim('^');
                                listBox1.Items.Add("密码:" + recmessage);
                            }
                        }
                        else
                        {
                            accsocket.Close();
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                        accsocket.Close();
                        break;
                    }            }
                  
                   
                
            }
            private void MainWorkThread(string str)
            {
     
            }        private void button2_Click(object sender, EventArgs e)
            {
                
            }        private void Form1_Load(object sender, EventArgs e)
            {
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            }
    ------------------------------------------
    客户端的:
    namespace 客户端
    {
        public partial class Form2 : Form
        {
           
            public Form2()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                if (textBox1.Text == "" || textBox2.Text == "")
                {
                    MessageBox.Show("请输入用户名或密码!");
                }
                else
                {
                    
                        string strUser = string.Format("USER--{0}", textBox1.Text);
                        string strPass = string.Format("PASS--{0}", textBox2.Text);
                        CommunClass abc = new CommunClass();
                        Socket s = abc.ConnectToServer("127.0.0.1", 8888);
                        if (abc.WriteCommandToSocket(s, strUser) && abc.WriteCommandToSocket(s, strPass))
                        {
                           
                            MessageBox.Show("发送成功");
                        }
                        else
                        {
                            MessageBox.Show("目前网络阻塞,验证信息发送不成功!");
                        }             
                }            
            }------------------------
     public  bool WriteCommandToSocket(Socket s, string strUser)
            {            strUser = strUser.PadRight(USERLEN, FILLCHAR);            return WriteTextToSocket1(s, strUser); 
            }
    ------------------------------
      

  4.   

    我已经找到答案了,客户端在发送完信息后没有关闭SOCKET