C下如何实现服务器客户端的聊天程序
最近也在接触SOCKET编程,在当今这样一个网络时代,很多技术都以网络为 中心在诞生,至少我认为是这样的,而SOCKET套接字接口,在实现网络通讯 上处于关键地位,所以不会SOCKET是不行的。 首先,本文主要是针对那些刚接触SOCKET编程的朋友,如果是高手,就可以 不看此文啦,可以去陪陪老婆,比如逛街或看电视… 在开始之前,我们需要预习一些基础知识: 什么是SOCKET套接字? SOCKET通常有那几种数据格式? 线程的概念? (以上基本知识我就不讲了,网上这方面资料很多的,大家找资料看下吧) 我要介绍的是一个服务器端+客户端的聊天系统,程序比较简单,我先把程序运 行的界面给大家看下: 上面是服务器端运行界面;下面把客户端界面贴给大家看下: 功能比较简单,服务器的端口号可以在“系统菜单”里面的参数配置进行修改的。 看了上面的图,下面我们就给大家把代码贴出来:(因为程序比较简单,所以本 人就没有去分层啦) 服务器端代码: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.s; 8 9 using System.Net; 10 using System.Net. Sockets; 11 using System.Threading; 12 using System.Xml; 13 14 namespace Server 15 { 16 public partial class ServerMain : public ServerMain() { InitializeComponent(); } private void ServerMain_Load(object sender, EventArgs e) { this.Star.Enabled = true; this.Stop.Enabled = false; } private void 配置参数 ToolStripMenuItem_Click(object sender, EventArgs e) { Set TSet = new Set(); TSet.ShowDialogO; } private void 关于 ToolStripMenuItem_Click(object sender, EventArgs e) { About TAbout = new About(); TAbout.Show(); } III III获得XML文件中的端口号 III III private int GetPort() ( try ( XmlDocument TDoc = new XmlDocument(); TDoc.Load(HSettings.xml“); string TPort = TDoc.GetElementsByTagName(“ServerPort“)[0].InnerXml; return Convert.ToInt32(TPort); catch ( return 6600; }〃默认是 6600 55 56 57 〃声明将要用到的类 58 private IPEndPoint Serverinfo;//存放服务器的 IP 和端 口信息 59 private Socket ServerSocket;//!艮务端运行的 SOCKET 60 private Thread ServerThread;//!艮务端运行的线程 61 private Socket[] ClientSocket;〃为客户端建立的 SOCKET 连接 62 privateint ClientNumb;〃存放客户端数量 63 privatebyte[] MsgBuffer;//存放消息数据 64 65 privatevoid Star_Click(object sender, EventArgs e) 66 { 67 ServerSocket 二 new Socket(AddressFamily.InterNetwork, SocketType.Stream, Protoco IType.Tcp); 68 Serverlnfo=new IPEndPoint(IPAddress.Any,this.GetPort()); 69 ServerSocket.Bind(ServerInfo);//^ SOCKET 接口和 IP 端 口绑定 70 ServerSocket.Listen( 10);//开始监听,并且挂起数为 10 71 72 ClientSocket = new Socket[65535];〃为客户端提供连接个数 73 MsgBuffer = new byte[65535];// 消息数据大小 74 ClientNumb=0;〃数量从0开始统计 75 76 ServerThread = new Thread(Recieve Accept); 〃将接受客户端连接的方法委托给线程 77 S erverThread. Start();〃线程开始运行 78 79 CheckForlllegalCrossThreadCalls = false;// 不捕获对错误线程的调用 80 81 this.Star.Enabled = false; 82 this.Stop.Enabled = true; 83 this.StateMsg.Text = ”服务正在运行…“+“运行端 口 : ”+this.GetPort().ToString(); 84 this.ClientList.Items.Add(“服务于“+DateTime.Now.ToStringO + “开始运行.“); 85 } 86 87 〃接受客户端连接的方法 88 private void RecieveAccept() 89 { 90 while (true) 91 92 ClientSocket[ClientNumb] = ServerSocket.Accept(); 93 ClientSocket[ClientNumb] .BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, ne w AsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]); 94 this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPo