学java也有五个月了吧,学通信也三个月之后,而今我们四人小组用了大概一个月的时间做了这个通信项目,并为其正式命名为“云秘”!,没错,就是云秘,我们的初衷是做一个能集信息收集、管理、查询、共享资源并辅以聊天功能的项目,但是局限于时间不充裕,说来惭愧,现如今只是堪堪实现了其中的些许功能,但是值得欣慰的是我们组每天都在进步,每天都有码代码,即使学校的课程很紧,坚持总会有收获的,既已然收获,便是喜悦的,就不要去计较太多!
说那么多,现步入正题!我们的通信项目并未涉及数据库,所以很多对于数据,信息的处理用的都是对文件的读写操作! 作为一个通信项目,自然我们要有一个服务器!~
//在指定端口上创建一个服务器 public void setUpServer(int port){ try{ ss = new ServerSocket(port); System.out.println("服务器创建成功"); //等待客户机连接,并设置成循环等待状态 while(true){ Socket client=ss.accept(); System.out.println("欢迎进入我的服务器"); //启动一个线程去处理该对象 ServerThread st=new ServerThread(client); st.start(); ChatTools.add(st); } }catch(Exception ef){ ef.printStackTrace(); } }
这个便是我的服务器,因为是服务器,后台的东西,所以并未做过多的界面处理!运用ServerSocket传入端口号建立服务器,循环等待客户机的连接,每当有客户端连接服务器,便启动一个线程来对该客户端与服务器之间的所有互动进行处理,再者用一个队列将该线程保存起来,后面会用到!
服务器的所有关键代码其实都在处理客户端的线程中体现了出来,一个好的服务器必须能有条不紊的处理大量的信息,所以服务器处理客户端的线程类一定要严谨!
//处理客户机进入的连接对象 public void processChat(Socket client){ try{ ins=client.getInputStream(); out=client.getOutputStream(); dis = new DataInputStream(ins); dout=new DataOutputStream(out); int t = dis.readInt(); while (true) { // 如果读到的是1,调用读取消息 if (t == 1) { readMsg(); } // 读到的是2则调用保存注册信息的方法 if (t == 2) { readlogon(); } // 如果读到的是3,则调用核对登陆信息的方法 if (t == 3) { checklogin(); } // 如果读到的是4,则调用群发消息的方法 if (t == 4) { allmsg(); } //如果读到的是5,则调用单聊的方法 if (t == 5) { sendone(); } //如果读到的是6,则调用发送通知的方法 if (t == 6) { sendtxt(); } //如果读到的是7,则调用转发震动的方法 if (t == 7) { readzhen(); } //如果读到8,则调用关闭线程,通知下线的方法 if( t == 8){ closeThread(); } //以下两个是发送表格填写的方法 if(t==HeadConfig.tableQuest){ readTableQuest(); } if(t==HeadConfig.tableContent){ readTableContent(); } t = dis.readInt(); } } catch (Exception ef) { ef.printStackTrace(); } }
不同的协议分别调用不同的方法,一目了然!关于服务器的便说这么多,但是不得不说一个好的系统,服务器十分重要!!!
下面便说一说我们的客户端!
打开客户端,首先是一个登陆界面!
至于为什么用这张图片做背景,因为本人比较喜欢刘诗诗!
因为我们做这个项目刚开始设定的使用单位便是班级,所以我们验证信息时用的学号!在这个登陆界面上,我们在左上角更改了java图标,而我们的注册信息的图标也不是摆设!
我们现在注册了一个名为用户1的用户,当单机注册时,用户名以及账号密码会被发送到服务器去,也就是说在登陆界面打开的时候,其实客户端与服务器已经连接了....而服务器会把客户的信息利用IO流存在txt文件里,至于为什么用文件来村,实在是因为鄙人以及我们的小组目前对数据库知识还未掌握,不过目前正在学习中!!注册完了之后,注册界面会关闭并自动跳转回登陆界面!此时我们只要输入刚才注册的账号密码即可 !
当我们单击登陆界面时,客户机会把输入的账号密码发送到服务器去!!服务器会遍历自己存储客户姓名账号密码的的txt文件
// 定义一个核对登陆信息的方法 public void checklogin() { try { BufferedReader brd = new BufferedReader(new InputStreamReader(ins)); // input为发送过来的账号和密码 String input = brd.readLine(); try { File file = new File(path);// 指定要读取的文件 if (!file.exists()) {// 如果文件不存在则创建 file.createNewFile(); } else { // 获取该文件的缓冲输出流 BufferedReader bufferedreader = new BufferedReader( new FileReader(file)); check(input, bufferedreader);//调用核对信息的方法 bufferedreader.close();// 关闭输出流 } } catch (Exception ef) { ef.printStackTrace(); } } catch (Exception ef) { ef.printStackTrace(); } } // 定义一个核对账号密码的方 public void check(String str, BufferedReader bufferedreader) { String line1=""; try { String line = bufferedreader.readLine(); if (line != null) { if (line.equals(str)) { //如果文件中读到信息与客户端传入的登陆信息匹配,则返回一个right,通过登陆严重 line1 = bufferedreader.readLine(); name=line1; setName(line1); sendcheck("right/"+line1); thsendname.start(); // runjudge.start(); //上线提示 ServerTools.add(line1);// 将登陆的用户名添加到队列里 } else if (!line.equals(str)) { check(str, bufferedreader); } } else { sendcheck("no"); } } catch (Exception ef) { } }
通过验证正是进入属于客户自己的界面了!!!附图如下:
可以看见界面左上角的昵称便是刚才我们注册时的“用户1”;昵称下面便是四个按钮对应四个我们基本实现的功能!
一、 第一个群聊功能---------------------------------------
两个继承了JTextPane的显示框,因为一般的现实框并不能实现对于jif表情图片的现实功能!关于表情的发送以及接受我们也是弄了一段时间,这要感谢组员钟楚斌的贡献!因为表情发送其图片的字符串过来,然后又根据其字符串在本地找到相对于的图片再将其显示在JTextPane上,一个表情的可能是插在一段文字中发送过来的,所以难点就是你要去识别它是表情还是消息!先附上读取带有表情文本的读取方法。
//定义一个读取带有表情的消息的方法 public void readface(String input,JTextPane1 jt_recive){ int in=0; String temp1=""; String temp2= ""; String h1 = "expression//"; String h2 = ".gif"; //如果没有表情 if((in=input.lastIndexOf("\\"))==-1){ jt_recive.insert_text(input); } else{//如果有表情 int mark=-4;//标记上次表情出现的位置 for(int i=0;i<input.length();i++){ if(input.charAt(i)=='\\'){ temp1 = input.substring(mark+4, i); jt_recive.insert_text(temp1); String loc = input.substring(i+1,i+4); int loc_exp = Integer.parseInt(loc); jt_recive.insert_icon(h1+loc_exp+h2); mark=i; } else{ temp2 = input.substring(mark+5, input.length()); } } jt_recive.insert_text(temp2); } jt_recive.insertln(""); }
如此便能成功的读取表情了!看似简单,其中确实颇为费力!
二、进入通知的编辑,浏览界面,默认进入的编辑界面
双击进入编辑界面
读到的是第一条通知,通知是先保存在文件中的,当用户需要浏览时,才从文件中提取通知内容!
再次双击进入的是我们四个功能的总界面,当然你也可以关掉,从刚才我们主界面的四个按钮中分别进入这些界面!
三、就是我们对于数据收集以及能提供客户查询相应信息的版块!!
四、就是我们想实现链接我们学校主页的方法,无奈级数不纯熟,只得弄了个链接wap百度的暂时顶替下
关于网页链接的代码,附上如下:
package 云秘; import java.awt.Color; import java.awt.Desktop; import java.awt.Font; import java.net.URL; import javax.swing.JEditorPane; import javax.swing.JFrame; import javax.swing.event.HyperlinkEvent; import javax.swing.event.HyperlinkListener; public class News extends JFrame implements Runnable{ private JEditorPane newsPane; private String newsURL = "http://m.baidu.com"; public News() { try { newsPane = new JEditorPane(new URL(newsURL)); newsPane.setBackground(Color.orange); } catch (Exception e) { e.printStackTrace(); } newsPane.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { Desktop browser = Desktop.getDesktop(); try { browser.browse(e.getURL().toURI()); } catch (Exception e1) { e1.printStackTrace(); } } } }); newsPane.setEditable(false); add(newsPane); setSize(400,400); setLocation(300,150); setVisible(true); } public void stop(){ this.dispose(); } public void run(){ new News(); } }
当然我们实现的聊天功能不止有群聊,还有单聊!!
当我单击对应的用户时,便弹出与其的对话框,但我们把消息发过去的时候,是把该对象的名字,以及发送的字符串一起发送给服务器的!
jbsend.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { String msg = jt_send.getText(); threadTwo.sendbyte(5); msg=name+"!说:"+msg; threadTwo.sendmsg(msg); String[] mesg=msg.split("!"); threadTwo.readface("我"+mesg[1],jt_recive); jt_send.setText(""); } });
服务器调用转发单聊的方法,首先先根据你发过来对象的名字,找到该对象相对应的线程对象,调用线程的发送方法把你要说的话用他的线程发送给他
//定义一个单独处理指定对象发送消息的方法 public void sendone(){ String input=""; try { BufferedReader brd = new BufferedReader(new InputStreamReader(ins)); String mesg = brd.readLine(); String[] msg=mesg.split("\\!");//截取字符串,按标识符划分成数组 String name=msg[0];//字符串第一部分便是发送过来对象的名字 for(int i=0;i<ChatTools.getsize();i++){//遍历存储线程的队列找到相应的线程调用发送方法 ServerThread st=ChatTools.get(i); if(st.getName().equals(name)){ input=this.getName()+"!"+msg[1]; st.sendbyte(5); st.sendMsg(input); } } }catch (Exception ef) { ef.printStackTrace(); } }
关于读取的方法便是和群聊的方法大同小异了!!
如此一来通信项目也搞了一段落,虽然最终的成果并不如我们预期的一般,但是就目前对通信这一块的掌握情况来说,剩下的那些未解决的东西确实只是时间问题而已!譬如说我们的客户上线的提醒问题,譬如说我们的好友列表的问题,所以说搞项目就该有一个持之以恒的心,成功向来不易,轻易得来的成功便不算成功!!!!!!!!!!!
(再次感谢我们小组的其他三个人——杨星,钟楚斌,朱凌峰)
相关推荐
铅笔头识别数据集,1692张原始训练图,640*640分辨率,91.1%的正确识别率,标注支持coco json格式
高校网络教学的体系规划与创建.docx
SpringBoot的学生心理咨询评估系统,你看这篇就够了(附源码)
内容概要:本文详细介绍了如何使用遗传算法优化BP神经网络,以提高交通流量预测的准确性。文中首先解释了BP神经网络的基本结构及其局限性,即容易陷入局部最优解的问题。随后,作者展示了遗传算法的工作原理,并将其应用于优化BP神经网络的权重和偏置。通过定义适应度函数、选择、交叉和变异等步骤,实现了对BP神经网络的有效改进。实验结果显示,优化后的BP神经网络在交通流量预测中的精度显著高于传统的BP神经网络,特别是在处理复杂的非线性问题时表现出色。 适用人群:对机器学习、深度学习以及交通流量预测感兴趣的科研人员和技术开发者。 使用场景及目标:适用于需要进行精确交通流量预测的应用场景,如智能交通系统、城市规划等领域。主要目标是通过遗传算法优化BP神经网络,解决其易陷入局部最优的问题,从而提高预测精度和稳定性。 其他说明:文中提供了详细的Python代码实现,帮助读者更好地理解和实践这一优化方法。同时,强调了遗传算法在全局搜索方面的优势,以及其与BP神经网络结合所带来的性能提升。此外,还讨论了一些具体的实施技巧,如适应度函数的设计、交叉和变异操作的选择等。 标签1,标签2,标签3,标签4,标签5
内容概要:本文详细介绍了H5U框架在PLC与触摸屏集成方面的应用,特别是在总线伺服控制和跨平台移植方面。文章首先解析了伺服控制的核心代码,如使能模块和绝对定位指令,强调了标准化控制流程的优势。接着讨论了触摸屏交互,通过直接映射PLC的DB块地址简化了数据处理。然后介绍了总线配置,尤其是EtherCAT总线初始化及其容错设计。此外,文章还探讨了框架的移植性和报警处理设计,展示了其在不同PLC品牌间的易用性和高效的故障恢复能力。 适合人群:从事工业自动化领域的工程师和技术人员,特别是有PLC编程经验和需要进行伺服控制系统开发的人群。 使用场景及目标:①快速搭建和调试基于PLC和触摸屏的自动化控制系统;②提高多轴设备的调试效率;③实现跨平台的无缝移植;④优化报警管理和故障恢复机制。 其他说明:该框架不仅提供了详细的代码示例和注释,还包含了丰富的实战经验和最佳实践,使得新手能够快速上手,而资深工程师可以在此基础上进一步创新。
内容概要:本文档《UE5开发.txt》全面介绍了Unreal Engine 5(UE5)的基本概念、安装配置、项目创建、文件结构及常用功能。UE5是一款强大的游戏引擎,支持实时渲染、蓝图创作、C++编程等功能。文档详细描述了UE5的安装步骤,包括硬件要求和环境配置;项目创建过程,涵盖项目模板选择、质量预设、光线追踪等设置;文件结构解析,重点介绍了Config、Content和.uproject文件的重要性。此外,文档深入讲解了蓝图编辑器的使用,包括变量、数组、集合、字典等数据类型的操作,以及事件、函数、宏和事件分发器的应用。蓝图作为一种可视化脚本工具,使开发者无需编写C++代码即可快速创建逻辑,适用于快速开发和迭代。 适合人群:具备一定编程基础的游戏开发者、设计师和对游戏开发感兴趣的初学者,尤其是希望深入了解UE5引擎及其蓝图系
餐馆点菜系统概要设计说明书.doc
5+1档轿车手动变速箱设计说明书.doc
1万吨自来水厂详细设计说明书.doc
wordpress外贸电商企业产品主题 页面展示图https://i-blink.csdnimg.cn/direct/e45b2e2e8e27423eb79bda5f4c1216d7.png
低效林改造作业设计说明书.doc
西门子200smart编程软件V2.8.2.1
135调速器操纵手柄 设计说明书.doc
内容概要:本文档为蓝桥杯全国软件和信息技术专业人才竞赛提供了全面的指导,涵盖竞赛概述、流程与规则、核心考点与备赛策略、实战技巧与避坑指南以及备赛资源推荐。蓝桥杯竞赛由工信部人才交流中心主办,涉及算法设计、软件开发、嵌入式系统、电子设计等领域。文档详细介绍了参赛流程(报名、省赛、国赛、国际赛),并针对软件类和电子类竞赛分别阐述了高频考点和备赛建议。对于软件类,强调了算法与数据结构的重要性,如排序、动态规划、图论等;对于电子类,则侧重于硬件基础和开发工具的使用。此外,还提供了详细的答题策略、常见陷阱规避方法及工具调试技巧。; 适合人群:高校本专科生、研究生,尤其是对算法设计、软件开发、嵌入式系统等领域感兴趣的计算机科学及相关专业的学生。; 使用场景及目标:①帮助参赛选手熟悉竞赛流程和规则,明确各阶段任务;②提供系统的备赛策略,包括高频考点的学习和专项突破;③指导选手掌握实战技巧,避免常见错误,提高答题效率和准确性。; 阅读建议:此文档不仅提供了理论知识,还包含了大量实战经验和备赛资源推荐,建议读者结合自身情况制定个性化的备赛计划,充分利用提供的资源进行练习和准备。
基于行块抽取正文内容的java版本的改进算法.zip
内容概要:本文详细介绍了基于西门子S7-200 PLC和MCGS组态软件的快递分拣系统的设计与实现方法。首先阐述了硬件配置的关键要点,包括IO分配表的具体设置以及传感器和执行机构的连接方式。接着深入解析了PLC程序中的梯形图逻辑,涵盖主传送带的连锁保护、机械臂动作的自保持逻辑和安全复位机制等核心部分。同时探讨了MCGS组态画面的应用,展示了如何通过脚本实现动态效果和数据统计功能。此外,文中还分享了一些调试经验和常见问题的解决方案,如防止传感器抖动、优化数据传输效率等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和组态软件有一定了解的人群。 使用场景及目标:适用于需要构建高效可靠的快递分拣系统的物流企业或相关项目开发者。目标是帮助读者掌握从硬件选型到软件编程的一整套实施流程,确保系统能够稳定运行并达到预期性能指标。 其他说明:文章不仅提供了理论指导,还结合实际案例进行了详细的步骤讲解,有助于读者更好地理解和应用于实践中。
该资源为joblib-0.12.5-py2.py3-none-any.whl,欢迎下载使用哦!
内容概要:本文详细介绍了三种经典的机器学习分类算法——决策树、随机森林和KNN分类器,在Python的sklearn库中的具体实现方法。首先,通过加载鸢尾花数据集进行数据准备,并将其划分为训练集和测试集。接着分别实现了决策树、随机森林和KNN分类器,展示了每种算法的关键参数配置及其对模型性能的影响。对于决策树,重点讨论了max_depth参数的作用以及如何通过可视化工具理解其分裂过程;随机森林部分强调了n_estimators参数的选择和特征重要性的评估;而KNN分类器则着重于特征标准化的重要性和n_neighbors参数的优化。此外,文中还提供了关于模型选择的指导,帮助读者根据不同应用场景选择合适的算法。 适合人群:对机器学习感兴趣的初学者和有一定编程基础的研发人员。 使用场景及目标:①理解并掌握决策树、随机森林和KNN分类器的工作原理;②学会使用sklearn库快速构建和评估分类模型;③能够根据具体问题特点选择最适合的分类算法。 其他说明:本文不仅提供了详细的代码示例,还分享了许多实践经验,如参数调优技巧、模型评估方法等,有助于读者更好地理解和应用这些算法。
带式输送机传动装置设计课程设计说明书.doc