一. 设计思路
㈠ 服务器
1) 创建主体框架:建立程序的主要界面后,系统自动生成界面的主要窗口生成代码。对于每个按钮的的代码段中,分别添加事件触发的处理代码。
2) 创建Socket实例serverSocket并绑定到用于TCP通信的本地IP地址和端口上。Bind方法完成绑定工作。绑定后用Listen方法等待客户端发出的连接尝试。
3) 创建一个线程监听客户端连接请求,用Accept方法获取客户端连接,得到客户端的socket实例。并记录在User实例中。
4) 创建一个线程处理接受的客户端数据,每接受一个客户端连接,就创建立各对应的线程循环接受该客户端发来的信息。每一个User实例对应一个clientSocket。用while来循环监听由客户端发来的信息。客户端发来的信息用Login,Logout,client等字符串分割处理不同的信息。其中client表示从客户端接受消息。
5) 本程序用BinaryReader和BinaryWriter处理字符串信息,用网络流来传输数据,使程序更有效率。
6) 利用委托来监听不同用户连接时的数目,改变其对应Label的值。
7) 当调用主线程创建的空间时,利用 InvokeRequired判断是否控件是否由主线程创建,如果是用Invoke方法完成对应操作。
㈡ 客户端
1) 创建主体框架:建立程序的主要界面后,系统自动生成界面的主要窗口生成代码。对于每个按钮的的代码段中,分别添加事件触发的处理代码。
2) 一个客户端对应一个clientSocket,用random函数创建不同的用户名。
3) 创建一个后台线程,利用while循环在时间间隔内不断尝试连接服务器,连接成功时调用改变Label的方法,实现状态的改变并显示。
4) 将网络流作为二进制读写对象,创建一个线程接收由客户端传来的信息。
5) 用字符串分割器解析不同消息。实现登录,登出,接收服务器消息的功能。
服务器连接核心代码:
serverSocket = newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
localAddress =IPAddress.Parse("127.0.0.1");
IPEndPoint serverIPE = newIPEndPoint(localAddress, 56000);
serverSocket.Bind(serverIPE);
serverSocket.Listen(10);
Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());