




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章服务器功能实现2上章回顾实现数据访问层实现数据实体层实现业务逻辑层实现部门信息维护功能本章目标主窗体实现业务逻辑层-ServerUtil类实现查看在线用户信息窗体实现DataTable的使用主窗体实现-1主窗体功能启动服务停止服务查看在线用户信息信息处理和信息转发主窗体实现-2主窗体所用到的方法:StartServer():启动服务器服务StopServer():停止服务器服务并通知客户端SetText(stringtext):线程安全访问信息显示文本框ServiceClient():接收信息并做出相应的处理StartListening():启动服务器侦听主窗体实现-3全局变量定义//定义客户端集合保存在线用户Hashtableclients=newHashtable();//从配置文件中获取端口号privatestaticintlistenport=Convert.ToInt32(UtilClass.Util.GetPortSetting());//侦听客户端的连接TcpListenerlistener=null;
//处理客户端请求线程privateThreadclientservice;
//侦听客户端请求线程privateThreadthreadListen;
boolstart=false;主窗体实现-4StartServer()实现privatevoidStartServer(){this.Text="Server服务器服务已启动";//设置工具栏状态this.StartServertool.Enabled=false;this.StopServertool.Enabled=true;//设置菜单栏状态this.StartServerMenuItem.Enabled=false;this.StopServerMenuItem.Enabled=true;start=true;
threadListen=newThread(newThreadStart(StartListening));//设置侦听线程
threadListen.Start();//启动侦听线程IPAddress[]ipHostInfo=Dns.GetHostAddresses(Dns.GetHostName());IPAddressipAddress=ipHostInfo[0];
SetText("服务已启动-------"+ipAddress+":"+listenport);}主窗体实现-5SetText()实现SetText()方法的作用:多线程对控件属性的安全访问
delegatevoidSetTextCallback(stringtext);
privatevoidSetText(stringtext){//要执行不在同一线程内的控件的方法,必须使用该控件的Invoke方法if(Showtxt.InvokeRequired){
SetTextCallbackd=newSetTextCallback(SetText);
this.Invoke(d,newobject[]{text});}else{Showtxt.Text+=text+"\r\n";}}主窗体实现-6StopServer()实现
privatevoidStopServer(){this.Text="Server服务器服务已停止";this.StartServertool.Enabled=true;this.StartServerMenuItem.Enabled=true;this.StopServerMenuItem.Enabled=false;this.StopServertool.Enabled=false;Showtxt.Text="服务已停止.....\r\n";foreach(DictionaryEntryalluserinclients){//循环获取客户端对象
Clientcl=(Client)alluser.Value;
ServerUtil.SendToClient(cl,"ServerExit|");//发送服务器停止服务信息
UserInfo.UpdateUserOnLine("",cl.Onlineuser.UserAccount);//更改用户在线状态}listener.stop();listener=null;//终止线程start=false;}主窗体实现-7ServerUtil类SendToClient()功能:向客户端发送信息publicstaticvoidSendToClient(Clientcl,stringclientCommand){try{//将字符串消息转换为字节数组
Byte[]message=Encoding.UTF8.GetBytes(clientCommand);
Sockets=cl.Sock;//定义Socket对象
if(s.Connected)//判断连接状态{
s.Send(message,message.Length,0);//发送信息到客户端}}catch(Exceptionerr){//异常处理return;}}主窗体实现-8StartListening()实现
privatevoidStartListening(){listener=newTcpListener(IPAddress.Parse(Util.GetIPAddress()),listenport);//建立侦听对象,侦听8000端口
listener.Start();//启动侦听
while(start)//循环侦听
{try{
Sockets=listener.AcceptSocket();//接收从客户端发送的连接clientservice=newThread(newParameterizedThreadStart(ServiceClient));clientservice.Start(s);//启动多线程}catch(Exception
err){//异常处理}}listener.Stop();listener=null;}主窗体实现-9ServiceClient()实现-1循环接收客户端发送的信息
privatevoidServiceClient(objectclient){
SocketclientSocket=(Socket)client;boolkeepAlive=true;//循环接收并处理客户端的请求
while(start&&keepAlive){//定义缓冲区
Byte[]buffer=newByte[1024];intbytes=0;stringclientcommand=null;try{//将接收到的信息填充到缓冲区内
bytes=clientSocket.Receive(buffer,0,buffer.Length,SocketFlags.None);//将获取到的信息转换为UTF8编码
clientcommand=Encoding.UTF8.GetString(buffer).Substring(0,bytes);主窗体实现-10ServiceClient()实现-2处理接收到的信息
while(bytes>0&&clientSocket.Available>0){
bytes=clientSocket.Receive(buffer,0,buffer.Length,SocketFlags.None);
clientcommand+=Encoding.UTF8.GetString(buffer).Substring(0,bytes);}}catch(Exceptionerr){//异常处理过程}//判断字符串中是否包含'\0'如果包含则截取。intsub=clientcommand.IndexOf('\0');if(sub>0){clientcommand=clientcommand.Substring(0,sub);}主窗体实现11
ServiceClient()实现-3处理用户请求
//分割字符串string[]tokens=clientcommand.Split(newChar[]{'|'});Clientc=null;stringmessage=null;switch(tokens[0]){
case“Login”:......//处理登录请求
case“show”:......//处理显示信息请求
case“FriendInfo”:......//处理好友资料
case“Modify”:......//处理修改基本资料请求
case“Exit”:......//处理退出请求
case“chat”:......//处理聊天请求}主窗体实现-12ServiceClient()实现-3处理用户登录请求1switch(tokens[0]){case"Login“:EndPointep=client.RemoteEndPoint;
OnLineUseruser=ServerUtil.CreateOnLineUser(tokens[1]);//创建在线用户对象
Clientc=newClient(user,ep,clientservice,client);//创建客户端对象stringIsLogin=ServerUtil.GetUserLogin(tokens[1]);//验证用户登录if(IsLogin=="OK")//验证登录是否成功,验证失败则提示用户登录失败{string[]username=tokens[1].Split('&');
if(!clients.Contains(username[0]))//判断此用户在线状态,如果在线则提示当前用户已经登录{stringip=((IPEndPoint)client.RemoteEndPoint).Address.ToString();//获得用户登录IPstringport=((IPEndPoint)client.RemoteEndPoint).Port.ToString();//获得用户端口号SetText(ip+":"+port);//记录登录用户信息的IPstringmessage="LIST|"+IsLogin;主窗体实现-13ServiceClient()实现-4处理用户登录请求2foreach(DictionaryEntryalluserinclients)//遍历在线用户集合,向所有在线用户发送该用户已登录的信息{Clientcaa=(Client)alluser.Value;
message=ServerUtil.GetOnLineMessage(c.Onlineuser);//根据用户返回此用户登录信息。ServerUtil.SendToClient(caa,message);//发送信息}
clients.Add(username[0],c);//添加到在线用户列表中
UserInfo.UpdateUserOnLine(ip,username[0]);//更改此用户的在线状态ServerUtil.SendToClient(c,message);//向客户端发送消息}else{
ServerUtil.SendToClient(c,“LIST|OnLine”);//发送消息已经在线信息}}else{
ServerUtil.SendToClient(c,“LIST|”+IsLogin);//发送登录失败消息}}主窗体实现-14ServerUtil类CreateOnLineUser()功能:创建新的在线用户对象publicstaticOnLineUserCreateOnLineUser(stringusername){string[]temp=username.Split(‘&’);//拆分字符串
UserInfouserinfo=UserInfo.SelectUserInfo(temp[0]);//根据用户帐号返回用户对象OnLineUseruser=newOnLineUser();//创建在线用户对象实例user.UserAccount=userinfo.UserAccount;//为实例对象赋值user.UserName=userinfo.UserName;user.Sex=userinfo.Sex;user.Email=userinfo.Email;//根据用户所在部门编号,获得部门名称
user.DeptName=DeptInfo.SelectDeptInfo(userinfo.DeptID).DeptName;……
returnuser;//返回对象实例}主窗体实现-15ServerUtil类GetUserLogin()功能:根据用户名和密码验证用户登录
publicstaticstringGetUserLogin(stringstr){stringresult="";string[]user=str.Split('&');//验证客户登录成功返回Ok失败返回NO
result=UserInfo.UserLogin(user[0],user[1]);
returnresult;}主窗体实现-16ServerUtil类GetOnLineMessage()功能:获取上线用户的基本信息publicstaticstringGetOnLineMessage(OnLineUseruser){//注意:这里的上线用户信息用’|’间隔stringmessage="UserOnLine|用户"+user.UserName+"上线了!"+"|UserAccount:"+user.UserAccount+",UserName:"+user.UserName+",NickName:"+user.NickName+",PWD:"+user.Pwd+",Region:"+user.Region+",Sex:"+user.Sex+",Phone:"+user.Phone+",Email:"+user.Email+",MyInfo:"+user.MyInfo+",DeptName:"+user.DeptName+",HeadPic:"+user.HeadPic;returnmessage;}主窗体实现-17ServiceClient()实现-5向客户端发送基本信息
//显示信息case"Show"://从当前在线用户集合对象中查找其信息。Clientc=(Client)clients[tokens[1]];//将获得的信息形成一个字符串传递到客户端stringmessage="Info|"+ServerUtil.GetCorpInfo()
+"|"+ServerUtil.GetDeptInfo()
+"|"+ServerUtil.GetUserInfo(tokens[1])+"|"+ServerUtil.GetOnlineUser();ServerUtil.SendToClient(c,message);//发送到客户端break;主窗体实现-18ServerUtil类GetCorpInfo()功能:获取公司基本信息参数:无返回值:公司名称GetDeptInfo()功能:获取部门基本信息参数:无返回值:部门名称和部门编号GetUserInfo()功能:获取当前用户的基本信息参数:当前用户名返回值:当前用户的详细信息GetOnlineUser()功能:获取当前在线用户的详细信息参数:无返回值:所有在线用户的详细信息主窗体实现-19ServerUtil类GetOnLineUser()功能:获取当前在线用户信息publicstaticstringGetOnLineUserInfo(stringuseraccount,Hashtableclients){
StringBuilderstr=newStringBuilder();//定义可变字符字符串foreach(DictionaryEntryclientvalueinclients){if(useraccount!=clientvalue.Key.ToString()){stringaccount=clientvalue.Key.ToString();
Clientclient=(Client)clientvalue.Value;
OnLineUseruser=(OnLineUser)client.Onlineuser;
str.Append("|"+account+"&UserAccount:"+user.UserAccount+",UserName:"+user.UserName+",NickName:"+user.NickName+",PWD:"+user.Pwd+",Region:"+user.Region+",Sex:"+user.Sex+",Phone:"+user.Phone+",Email:"+user.Email+",MyInfo:"+user.MyInfo+",DeptName:"+user.DeptName+",HeadPic:"+user.HeadPic);}}returnstr.ToString();}主窗体实现-20ServiceClient()实现-6处理聊天请求
//是否是聊天请求case"Chat"://分割字符串’$’string[]tempincept=tokens[3].Split('$');//获取聊天信息接收者对象
Clientincept=(Client)clients[tempincept[0]];//处理聊天信息stringmessage="Chat|"+tokens[1]+"|"+tokens[2];//将信息转发到接收者ServerUtil.SendToClient(incept,message);break;主窗体实现-21ServiceClient()实现-7处理用户下线请求
//下线通知case"Exit":Clientc=(Client)clients[tokens[1]];//循环遍历在线用户集合发送用户下线通知foreach(DictionaryEntryalluserinclients){//获取下线用户对象
Clientcaa=(Client)alluser.Value;//获取用户下线信息
stringmessage=ServerUtil.GetExitMessage(c.Onlineuser);ServerUtil.SendToClient(caa,message);}//从在线用户集合中移除下线用户
clients.Remove(tokens[1]);
UserInfo.UpdateUserOnLine("",tokens[1]);//修改用户在线状态break;主窗体实现-22ServerUtil类GetExitMessage()功能:获取下线用户的基本信息参数:OnLineUser对象实例返回值:下线信息
publicstaticstringGetExitMessage(OnLineUseruser){stringmessage="UserExit|用户"+user.UserName+"下线了!"+"|UserAccount:"+user.UserAccount+",UserName:"+user.UserName;returnmessage;}主窗体实现-23演示主窗体运行效果查看在线用户窗体实现-1功能介绍查看当前在线用户的详细信息使用DataTable对象使用DataGridView控件查看在线用户窗体实现-2DataGridView控件将数据绑定到DataGridView控件非常简单和直观,在大多数情况下,只需设置DataSource属性即可。在绑定到包含多个列表或表的数据源时,只需将DataMember属性设置为指定要绑定的列表或表的字符串即可。
//查看在线用户信息窗体加载事件privatevoidShowOnlineUserFrm_Load(objectsender,EventArgse){//为DataGridView控件绑定数据
this.UserInfoview.DataSource=GetData();
}查看在线用户窗体实现-3GetData()方法实现-1向DataTable中添加列privateDataTableGetData(){//定义集合保存在线用户列表
ArrayListlist=UserInfo.SelectUserInfo(true);//定义DataTable数据对象
DataTableOnlineUser=newDataTable();DataColumncolumn;//定义列DataRowrow;//定义行string[]CName={"账号","姓名","昵称","性别","电话","电邮","来自","部门"};for(inti=0;i<CName.Length;i++){column=newDataColumn();column.ColumnName=CName[i];//定义列名column.MaxLength=30;//定义列宽
OnlineUser.Columns.Add(column);//添加列}查看在线用户窗体实现-4GetData()方法实现-2向DataTable中添加记录//循环添加记录for(inti=0;i<list.Count;i++){
row=OnlineUser.NewRow();//定义行对象row["账号"]=((UserInfo)list[i]).UserAccount;row["姓名"]=((UserInfo)list[i]).UserName;row["昵称"]=((UserInfo)list[i]).NickName;row["性别"]=Util.CheckSex(((UtilClass.UserInfo)list[i]).Sex);row["电话"]=((UtilClass.UserInfo)list[i]).Phone;row["电邮"]=((UtilClass.UserInfo)list[i]).Email;row["来自"]=((UtilClass.UserInfo)list[i]).Region;row["部门"]=DeptInfo.SelectDeptInfo(((UserInfo)list[i]).DeptID).DeptName;
OnlineUser.Rows.Add(row);//将每一行记录添加到表集合对象中}
returnOnlineUser;//返回DataTable对象}查看在线用户窗体实现-5举例演示DataTable和DataGridView控件的联合使用总结实现服务器主窗体实现业务逻辑层-ServerUtil类查看在线用户信息窗体实现DataTable的使用第一节活塞式空压机的工作原理第二节活塞式空压机的结构和自动控制第三节活塞式空压机的管理复习思考题单击此处输入你的副标题,文字是您思想的提炼,为了最终演示发布的良好效果,请尽量言简意赅的阐述观点。第六章活塞式空气压缩机
piston-aircompressor压缩空气在船舶上的应用:
1.主机的启动、换向;
2.辅机的启动;
3.为气动装置提供气源;
4.为气动工具提供气源;
5.吹洗零部件和滤器。
排气量:单位时间内所排送的相当第一级吸气状态的空气体积。单位:m3/s、m3/min、m3/h第六章活塞式空气压缩机
piston-aircompressor空压机分类:按排气压力分:低压0.2~1.0MPa;中压1~10MPa;高压10~100MPa。按排气量分:微型<1m3/min;小型1~10m3/min;中型10~100m3/min;大型>100m3/min。第六章活塞式空气压缩机
piston-aircompressor第一节活塞式空压机的工作原理容积式压缩机按结构分为两大类:往复式与旋转式两级活塞式压缩机单级活塞压缩机活塞式压缩机膜片式压缩机旋转叶片式压缩机最长的使用寿命-
----低转速(1460RPM),动件少(轴承与滑片),润滑油在机件间形成保护膜,防止磨损及泄漏,使空压机能够安静有效运作;平时有按规定做例行保养的JAGUAR滑片式空压机,至今使用十万小时以上,依然完好如初,按十万小时相当于每日以十小时运作计算,可长达33年之久。因此,将滑片式空压机比喻为一部终身机器实不为过。滑(叶)片式空压机可以365天连续运转并保证60000小时以上安全运转的空气压缩机1.进气2.开始压缩3.压缩中4.排气1.转子及机壳间成为压缩空间,当转子开始转动时,空气由机体进气端进入。2.转子转动使被吸入的空气转至机壳与转子间气密范围,同时停止进气。3.转子不断转动,气密范围变小,空气被压缩。4.被压缩的空气压力升高达到额定的压力后由排气端排出进入油气分离器内。4.被压缩的空气压力升高达到额定的压力后由排气端排出进入油气分离器内。1.进气2.开始压缩3.压缩中4.排气1.凸凹转子及机壳间成为压缩空间,当转子开始转动时,空气由机体进气端进入。2.转子转动使被吸入的空气转至机壳与转子间气密范围,同时停止进气。3.转子不断转动,气密范围变小,空气被压缩。螺杆式气体压缩机是世界上最先进、紧凑型、坚实、运行平稳,噪音低,是值得信赖的气体压缩机。螺杆式压缩机气路系统:
A
进气过滤器
B
空气进气阀
C
压缩机主机
D
单向阀
E
空气/油分离器
F
最小压力阀
G
后冷却器
H
带自动疏水器的水分离器油路系统:
J
油箱
K
恒温旁通阀
L
油冷却器
M
油过滤器
N
回油阀
O
断油阀冷冻系统:
P
冷冻压缩机
Q
冷凝器
R
热交换器
S
旁通系统
T
空气出口过滤器螺杆式压缩机涡旋式压缩机
涡旋式压缩机是20世纪90年代末期开发并问世的高科技压缩机,由于结构简单、零件少、效率高、可靠性好,尤其是其低噪声、长寿命等诸方面大大优于其它型式的压缩机,已经得到压缩机行业的关注和公认。被誉为“环保型压缩机”。由于涡旋式压缩机的独特设计,使其成为当今世界最节能压缩机。涡旋式压缩机主要运动件涡卷付,只有磨合没有磨损,因而寿命更长,被誉为免维修压缩机。
由于涡旋式压缩机运行平稳、振动小、工作环境安静,又被誉为“超静压缩机”。
涡旋式压缩机零部件少,只有四个运动部件,压缩机工作腔由相运动涡卷付形成多个相互封闭的镰形工作腔,当动涡卷作平动运动时,使镰形工作腔由大变小而达到压缩和排出压缩空气的目的。活塞式空气压缩机的外形第一节活塞式空压机的工作原理一、理论工作循环(单级压缩)工作循环:4—1—2—34—1吸气过程
1—2压缩过程
2—3排气过程第一节活塞式空压机的工作原理一、理论工作循环(单级压缩)
压缩分类:绝热压缩:1—2耗功最大等温压缩:1—2''耗功最小多变压缩:1—2'耗功居中功=P×V(PV图上的面积)加强对气缸的冷却,省功、对气缸润滑有益。二、实际工作循环(单级压缩)1.不存在假设条件2.与理论循环不同的原因:1)余隙容积Vc的影响Vc不利的影响—残存的气体在活塞回行时,发生膨胀,使实际吸气行程(容积)减小。Vc有利的好处—
(1)形成气垫,利于活塞回行;(2)避免“液击”(空气结露);(3)避免活塞、连杆热膨胀,松动发生相撞。第一节活塞式空压机的工作原理表征Vc的参数—相对容积C、容积系数λv合适的C:低压0.07-0.12
中压0.09-0.14
高压0.11-0.16
λv=0.65—0.901)余隙容积Vc的影响C越大或压
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年3月湖北东津国投集团及子公司社会招聘拟聘用人员考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025贵州普定县自然资源局招聘城镇公益性岗位人员考前自测高频考点模拟试题及答案详解(历年真题)
- 2025广东清远市英德市建筑工程检测站有限公司招聘员工1人模拟试卷及一套完整答案详解
- 2025黑龙江黑河市爱辉区花园社区卫生服务中心招聘非事业编制人员7人考前自测高频考点模拟试题及参考答案详解一套
- 2025南平延平太平镇卫生院招聘药房工作人员考前自测高频考点模拟试题及答案详解(新)
- 2025年菏泽市牡丹区公开招聘教师(110人)考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025年烟台市教育局所属事业单位卫生类岗位公开招聘工作人员(2人)模拟试卷有答案详解
- 2025恒丰银行成都分行春季校园招聘考前自测高频考点模拟试题及答案详解(夺冠)
- 2025福建漳州市供电服务有限公司招聘39人模拟试卷及参考答案详解1套
- 美国足球课件
- 2025年人教版8年级数学上册《三角形》章节练习试卷
- 金缕玉衣教学课件
- 岗前安全教育培训考试题及答案解析
- SMS安全管理体系培训课件
- 电子商务运营推广数据化分析模板
- 北京外汇交易知识培训课件
- 喷漆技师基础知识培训课件
- 一级实验室生物安全手册
- 冲孔灌注桩施工方案
- GB/T 15566.8-2007公共信息导向系统设置原则与要求第8部分:宾馆和饭店
- 2022届东北三省四市暨沈阳市高考二模(解析版)
评论
0/150
提交评论