当前位置: 首页 > news >正文

如何解决网站图片打开慢关键词搜索推广排行榜

如何解决网站图片打开慢,关键词搜索推广排行榜,网上书店网站前端搜索条怎么做,响应式环保网站模板下载最后在公司实习#xff0c;新人不给活干#xff0c;就自己随便看看#xff0c;了解一些DevExpress控件啊#xff0c;编码规范啊之类的#xff0c;自己就寻思着写一点点小东西练习练习 出于自己对c# socket这块不熟#xff0c;就选择了这块#xff0c;顺便可以进一步了解…最后在公司实习新人不给活干就自己随便看看了解一些DevExpress控件啊编码规范啊之类的自己就寻思着写一点点小东西练习练习 出于自己对c# socket这块不熟就选择了这块顺便可以进一步了解委托 代理。 闲话不说先说下这次做的东西一个局域网聊天的小软件  主要基于udp的通信如果读者还不知道udp or tcp  那请度娘一下。。。 基本思路这也都是网上查的还查了飞鸽传书的 基本原理在此感谢网上的各位高手哈 1软件开启的时候先新开一个线程该线程充当服务器端一直死循环监听 2开了新线程了调用广播的方法 3此时如果局域网内已经有有其它主机打开了这个软件将会监听到这个广播收到这个广播后将返回自己的主机并且将监听到的主机添加自己的在线列表中当然发起广播的软件也能收到其它软件的回信收到他们的主机后也加入自己的在线列表这样各自的列表就都能建立起来并且将当前的列表加入一个静态的泛型列表中用于以后和其它用户的通信维护他们的状态 4通信 发送消息双击一个主机列表后  得到该主机host 传到交谈窗体 并查询出他主机的endpoint这样就可以进行本机和向该endpoint点发送消息了 5下线 下线之前软件会发一个下线的广播其它的软件接到该广播的时候将会将该主机从自己的在线列表中移除   整体思路就这样下面可以结合代码具体看一下 View Code #region Field/// summary/// 在非主线程是对控件操作/// /summary/// param namehost/paramprivate delegate void MyInvoke(string host);/// summary/// 充当服务器 进行监听接收/// /summaryprivate SocketUdpServer udpServer;/// summary/// 充当客户端/// /summaryprivate SocketUdpClient udpClient;#endregion#region Contructor/// summary/// 构造函数/// /summarypublic FrmUser(){InitializeComponent();init();}#endregion#region Method/// summary/// 初始化数据/// /summaryprivate void init(){LanList.CurrentLanList new ListLanInfo();this.Text 当前局域网内在线用户;this.udpServer SocketUdpServer.Instance;this.udpServer.OnLineComplete new SocketUdpServer.OnCompleteHander(this.OnLine_Event);this.udpServer.DownLineComplete new SocketUdpServer.OnCompleteHander(this.DownLine_Event);this.udpServer.ErrorAppear new SocketUdpServer.OnCompleteHander(this.Error_Event);this.udpServer.Listen();this.udpClient new SocketUdpClient();this.udpClient.Broadcast(DatagramType.OnLine);}/// summary/// 上线增加用户/// /summary/// param namehost用户主机/paramprivate void AddUser(string host){this.ilbUserList.Items.Add(host, 0);}/// summary/// 下线减少用户/// /summary/// param namehost用户主机在列表的序号 懒了以下 应该将回调的委托参数定义为int的这里用了string 到程序需要转化为Int/paramprivate void RemoveUser(string hostIndex){this.ilbUserList.Items.RemoveAt(Convert.ToInt32(hostIndex));}#endregion#region Event/// summary/// 上线事件/// /summary/// param namesocket/param/// param namee/paramprivate void OnLine_Event(SocketUdpServer socket, EventArgs e){string host socket.Message;//如果该上线的用户在局域网列表中不存在if (!LanList.CurrentLanList.Exists(x x.Host host)){while (!this.IsHandleCreated) ;this.ilbUserList.Invoke(new MyInvoke(this.AddUser), host);//将上线用户添加进静态的局域网列表LanList.CurrentLanList.Add(new LanInfo(){Host host,State TalkState.Waiting,RemoteEndPoint socket.RemoteEndPoint});}}/// summary/// 下线事件/// /summary/// param namesocket/param/// param namee/paramprivate void DownLine_Event(SocketUdpServer socket, EventArgs e){string host socket.Message;if (LanList.CurrentLanList.Exists(x x.Host host)){///判断是否是自己的主机下线 如果是自己的 则不需要操作if (string.Compare(Dns.GetHostName(), host) ! 0){this.ilbUserList.Invoke(new MyInvoke(this.RemoveUser), LanList.CurrentLanList.FindIndex(x x.Host host).ToString());//将该用户从局域网列表中移除LanList.CurrentLanList.RemoveAll(x x.Host host);}}}/// summary/// 出现错误的事件/// /summary/// param namesocket/param/// param namee/paramprivate void Error_Event(SocketUdpServer socket, EventArgs e){XtraMessageBox.Show(socket.Message);}private void ilbUserList_DoubleClick(object sender, EventArgs e){//XtraMessageBox.Show(ilbUserList.SelectedItem.ToString());string host ilbUserList.SelectedItem.ToString();///打开窗口 设置为正在交谈LanList.SetTalkState(host, TalkState.Talking);(new FrmTalk(host)).Show();}/// summary/// 窗体关闭事 进行下线广播/// /summary/// param namesender/param/// param namee/paramprivate void FrmUser_FormClosed(object sender, FormClosedEventArgs e){this.udpClient.Broadcast(DatagramType.DownLine);this.udpServer.Stop();Application.Exit();}/// summary/// 刷新按钮/// /summary/// param namesender/param/// param namee/paramprivate void btnRefresh_Click(object sender, EventArgs e){//刷新 情况列表中的数据 重新上线广播this.ilbUserList.Items.Clear();LanList.CurrentLanList.Clear();this.udpClient.Broadcast(DatagramType.OnLine);}#endregion     该页面主要是在线用户列表页面同时监听其它软件发来的上线下线获取主机信息等数据报维护当前在线的用户 和聊天状态 View Code #region Field/// summary/// 自己的socket 充当服务器 接收消息/// /summaryprivate SocketUdpServer selfSocket null;/// summary/// 对话的socket/// /summaryprivate SocketUdpClient tallSocket null;/// summary/// 谈话对方的局域网信息/// /summaryprivate LanInfo talkLan null;/// summary/// 当前用户主机/// /summaryprivate string currentUserHost ;/// summary/// 对控件操作 在非主线程下需要调用此代理/// /summaryprivate delegate void MyInvoke(string user,string message);#endregion#region Constructor/// summary/// 通过远端主机名打开窗体/// /summary/// param namehost/parampublic FrmTalk(string host){InitializeComponent();if (this.talkLan null){ this.talkLan LanList.CurrentLanList.Find(x x.Host host);}this.currentUserHost Dns.GetHostName();this.Text 正在和 host 聊天中;this.Initializion();}/// summary/// 通过远端 端点打开窗体/// /summary/// param nameremotePoint/parampublic FrmTalk(EndPoint remotePoint){this.talkLan LanList.CurrentLanList.Find(x string.Compare(x.RemoteEndPoint.ToString(), remotePoint.ToString()) 0);(new FrmTalk(talkLan.Host)).Show();}#endregion#region Method/// summary/// 初始化方法/// /summaryprivate void Initializion(){this.selfSocket SocketUdpServer.Instance;///绑定收到信息事件this.selfSocket.OnChatComplete new SocketUdpServer.OnCompleteHander(this.ReceiveEvent);//给谈话的socket初始化endpointthis.tallSocket new SocketUdpClient(this.talkLan.RemoteEndPoint);}/// summary/// 加载未读的信息/// /summaryprivate void LoadUnReadMessage(){QueueMessageInfo queque QueueMessage.GetAndRemove(talkLan.Host);MessageInfo messageInfonull;if (queque ! null){while (queque.Count 0){//出队列messageInfo queque.Dequeue();this.lbxMessage.Items.Add(talkLan.Host messageInfo.ReceiveTime.ToString(yyyy-MM-dd HH:mm:ss));this.lbxMessage.Items.Add(messageInfo.Message);}}}/// summary/// 添加一行 在listboxcontrol中/// /summary/// param namename显示的用户/param/// param namemessage消息/paramprivate void AddLine(string name,string message){this.lbxMessage.Items.Add(name DateTime.Now.ToString(yyyy-MM-dd HH:mm:ss));this.lbxMessage.Items.Add(message);}/// summary/// 发送信息 由键盘回车和发送按钮调用/// /summaryprivate void SendMessage(){try{string message this.memInput.Text;if (string.IsNullOrEmpty(message)){XtraMessageBox.Show(发送信息不能为空);}else{this.tallSocket.Send(message);this.AddLine(我, message);this.memInput.Text ;}}catch (Exception ex){XtraMessageBox.Show(ex.Message);}}#endregion#region Event/// summary/// 表单加载/// /summary/// param namesender/param/// param namee/paramprivate void FrmTalk_Load(object sender, EventArgs e){this.LoadUnReadMessage();}/// summary/// 接收信息回调事件/// /summary/// param namesocket/param/// param namee/paramprivate void ReceiveEvent(SocketUdpServer socket, EventArgs e){//判断 远端的网络端点是否是当前的 打开的窗体if (string.Compare(this.talkLan.RemoteEndPoint.ToString(), socket.RemoteEndPoint.ToString()) 0){this.lbxMessage.Invoke(new MyInvoke(this.AddLine), this.talkLan.Host, socket.Message);}}/// summary/// 信息发送按钮/// /summary/// param namesender/param/// param namee/paramprivate void btnSend_Click(object sender, EventArgs e){this.SendMessage();}private void FrmTalk_FormClosed(object sender, FormClosedEventArgs e){//将其设置为非交谈状态LanList.SetTalkState(talkLan.Host, TalkState.Waiting);}private void memInput_KeyDown(object sender, KeyEventArgs e){///按下回车事件if (e.KeyCode Keys.Enter){this.SendMessage();}}#endregion     该页面就是聊天页面主要是对相应的host进行通信聊天发送和接收聊天信息根据聊天窗口设置状态啊之类的   View Code #region Method#region 停止当前监听和断开线程/// summary/// 停止当前服务器的监听和断开线程/// /summarypublic void Stop(){this.listenThread.Abort();this.listenSocket.Close();}#endregion#region 监听/// summary/// 开始监听/// /summarypublic void Listen(){ThreadStart method new ThreadStart(this.ListenMethod);this.listenThread new Thread(method);this.listenThread.Start();}/// summary/// 监听的方法/// /summaryprivate void ListenMethod(){try{this.listenSocket new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPEndPoint ipep new IPEndPoint(IPAddress.Any, this.port);this.listenSocket.Bind(ipep);//定义一个网络端点IPEndPoint sender new IPEndPoint(IPAddress.Any, 0);//定义要发送的计算机的地址EndPoint remote (EndPoint)(sender);//远程///持续监听while (true){byte[] data new byte[1024];//准备接收int recv this.listenSocket.ReceiveFrom(data, ref remote);string stringData Encoding.UTF8.GetString(data, 0, recv);//将接收到的信息转化为自定义的数据报类Datagram recvicedataGram Datagram.Convert(stringData);this.message recvicedataGram.Message;string remotePoint remote.ToString();string remoteip remotePoint.Substring(0, remotePoint.IndexOf(:));remote new IPEndPoint(IPAddress.Parse(remoteip), this.port);this.remoteEndPoint remote;this.Action(recvicedataGram.Type);}}catch (Exception ex){this.message ex.Message;this.ErrorAppear(this, new EventArgs());}}/// summary/// 收到数据报后的动作/// /summary/// param nametype数据报的类型/paramprivate void Action(DatagramType type){switch (type){case DatagramType.OnLine:Datagram sendDataGram new Datagram{Type DatagramType.GiveInfo,FromAddress ,ToAddress ,Message Dns.GetHostName()};//告诉对方自己的信息this.listenSocket.SendTo(Encoding.UTF8.GetBytes(sendDataGram.ToString()), this.remoteEndPoint);this.OnLineComplete(this, new EventArgs());break;case DatagramType.GiveInfo:///执行添加上线用户事件this.OnLineComplete(this, new EventArgs());break;case DatagramType.DownLine:///执行用户下线事件///如果是自己下线if (string.Compare(Dns.GetHostName(), message) 0){System.Windows.Forms.Application.Exit();}else{this.DownLineComplete(this, new EventArgs());}break;case DatagramType.Chat://得到当前要交谈的用户LanInfo lanInfo LanList.CurrentLanList.Find(x string.Compare(this.remoteEndPoint.ToString(), x.RemoteEndPoint.ToString()) 0);//如果有查询到该用户在自己这边登记过if (lanInfo ! null){if (lanInfo.State TalkState.Talking){//正在交谈 直接打开这次窗口this.OnChatComplete(this, new EventArgs());}else { //没有交谈 将窗口加入信息的队列MessageInfo messageInfo new MessageInfo(){Message this.message,ReceiveTime DateTime.Now,RemoteEndPoint this.remoteEndPoint};QueueMessage.Add(lanInfo.Host, messageInfo);}}break;}}#endregion#endregion     充当服务器的 socket的监听定义一些监听事件在form里面使用该事件就可以了 View Code #region Delegate Event/// summary/// 完成一个socket的代理/// /summary/// param namesender/param/// param namee/parampublic delegate void OnCompleteHander(SocketUdpServer sender, EventArgs e);/// summary/// 完成收到一个主机信息 即上线事件/// /summarypublic event OnCompleteHander OnLineComplete;/// summary/// 完成下线事件/// /summarypublic event OnCompleteHander DownLineComplete;/// summary/// 完成一次谈话 就一条信息/// /summarypublic event OnCompleteHander OnChatComplete;/// summary/// 有错误出现/// /summarypublic event OnCompleteHander ErrorAppear;#endregion     用户上线事件下线事件或者主机事件chat聊天事件再服务器接收到信息后 感觉信息分类执行不同的事件      在CHAT类型的数据报重要注意的是当有数据过来接收到  但是该主机窗口并未打开时要将要收到信息加入一个未读的信息队列中当再次开发对该用户的聊天窗口时先要加载相应的未读信息队列这样可以简单的实现离线信息的发送 接下来看下信息数据报的格式 View Code /****************************************************************** 定义广播的数据格式* TypeOnLine,FromAdressxxx,ToAdresszzz,Messagemmm* 类型为上线广播 从xxx主机到zzz主机 信息是mmm * CHAT这个就是我的信息我的信息 可能有各种,的字符串* 这种就直接将CHAT去掉后 后面的都为mmm*****************************************************************//// summary/// 定义数据报里面的几个字段/// /summarypublic class Datagram{#region Property/// summary/// 数据报的类型 ,/// /summarypublic DatagramType Type{get;set;}/// summary/// 发送者的网络地址/// /summarypublic string FromAddress{get;set;}/// summary/// 接收者网络地址/// /summarypublic string ToAddress{get;set;}/// summary/// 数据报的信息/// /summarypublic string Message{get;set;}/// summary/// 信息 Message的长度/// /summarypublic int Length{get {return this.Message.Length;}}#endregion#region Method/// summary/// 重写下ToString/// /summary/// returns/returnspublic override string ToString(){StringBuilder sb new StringBuilder();sb.AppendFormat(Type{0},, this.Type.ToString());sb.AppendFormat(FromAddress{0},, this.FromAddress.ToString());sb.AppendFormat(ToAddress{0},, this.ToAddress.ToString());sb.AppendFormat(Message{0}, this.Message.ToString());return sb.ToString();}/// summary/// 将有效字符串转化成数据报/// /summary/// param namestr/param/// returns/returnspublic static Datagram Convert(string str){Datagram data new Datagram();//前面不是CHAT主要是建立连接 取消连接等信号传送if (!str.StartsWith(CHAT)){IDictionarystring, string idict new Dictionarystring, string();string[] strlist str.Split(,);for (int i 0; i strlist.Length; i){//数据报字符串的各个键值对放进字典类string[] info strlist[i].Split();idict.Add(info[0], info[1]);}data.Type (DatagramType)Enum.Parse(typeof(DatagramType), idict[Type]);data.FromAddress idict[FromAddress];data.ToAddressidict[ToAddress];data.Message idict[Message];}else {data.Type (DatagramType)Enum.Parse(typeof(DatagramType), Chat);data.Message str.Substring(4);}return data;}#endregion}#region Enum/// summary/// 数据报的类型/// /summarypublic enum DatagramType{ /// summary/// 上线 一应一答/// /summaryOnLine1,/// summary/// 下线 一应/// /summaryDownLine,/// summary/// 确认收到 一应/// /summary/// summary/// 正常聊天 一应一答/// /summaryChat,/// summary/// 给予个人的信息/// /summaryGiveInfo}#endregion 简单的定义一下发送的数据报的格式  可能发送的几种类型 上线主要用于软件刚刚开启时向局域网内发送上线广播 下线软件在关闭之前再向局域网内发送一次下线广播 给出主机信息用于收到上线广播后  再返回一个自己主机信息给对方让让对方知道局域网中这台主机是上线的 聊天就是平常的通信  这里特别注意的是为考虑到聊天中也会出来,  这两个协定的字符串所以 开头加CHAT  表示纯粹聊天的数据报 View Code /// summary/// udp的客户端 主要用户发送数据/// /summarypublic class SocketUdpClient{#region Feild/// summary/// 广播的socket/// /summaryprivate Socket broadcastSocket;/// summary/// 服务器的端口/// /summaryprivate int port;/// summary/// 远端的端点/// /summaryprivate EndPoint remoteEndPoint null;/// summary/// 当前客户端/// /summaryprivate Socket client null;#endregion#region Constructor/// summary/// 构造函数/// /summarypublic SocketUdpClient(EndPoint point){this.client new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);this.remoteEndPoint point;}/// summary/// 无参构造函数/// /summarypublic SocketUdpClient(){this.port 9050;}#endregion#region 进行广播/// summary/// 进行广播 上线或者下线/// /summary/// param namemsg广播中发送的信息/parampublic void Broadcast(DatagramType type){this.broadcastSocket new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);IPEndPoint iep new IPEndPoint(IPAddress.Broadcast, this.port);this.broadcastSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);Datagram dataGram new Datagram{Type type,FromAddress ,ToAddress ,Message Dns.GetHostName()};//将要发送的信息改为字节流byte[] data Encoding.ASCII.GetBytes(dataGram.ToString());this.broadcastSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);this.broadcastSocket.SendTo(data, iep);//this.broadcastSocket.Close();}#endregion#region Method/// summary/// 发送数据/// /summary/// param namemessage当前的数据/parampublic void Send(string message){byte[] data Encoding.UTF8.GetBytes(CHAT message);int i client.SendTo(data, this.remoteEndPoint);}#endregion} socket的client代码  实现广播 发送信息     以上简单的逻辑设计代码就基本完成了这个简单的客户端聊天软件 说了那么多接下来看下效果图 本机这边的效果 局域网中另一端的效果  可以实现简单的  通讯 下面是源码下载猛击我去下载它 大家在下载包中可以发现  有两个项目  一个是ITalk他是我最初在写的时候使用的窗体时继承dev的效果稍微好一点 为考虑到各大读者可能没有安装dev所以又一模一样的改了一个ITalkTradition传统的winform 还有源码里面有可能socket的tcp  这块这个主要是因为我刚刚开始的想法是使用tcp但是后来发现请求在线用户聊天之类都比较麻烦就改用了udp不过  本人有精力的话  还是要去试着写写tcp传输文件 这块   这篇文章大致就这样啦如果大家有什么疑问或者建议赶快留言吧还有本源码和软件仅供交流学习用于商业或者实际应用了出了问题概不负责哈            转载于:https://www.cnblogs.com/yyl8781697/archive/2012/12/07/csharp-socket-udp.html
http://www.pierceye.com/news/611393/

相关文章:

  • 上市公司网站建设分析评价网页制作的视频教程
  • 网站营运费网站关键字优化工具
  • 上海企业网站建站中山一站式营销推广平台
  • 想做网站策划怎么做苏州seo关键词排名
  • 中小型企业电子商务网站建设seo优化推广公司
  • 网站开发类型什么意思网页制作与设计千年之恋代码
  • 怎么做公司的网站免费网站建设专业的公司
  • 适合这手机浏览器主页的网站wordpress本地上传服务器
  • 济南百度网站开发寮步镇做网站
  • 营销类型的公司网站专注高密做网站哪家好
  • 公司网站建设找谁做网络渠道
  • 网站建设公司 校园网站html5商城网站
  • 自学it做网站厦门网站推广¥做下拉去118cr
  • 汕头市做网站优化国内时事新闻
  • 网站文章来源seowordpress 搜索 分词
  • 网站建设和网络推广微信开发品牌
  • 湛江网站关键词优化百度推广优化技巧
  • 做盗版网站会怎样网页设计规范2018
  • 做个中英文网站多少钱网页设计图片作品
  • iis7 添加php网站网站为什么需要空间
  • 网站到首页排名h5怎么制作的
  • 网站制作教程 pdf下载培训网站制作网站
  • 网站开发文档范例国外服务器租用价格表
  • 六安网站制作费用怎么做百度提交入口网站
  • centos7做网站做pc端网站讯息
  • 驻马店建设网站安徽全过程网站搭建案例
  • 企业网站推广费用wordpress相册汉化版
  • 怎么做正规网站广告网站设计怎么样
  • 深圳营销型网站公司电话云渲染网站开发
  • 生成网站有吗免费的网站建设服务有哪些内容