




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
下面这个实例是一个完整的使用Socket实现的聊天(只限于局域网,如果能提供一个高权限的IP就可以实现类似QQ聊天),其中的原理是:首先开启服务端,打开侦听(任何端口为6600的IP),下面实现的代码:服务端+客户端【VS2005 C#.NET 2.0】【服务端】三个窗体:About.cs,ServerMain.cs,Set.cs:(ServerMain.cs窗体代码)using System;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.Threading;using System.Xml;namespace Server public partial class ServerMain : Form public ServerMain() InitializeComponent(); private void ServerMain_Load(object sender, EventArgs e) this.CmdStar.Enabled = true; this.CmdStop.Enabled = false; private void 配置参数ToolStripMenuItem_Click(object sender, EventArgs e) Set TSet = new Set(); TSet.ShowDialog(); private void 关于ToolStripMenuItem_Click(object sender, EventArgs e) About TAbout = new About(); TAbout.Show(); / / 获得XML文件中的端口号 / / private int GetPort() try XmlDocument TDoc = new XmlDocument(); TDoc.Load(Settings.xml); string TPort = TDoc.GetElementsByTagName(ServerPort)0.InnerXml; return Convert.ToInt32(TPort); catch return 6600; /默认是6600 /声明将要用到的类 private IPEndPoint ServerInfo;/存放服务器的IP和端口信息 private Socket ServerSocket;/服务端运行的SOCKET private Thread ServerThread;/服务端运行的线程 private Socket ClientSocket;/为客户端建立的SOCKET连接 private int ClientNumb;/存放客户端数量 private byte MsgBuffer;/存放消息数据 private void CmdStar_Click(object sender, EventArgs e) ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); /提供一个 IP 地址,指示服务器应侦听所有网络接口上的客户端活动 IPAddress ip = IPAddress.Any; ServerInfo=new IPEndPoint(ip,this.GetPort(); ServerSocket.Bind(ServerInfo);/将SOCKET接口和IP端口绑定 ServerSocket.Listen(10);/开始监听,并且挂起数为10 ClientSocket = new Socket65535;/为客户端提供连接个数 MsgBuffer = new byte65535;/消息数据大小 ClientNumb = 0;/数量从0开始统计 ServerThread = new Thread(new ThreadStart(RecieveAccept);/将接受客户端连接的方法委托给线程 ServerThread.Start();/线程开始运行 CheckForIllegalCrossThreadCalls = false;/不捕获对错误线程的调用 this.CmdStar.Enabled = false; this.CmdStop.Enabled = true; this.StateMsg.Text = 服务正在运行.+ 运行端口:+this.GetPort().ToString(); this.ClientList.Items.Add(服务于 + DateTime.Now.ToString() + 开始运行.); /接受客户端连接的方法 private void RecieveAccept() while (true) /Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket。 /在阻止模式中,Accept 将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的 Socket 继续将传入的连接请求排入队列,直到您关闭它。 ClientSocketClientNumb = ServerSocket.Accept(); ClientSocketClientNumb.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallBack),ClientSocketClientNumb); lock (this.ClientList) this.ClientList.Items.Add(ClientSocketClientNumb.RemoteEndPoint.ToString() + 成功连接服务器.); ClientNumb+; /回发数据给客户端 private void RecieveCallBack(IAsyncResult AR) try Socket RSocket = (Socket)AR.AsyncState; int REnd = RSocket.EndReceive(AR); /对每一个侦听的客户端端口信息进行接收和回发 for (int i = 0; i ClientNumb; i+) if (ClientSocketi.Connected) /回发数据到客户端 ClientSocketi.Send(MsgBuffer, 0, REnd,SocketFlags.None); /同时接收客户端回发的数据,用于回发 RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(RecieveCallBack), RSocket); catch private void CmdStop_Click(object sender, EventArgs e) ServerThread.Abort();/线程终止 ServerSocket.Close();/关闭socket this.CmdStar.Enabled = true; this.CmdStop.Enabled = false; this.StateMsg.Text = 等待运行.; this.ClientList.Items.Add(服务于 + DateTime.Now.ToString() + 停止运行.); private void ServerMain_FormClosed(object sender, FormClosedEventArgs e) ServerThread.Abort();/线程终止 ServerSocket.Close();/关闭SOCKET Application.Exit(); (Set.cs代码)using System;using System.Text;using System.Windows.Forms;using System.Xml;namespace Server public partial class Set : Form public Set() InitializeComponent(); private void Set_Load(object sender, EventArgs e) this.GetAllIP(); this.GetPort(); private void GetAllIP() private void GetPort() try XmlDocument TDoc = new XmlDocument(); TDoc.Load(Settings.xml); string TPort = TDoc.GetElementsByTagName(ServerPort)0.InnerXml; this.Port.Text = TPort; catch private void CmdSave_Click(object sender, EventArgs e) try XmlDocument TDoc = new XmlDocument(); TDoc.Load(Settings.xml); XmlElement Root = TDoc.DocumentElement; XmlElement newElem = TDoc.CreateElement(ServerPort); newElem.InnerXml = this.Port.Text; Root.ReplaceChild(newElem, Root.LastChild); TDoc.Save(Settings.xml); MessageBox.Show(参数保存成功!); this.Close(); catch MessageBox.Show(参数写入XML文件不成功!); 【客户端代码】ClientMain.cs窗体using System;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;namespace Client public partial class ClientMain : Form public ClientMain() InitializeComponent(); private IPEndPoint ServerInfo; private Socket ClientSocket; /信息接收缓存 private Byte MsgBuffer; /信息发送存储 private Byte MsgSend; private void ClientMain_Load(object sender, EventArgs e) this.CmdSend.Enabled = false; this.CmdExit.Enabled = false; /定义一个IPV4,TCP模式的Socket ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); MsgBuffer = new Byte65535; MsgSend = new Byte65535; /允许子线程刷新数据 CheckForIllegalCrossThreadCalls = false; this.UserName.Text =Environment.MachineName; private void CmdEnter_Click(object sender, EventArgs e) /服务端IP和端口信息设定,这里的IP可以是,可以是本机局域网IP,也可以是本机网络IP ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text); try /客户端连接服务端指定IP端口,Sockket ClientSocket.Connect(ServerInfo); /将用户登录信息发送至服务器,由此可以让其他客户端获知 ClientSocket.Send(Encoding.Unicode.GetBytes(用户: + this.UserName.Text + 进入系统!n); /开始从连接的Socket异步读取数据。接收来自服务器,其他客户端转发来的信息 /AsyncCallback引用在异步操作完成时调用的回调方法 ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null); this.SysMsg.Text += 登录服务器成功!n; this.CmdSend.Enabled = true; this.CmdEnter.Enabled = false; this.CmdExit.Enabled = true; catch MessageBox.Show(登录服务器失败,请确认服务器是否正常工作!); private void ReceiveCallBack(IAsyncResult AR) try /结束挂起的异步读取,返回接收到的字节数。 AR,它存储此异步操作的状态信息以及所有用户定义数据 int REnd = ClientSocket.EndReceive(AR); lock (this.RecieveMsg) this.RecieveMsg.AppendText(Encoding.Unicode.GetString(MsgBuffer, 0, REnd); ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null); catch MessageBox.Show(已经与服务器断开连接!); this.Close(); /点击发送之后没有直接添加到信息列表中,而是传到服务器,由服务器转发给每个客户端 private void CmdSend_Click(object sender, EventArgs e) MsgSend = Encoding.Unicode.GetBytes(this.UserName.Text + 说:n + this.SendMsg.Text + n); if (ClientSocket.Connected) /将数据发送到连接的 System.Net.Sockets.Socket。 ClientSocket.Send(MsgSend); t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025医疗设备智能化改造与操作培训服务协议
- 2025年农业产业链上下游产品置换交易合同
- 2025年高科技办公电脑租赁与数据保密处理专项服务合同
- 2025年度新型城镇化建设项目环境保洁外包合同
- 2025年都市花园绿化养护及景观提升服务合同
- 2025年科技型企业研发经费管理及报销流程外包服务协议
- 2025年教育培训机构租赁合同解除及学员安置协议
- 2025年度云计算平台设备维护及数据安全防护服务合同
- 2025年智慧城市公共设施室内外装修一体化项目合同
- 猪苗养殖废弃物回收利用与生态循环利用服务合同
- 充电桩安装与使用管理制度
- 物料提升机安全知识培训
- 项目验收表模板
- 2024年黑龙江省哈尔滨市中考英语试题卷(含答案及解析)
- 高一语文开学第一课课件
- 非高危行业生产经营单位主要负责人及安全管理人员安全生产知识和管理能力试题及答案
- DL∕T 782-2001 110kV及以上送变电工程启动及竣工验收规程
- 人教版初一数学课程讲义+练习(教师整合版)
- DL∕T 5161.1-2018 电气装置安装工程质量检验及评定规程 第1部分:通则
- 思想政治教育原理方法论
- 2024广西公需课高质量共建“一带一路”谱写人类命运共同体新篇章答案
评论
0/150
提交评论