黑马程序员_.Net多线程Socket编程(对话聊天)

来源:互联网 发布:淘宝充值网易宝 编辑:程序博客网 时间:2024/05/16 17:25

------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------

下面是个人在黑马里面的相关视频学习到的,简单多线程Socket编程(聊天对话),仅供参考。O(∩_∩)O谢谢~

时间:2013/08/09

并用一台电脑模拟聊天

代码如下:

服务器端


using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net.Sockets;using System.Net;using System.Threading;namespace TestThreadSocket{    public partial class Server : Form    {        public Server()        {            InitializeComponent();            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭对文本框的线程操作检查(不关闭会导致线程间无法调用)        }        //*****2013-08-09******        Thread threadWatch=null;//监听服务器端来访线程        Thread threadClient = null;//获取客户端信息线程        Socket sockeWatch=null;//服务端监听套接字        Socket SokConnection = null;//负责对客户通讯的套接字        //存储所有来访问服务器的客户        Dictionary<string, Socket> dict = new Dictionary<string, Socket>();        private void button1_Click(object sender, EventArgs e)        {            try            {              //创建服务端负责监听的套接字,参数(使用IP4寻找地址协议,使用流式连接,使用TCP协议传输数据)                        sockeWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);                        //获得文本框中的IP地址对象                        IPAddress address = IPAddress.Parse(txt_IP.Text.Trim());                        //创建包含IP和端口的网络节点对象                        IPEndPoint endPoint = new IPEndPoint(address,int.Parse(txt_Post.Text.Trim()));                        //将负责监听的套接字绑定到唯一的IP和端口上                        sockeWatch.Bind(endPoint);                        //设置监听队列的长队                        sockeWatch.Listen(10);                        //创建线程                        threadWatch = new Thread(WatchConnecting);                        //将线程改为后台线程                        threadWatch.IsBackground = true;                        threadWatch.Start();//开启线程                        ShowMsg("服务器端监听成功!");            }            catch (Exception)            {                ShowMsg("服务器端监听失败!");            }                  }        //开始监听        void WatchConnecting()        {            while (true)            {                try                {                    //开始监听客户端,Accept会阻断当前的线程  需要添加线程解决                    SokConnection = sockeWatch.Accept();                    threadClient = new Thread(RecMsg);                    threadClient.IsBackground = true;                    threadClient.Start();                    //向列表控件中添加一个客户端的IP段口字符串,作为客户端的唯一标示                    lbOnline.Items.Add(SokConnection.RemoteEndPoint.ToString());                    //将于客户端通信的套接字对象SokConnection添加到键值对集合中,并以客户端IP端口作为键                    dict.Add(SokConnection.RemoteEndPoint.ToString(), SokConnection);                    ShowMsg("客户端连接成功!" + SokConnection.RemoteEndPoint.ToString());                }                catch (Exception)                {                 }                           }                    }        //获取客户端数据方法        void RecMsg()        {            //死循环不断接收            while (true)            {                byte[] arrMasgRec = new byte[1024 * 1024 * 2];                //获取客户端发来的有效字节长度                int length = SokConnection.Receive(arrMasgRec);                //此时是将数组的所有元素都转成字符串,而真正接收到的只有客户端发来的几个字符。其他剩余空间都是空/0;(截取从0到有效的字节长度)                string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMasgRec, 0, length);                ShowMsg(txt_IP.Text.Trim() + ":" + strMsgRec);            }        }        //显示        void ShowMsg(string msg)         {            Txt_Concext.AppendText(msg+"\r\n");        }        //发送按钮        private void button2_Click(object sender, EventArgs e)        {            try            {                                   //获取发送区内容                        string strMsg = txt_Send.Text.Trim();                        //将要发送的字符串转成UTF-8对应的字节数组                        byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);                        //获取lbOnline(listbox)中当前选中的客户IP                        string strClientKey = lbOnline.Text;                        dict[strClientKey].Send(arrMsg);                        ShowMsg("发送给"+strClientKey+"数据" + strMsg);            }            catch (Exception)            {                ShowMsg("发送失败!");            }                  }    }} 
示例图片:server

客户端代码:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net.Sockets;using System.Net;using System.Threading;namespace Client{    public partial class Clinet : Form    {        public Clinet()        {            InitializeComponent();            //关闭对文本框的线程操作检查(不关闭会导致线程间无法调用)            TextBox.CheckForIllegalCrossThreadCalls=false;        }        Thread threadClient = null;//客户端接收数据线程线程        Socket socketClient = null;//客户端负责接收服务端的数据        private void button1_Click(object sender, EventArgs e)        {            //获取IP地址            IPAddress address = IPAddress.Parse(txt_IP.Text.Trim());            //创建包含IP和端口的网络节点对象            IPEndPoint endPoint = new IPEndPoint(address,int.Parse(txt_Post.Text.Trim()));            //创建发送套接字            socketClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);            //发送            socketClient.Connect(endPoint);            //实例化线程 监听服务端的信息            threadClient = new Thread(RecMsg);            threadClient.IsBackground = true;            threadClient.Start();        }        //接收服务端数据方法        void RecMsg()        {            //死循环不断接收            while (true)            {                    //开辟一个2M空间                    byte[] arrMasgRec = new byte[1024 * 1024 * 2];                    //获取服务端发来的有效字节长度                    int length= socketClient.Receive(arrMasgRec);                    //此时 是将 数组的所有元素都转成字符串,而真正接收到的只有服务端发来的几个字符。其他剩余空间都是空/0;                    string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMasgRec,0,length);                                        ShowMsg(txt_IP.Text.Trim()+":"+strMsgRec);            }                  }        //发送按钮        private void button2_Click(object sender, EventArgs e)        {            //获取发送数据            string strMsg = txt_Send.Text.Trim();            //编码            byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);            //发送            socketClient.Send(arrMsg);            ShowMsg("发送给" + txt_IP.Text.Trim() + ":" + strMsg);        }        //显示        void ShowMsg(string msg)         {            Txt_Concext.AppendText(msg + "\r\n");        }    }}
示例图片:


------- Windows Phone 7手机开发、.Net培训、期待与您交流! -------

原创粉丝点击