zoukankan      html  css  js  c++  java
  • 关于用Socket实现,客户端和服务器端的通信

    这是服务器端:

    public partial class MainForm : Form
        {
            int Port = 8000;
            //创建监听对象
            TcpListener listener = null;
            //定义一个委托
            delegate void SetSaft(string text);

            ArrayList conList = new ArrayList();
            //确定编码
            Encoding UTF8 = Encoding.UTF8;
            Encoding GB2312 = Encoding.GetEncoding("GB2312");
            //创建线程
            Thread ListerThread = null;
            Thread DataThread = null;

            public MainForm()
            {
                InitializeComponent();
            }
            /// <summary>
            /// 处理连接线程
            /// </summary>
            public void AccetptRequest()
            {
                try
                {
                    while (true)
                    {
                        //确定是否挂起连接请求
                        if (listener.Pending())
                        {
                            //建立连接
                            Socket s = listener.AcceptSocket();
                            //添加到当前连接的列表
                            conList.Add(s);
                            if (s.Connected)
                            {
                                string serverEndpoint = "欢迎登录服务器:"+s.LocalEndPoint.ToString();
                                byte[] bgb = GB2312.GetBytes(serverEndpoint);
                                byte[] buffer = Encoding.Convert(GB2312, UTF8, bgb);
                                //发送给客户端
                                s.Send(buffer);
                                //获取远端终点
                                string rpoint = s.RemoteEndPoint.ToString();
                                //将客户端信息加在列表中
                                AddList(rpoint);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                Thread.Sleep(1000);
            }

            public void ReceiveData()
            {
                while (true)
                {
                    try
                    {
                        ArrayList closeSocketList = new ArrayList();
                        closeSocketList.Clear();
                        //循环每一个已经建立的连接
                        foreach (Socket s in conList)
                        {
                            NetworkStream ns = new NetworkStream(s);
                            System.IO.StreamReader reader = new System.IO.StreamReader(ns);
                            //表示独到是否有可用的数据
                            if (ns.DataAvailable)
                            {
                                //从当前流中获取一行字符
                                string result = reader.ReadLine();
                                byte[] u = UTF8.GetBytes(result);
                                byte[] gb = Encoding.Convert(UTF8, GB2312, u);

                                //取得转化为Gb2312编码的字符串
                                string sgb = GB2312.GetString(gb);

                                if (sgb.StartsWith("Closing"))
                                {
                                    //将当前连接添加关闭连接
                                    closeSocketList.Add(s);
                                }                         
                            }
                            reader.Close();
                            ns.Close();
                        }
                        foreach (Socket s in closeSocketList)
                        {
                            DelList(s.RemoteEndPoint.ToString());
                            s.Close();
                            conList.Remove(s);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }

            private void AddList(object text)
            {
                //判断对方控件是否调用了invoke方法
                if (this.listBox1.InvokeRequired)
                {
                    SetSaft d = new SetSaft(AddList);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.listBox1.Items.Add(text);
                }
            }
            private void DelList(object text)
            {
                if (this.listBox1.InvokeRequired)
                {
                    SetSaft d = new SetSaft(DelList);
                    this.Invoke(d, new object[] { text });
                }
                else
                {
                    this.listBox1.Items.Remove(text);
                }
            }
            private void 开始服务ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                //初始话指定的侦听的端口
                listener = new TcpListener(Port);
                listener.Start();
                //启动连接线程
                ListerThread=new Thread(new ThreadStart( AccetptRequest));
                //启动接受数据线程
                ListerThread.Start();
                DataThread=new Thread( new ThreadStart(ReceiveData));
                DataThread.Start();

            }

            private void MainForm_Load(object sender, EventArgs e)
            {
                //UserInfo();
            }

            private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
            {
                //Bll.User.Operate operater = new Bll.User.Operate();
                //operater.Exit(loginForm.NAME, loginForm.PASSWORD);
                //Application.Exit();
            }

            private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
            {
                try
                {
                    foreach (Socket o in conList)
                    {
                        o.Close();
                    }
                    ListerThread.Abort();
                    DataThread.Abort();
                }
                catch(SocketException ex)
                {
                    MessageBox.Show(ex.Message);
                }
              
            }
        
        }

    下面是客户端:

    public partial class MainForm : Form
        {
            Socket client = null;
            public string IP = null;//表示要连接的服务器IP
            private int Port = 8000;
            System.Threading.Thread data = null;

            Encoding UF8 = Encoding.UTF8;
            Encoding GB2312 = Encoding.GetEncoding("GB2312");

            delegate void SetSafe(string text);     
            public MainForm()
            {
                InitializeComponent();
            }

            private void MainForm_Load(object sender, EventArgs e)
            {
                client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint end = new IPEndPoint(IPAddress.Parse("192.168.253.195"), Port);
                try
                {
                    client.Connect(end);
                    byte[] buffer = new byte[1024];
                    PonySocket.Helper helper = new PonySocket.Helper(client, buffer);
                    client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(Receive),helper);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            void Receive(IAsyncResult ar)
            {
                PonySocket.Helper h = ar.AsyncState as PonySocket.Helper;
                int c= client.EndReceive(ar);
                //递归的接受数据
                h.ChatSocket.BeginReceive(h.MsgByte, 0, h.MsgByte.Length, SocketFlags.None, new AsyncCallback(Receive), h);
                this.label1.Text = Encoding.GetEncoding("gb2312").GetString(h.MsgByte, 0, c);
            }
            private void btnConnecting_Click(object sender, EventArgs e)
            {
                //Promp promp = new Promp();
                //promp.ShowDialog();
                //IP = promp.IP;           
                //try
                //{
                //    client = new Socket(AddressFamily.InterNetwork,
                //        SocketType.Stream,
                //        ProtocolType.Tcp);
                //    client.Connect(IP, Port);
                //    string sendString = client.LocalEndPoint.ToString()+"成功连接";
                //    //将连接信息发送给服务器端
                //    byte[] buffer = UF8.GetBytes(sendString);
                //    client.Send(buffer);
                //    data = new System.Threading.Thread(new ThreadStart(DataStart));
                //    data.Start();
                //}
                //catch (SocketException ex)
                //{
                //    MessageBox.Show(ex.Message);
                //}           
            }

            private void DataStart()
            {
                while (true)
                {
                    try
                    {
                        NetworkStream ns = new NetworkStream(client);
                        System.IO.StreamReader reader = new System.IO.StreamReader(ns);
                        string result = reader.ReadLine();
                        byte[] u = UF8.GetBytes(result);
                        byte[] sgb = Encoding.Convert(UF8, GB2312, u);
                        string strgb = GB2312.GetString(sgb);
                        this.label1.Text = strgb;
                        ns.Close();
                        reader.Close();
                    }
                    catch (SocketException ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                    Thread.Sleep(1000);
                }
            }

            private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
            {
                try
                {
                    data.Abort();
                    Byte[] buffer = UF8.GetBytes("Closing"+client.LocalEndPoint.AddressFamily.ToString());
                    client.Send(buffer);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
        }

    客户端用了两中方法实现,可是出现问题是服务器可以取得客户端的连接信息(IP和端口号)但是双方实现不了通信

  • 相关阅读:
    Django项目:CRM(客户关系管理系统)--54--45PerfectCRM实现账号快速重置密码
    Django项目:CRM(客户关系管理系统)--53--44PerfectCRM实现账号快速注册登陆
    Python 原生2种 邮件发送(发送验证码) 的方法
    Django项目:CRM(客户关系管理系统)--52--43PerfectCRM实现AJAX全局账号登陆
    Django项目:CRM(客户关系管理系统)--51--42PerfectCRM实现AJAX全局账号注册
    Django项目:CRM(客户关系管理系统)--50--41PerfectCRM实现全局账号密码修改
    Django项目:CRM(客户关系管理系统)--49--40PerfectCRM实现全局账号注册+验证码+页面刷新保留信息
    Django项目:CRM(客户关系管理系统)--48--39PerfectCRM实现登录+验证码+过期时间+页面保留账号
    mvc 伪静态任意扩展名的实现方法
    asp.net mvc各种传值方式大全
  • 原文地址:https://www.cnblogs.com/liufei88866/p/1783071.html
Copyright © 2011-2022 走看看