黑马程序员_学习日记67_717ASP.NET(Socket聊天室)
来源:互联网 发布:苹果cms电影模板 编辑:程序博客网 时间:2024/05/21 05:36
以服务端为例,建立通信的步骤:
1、创建代表本机的节点对象:包括ip和port
2、创建负责监听的socket
3、在线程池中为负责监听的socket启用一个线程
4、接受客户端的一个连接,创建负责通信的socket
5、在线程池中为通信socket启用一个线程
6、用通信socket接收客户端发来的信息
7、向客户端发送消息
服务器端代码:
namespace ChatSerivce{ public delegate void TxtDel(string txt); public partial class ServiceFrm : Form { List<Socket> clientSocketList = new List<Socket>();//与客户端通信的Socket的集合 private TxtDel SetTextDel; public ServiceFrm() { InitializeComponent(); this.SetTextDel = SetTextForTxtHistory; } private void btnStart_Click(object sender, EventArgs e) { string ip = txtIP.Text; IPAddress ipAddress = IPAddress.Parse(ip); //1、创建代表本机的节点对象:包括ip和port IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, int.Parse(txtPort.Text)); //2、创建负责监听的socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipEndPoint); socket.Listen(10);//不要忘了 //3、在线程池中为负责监听的socket启用一个线程 ThreadPool.QueueUserWorkItem(new WaitCallback(ListenClient), socket); txtHistory.Text += "服务端开始监听客户端连接了...\r\n"; } //监听客户端连接 public void ListenClient(object obj) { Socket socket = (Socket)obj; while (true) { //4、接受客户端的一个连接,创建负责通信的socket Socket proxSocket = socket.Accept(); clientSocketList.Add(proxSocket);//将通信socket添加到通信socket集合中 //拿到客户端的端口和IP //txtHistory.Text += proxSocket.RemoteEndPoint.ToString() + "\r\n"; this.Invoke(SetTextDel, proxSocket.RemoteEndPoint.ToString()); //5、在线程池中为通信socket启用一个线程 ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToClient), proxSocket); } } //与客户端通信 public void ConnectToClient(object obj) { Socket socket = (Socket)obj; try { while (socket.Connected) { byte[] buffer = new byte[1024 * 1024 * 1]; //6、用通信socket接收客户端发来的信息 int realLength = socket.Receive(buffer, 0, buffer.Length, SocketFlags.None); string strResult = Encoding.Default.GetString(buffer, 0, realLength); //客户端调用shutdown if (realLength<=0) { break; } //txtHistory.Text += socket.RemoteEndPoint.ToString() + ":" + strResult + "\r\n"; this.Invoke(SetTextDel, socket.RemoteEndPoint.ToString() + ":" + strResult); } } catch (Exception ex) { socket.Close(); clientSocketList.Remove(socket); //从通信socket集合中移除当前socket this.Invoke(SetTextDel, "\r\n客户端退出..."); } } public void SetTextForTxtHistory(string strTxt) { txtHistory.Text += strTxt + "\r\n"; } //7、向客户端发送消息 private void btnSend_Click(object sender, EventArgs e) { string strTxt = txtMsg.Text; byte[] data = Encoding.Default.GetBytes(strTxt); foreach (var socket in clientSocketList) { socket.Send(data, 0, data.Length, SocketFlags.None); } } }}
客户端代码:
namespace ChatClient{ public delegate void TxtDel(string txt); public partial class ClientFrm : Form { public Socket CurrentSocket { get; set; } private TxtDel SetTextDel; public ClientFrm() { InitializeComponent(); this.SetTextDel = SetTextForTxtHistory; } private void btnCon_Click(object sender, EventArgs e) { string ip = txtIP.Text; IPAddress ipAddress = IPAddress.Parse(ip); IPEndPoint endPoint = new IPEndPoint(ipAddress, int.Parse(txtPort.Text)); try { CurrentSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); CurrentSocket.Connect(endPoint);//服务端没有开启就会出现异常 ThreadPool.QueueUserWorkItem(new WaitCallback(ConnectToService), CurrentSocket); txtHistory.Text += "与服务器建立连接...\r\n"; } catch (Exception ex) { if (CurrentSocket != null) { CurrentSocket.Dispose(); } } } private void btnSend_Click(object sender, EventArgs e) { byte[] buffer = Encoding.Default.GetBytes(txtMsg.Text); CurrentSocket.Send(buffer); } public void ConnectToService(object obj) { Socket socket = (Socket)obj; try { while (socket != null && socket.Connected) { byte[] buffer = new byte[1024 * 1024 * 1]; int realLength = socket.Receive(buffer, 0, buffer.Length, SocketFlags.None); string strResult = Encoding.Default.GetString(buffer, 0, realLength); this.Invoke(SetTextDel, socket.RemoteEndPoint.ToString() + ":" + strResult); } } catch (Exception ex) { CurrentSocket.Close(); this.Invoke(SetTextDel,"远程主机停止服务..."); } } public void SetTextForTxtHistory(string strTxt) { txtHistory.Text += strTxt + "\r\n"; } }}
- 黑马程序员_学习日记67_717ASP.NET(Socket聊天室)
- 黑马程序员_聊天室学习(一)
- 黑马程序员_多线程socket聊天室
- 黑马程序员_学习日记5_ADO.Net入门1
- 黑马程序员_学习日记6_ADO.Net入门2
- 黑马程序员_学习日记15_ADO.Net之DataSet
- 黑马程序员_学习日记20_ASP.Net初级
- 黑马程序员_学习日记21_ASP.Net中级
- 黑马程序员_学习日记45_612数据库开发及ADO.Net(SQL语言)
- 黑马程序员_学习日记46_614数据库开发及ADO.Net(约束、数据检索)
- 黑马程序员_学习日记51_621数据库开发及ADO.Net(游标、动态sql)
- 黑马程序员_学习日记68_718ASP.NET(自己写IIS服务器、课程安排)
- 黑马程序员_学习日记69_720ASP.NET(编译、重定向、自增)
- 黑马程序员_学习日记70_721ASP.NET(Web三层增删查改CRUD)
- 黑马程序员_学习日记71_723ASP.NET(文件上传下载、IsPostBack原理、页面生命周期)
- 黑马程序员_学习日记72_724ASP.NET(ViewState、Cookie、Session、登录、分页存储过程)
- 黑马程序员_学习日记75_731ASP.NET(模板、缓存)
- 黑马程序员学习日记----Socket编程(一)
- GCC 使用手册
- Qt学习之路(6): API文档的使用
- 程序员看世界之北京的暴雨积水(5)2012-7-22
- linux GCC、GDB、Makefile
- Linux GCC常用命令
- 黑马程序员_学习日记67_717ASP.NET(Socket聊天室)
- [CentOS] CentOS 6 IPv6 关闭方法
- Linux中的system函数详细分析
- Linux GCC内嵌嵌入汇编程序基础知识
- 从今天开始整理博客了
- [Centos]Centos 6修改主机名
- 细谈linux gcc的概念及其参数
- SQL Server Maintenance plan维护计划
- Qt学习之路(7): 创建一个对话框(上)