收藏 分销(赏)

软件综合项目工程专业课程设计Socket聊天系统.doc

上传人:二*** 文档编号:4534680 上传时间:2024-09-27 格式:DOC 页数:34 大小:359.54KB
下载 相关 举报
软件综合项目工程专业课程设计Socket聊天系统.doc_第1页
第1页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、目录1.序言42.需求分析52.1系统功效需求52.1.4点歌52.1.5分组管理52.1.6个人信息管理52.1.7用户管理52.1.8视频通话52.2非功效需求:52.2.2网络安全52.3用例分析62.3.1参与者62.3.2用例分析62.3.3系统用例图63.总体设计83.1TCP服务器设置83.2分析类图93.3次序图103.2.1用户私聊次序图103.2.2用户传送文件序列图113.3协作图113.3.1用户私聊协作图113.3.2用户传送文件协作图124.具体设计144.1用户端设计144.2服务端设计144.3多线程设计155.代码实现165.1服务端设计165.2用户端设计1

2、85.3多线程225.3.1服务端多线程225.3.2用户端多线程246.运行和测试256.1用户登录界面256.2输入端口界面256.3服务器统计,在线用户信息。266.4私聊266.4.1登录266.4.2用户给指定好友发送信息。(私聊)276.4.3指定好友接收到好友信息。(私聊信息)276.4.5好友回复我信息286.5群聊286.5.1发送群消息286.5.2好友响应并接收群聊信息29297. 小结308.参考文件31 1.序言 伴随互联网快速发展,网络聊天工具已经作为一个关键信息交流工具,受到越来越多网民青睐。现在,出现了很多很不错聊天工具,其中应用比较广泛有Netmeeting、

3、腾讯QQ、MSN-Messager等等。该系统开发关键包含一个网络聊天服务器程序和一个网络聊天用户程序两个方面。前者经过Socket套接字建立服务器,服务器能读取、转发用户端发来信息,并能刷新用户列表。后者经过和服务器建立连接,来进行用户端和用户端信息交流。其中用到了局域网通信机制原理,经过直接继承Thread类来建立多线程。开发中利用了计算机网络编程基础理论知识,如TCP/IP协议、用户端/服务器端模式(Client/Server模式)、网络编程设计方法等。在网络编程中对信息读取、发送,是利用流来实现信息交换,其中介绍了对实现一个系统信息流分析,包含了部分基础软件工程方法。经过分析这些情况,

4、该局域网聊天工具采取Eclipse为基础开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不停修正和改善,直到形成可行系统本文经过javaSocket实现了一个基于局域网和网络聊天室程序开发-基于javaC/S模式网络聊天室设计和实现。C/S(Client/Server)结构,即大家熟知用户机和服务器结构。它是软件系统体系结构,经过它能够充足利用两端硬件环境优势,将任务合理分配到Client端和Server端来实现,降低了系统通讯开销。现在大多数应用软件系统全部是Client/Server形式两层结构,因为现在软件应用系统正在向分布式Web应用发展,We

5、b和Client/Server应用全部能够进行一样业务处理,应用不一样模块共享逻辑组件;所以,内部和外部用户全部能够访问新和现有应用系统,经过现有应用系统中逻辑能够扩展出新应用系统。这也就是现在应用系统发展方向。关键词:聊天用户端信息服务器端 Java C/S聊天系统 2.需求分析2.1系统功效需求2.1.1实现私聊(一对一):在登陆情况下选择你要聊天好友,进行信息传送,实现相互聊天,这也是本系统最基础功效。2.1.2群聊(一对多):能够实现一对多人聊天。2.1.3大文件传输:在能够聊天基础上,实现通讯多元化,进行文件传输。是通讯双方能够选择传送对方想取得资料。2.1.4点歌2.1.5分组管理

6、2.1.6个人信息管理2.1.7用户管理2.1.8视频通话2.2非功效需求:2.2.1界面友好:界面易操作性,对经典聊天程序界面进行了学习和借鉴,模拟她们界面和常见操作。2.2.2网络安全加密解密为了提升传输安全性,进行加密操作。立即在网络上被她人了窃听消息,也不能得到原始信息,预防个人关键信息和隐私信息被盗。2.3用例分析2.3.1参与者本系统显而易见两个参与者:用户和管理员。2.3.2用例分析从上面需求里进行抽象和提取关键信息,在确定系统边界情况下,选择最基础用例,然后对用例进行描述和细化。使其能完全描述系统功效性需求。2.3.3系统用例图经过对参与者和用例分析,确定她们关系(包含参与者和

7、参与者关系,参与者和用例关系,用例之间关系。)其中用例之间关系是分析中关键,图私聊和群聊全部有socket聊天模块,所以能够确定是包含关系。管理个人信息,包含了分组管理和用户信息管理,其中分组管理和用户信息管理,是个人信息管理子集,所以应该是泛化关系。在文件传输时候,可能会产生信息丢失,造成信息不完整,接收方不能完整收到发送方消息,所以造成发送方重发信息。所以这是扩展关系,因为只有在传输文件失败时候,才能启用重传文件模块。用户所参与模块首先应该登录,在登录系统后,能够私聊和群聊来交流信息。用户能够管理自己信息进行修改自己信息和管理自己分组。为了丰富系统功效我,我们还特意实现了点歌功,和传输文件

8、吸引用户眼光。3.总体设计3.1TCP服务器设置在TCP/IP协议族中,有两个互不相同传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性数据通信。它所做工作包含把应用程序交给它数据分成适宜小块交给下面网络层,确定接收到分组,设置发送最终确定分组超时时钟等。因为运输层提供了高可靠性端到端通信,所以应用层能够忽略全部这些细节。而其次,UDP则为应用层提供一个很简单服务。它只是把称作数据报分组从一台主机发到另一台主机,但并不确保该数据报能抵达另一端。任何须需可靠性必需由应用层来提供。Bind()Socket()Readfrom()等候用户请求处理服务请求Send

9、to()Close()Socket()Bind()Sendto()Readfrom()Close() 服务请求 服务应答服务器用户机 服务器和用户机通讯步骤 3.2分析类图 (系统整齐分析类图)没有类是单独存在,通常和别类协作,发明比单独工作更大语义。所以,除了捕捉系统词汇以外,还要将注意力集中到这些类是怎样在一起工作。使用类图来表示这种协作。确定你建模机制。机制代表了部分你建模系统部分功效和行为,这些功效和行为是一组类、接口和其它事物相互作用结果。对于每个机制,确定类、接口和其它参与这个协作协作。同时确定这些事物之间关系。 用场景来预排这些事物,沿着这条路你将发觉模型中忽略部分和定义错误部分

10、。确定用这些事物内容来填充它们。对于类,开始于取得一个责任(类职责),然后,将它转化为具体属性和方法。3.3次序图3.2.1用户私聊次序图用户在进入系统前首先要输入相互通讯端口号,因为用户机和服务器全部是本机所以不需要寻求IP地址,然后输入用户名新建一个用户,因为没有保留历史统计功效,所以每次进入系统前全部需要新建一个用户。然后输入用户名和密码,在确定用户和密码。登陆成功,选择在线能够聊天好友,输入信息然后发送,达成和好友交流。3.2.2用户传送文件序列图3.3协作图3.3.1用户私聊协作图 强调是发送和接收消息对象之间组织结构。一个协作图显示了一系列对象和在这些对象之间联络和对象间发送和接收

11、消息。对象通常是命名或匿名类实例,也能够代表其它事物实例。3.3.2用户传送文件协作图用户在登录系统后,进入登陆界面,在界面好友框里,选择要传送文件好友,点击传送文件按钮,会弹出选择文件对话框,在对话框里查找你所在文件系统中你要传送文件。然后点击传送。 4.具体设计4.1用户端设计一个网络聊天室运行,首先是要有一个完整稳定服务器端,而且拥有很多个服务器端。客服端要含有实现用户注册和用户登陆,在登陆成功后,要显示出公聊界面,实现聊天功效而且能够发送表情和保留聊天内容和显示聊天统计等功效,在新用户上线和用户下线时要更新每个用户端在线用户列表名,而且能够和在线用户实现一对一私聊功效。在服务器端能够实

12、现不停监听客服连接,而且依据用户端发送过来不一样信息如注册信息,登录信息,公聊信息,私聊信息,退出信息等,服务器端要做出不一样响应,而且要实现数据库操作,如依据用户注册信息保留数据库中,依据登录时发送来用户名和密码检测是否正当用户等。经为每一个连接着用户端建立了一个线程,这个线程好比一根电话线一直等候用户端说话,而信息发送中心就相当于一个总台,一旦有些人打电话进来,就经过电话线把信息传完成了服务器端第一个任务,那么第二个任务也就不难处理了。上面已送到总台,再由总台依据需要将这个信息发送给接收群。这么就意味着,服务器每接收一条信息,就要调用一次信息发送中心方法,并将这条信息发送到全部用户端(或特

13、定某个某多个用户端)。电脑每做一次动作,一个步骤,全部是根据以经用计算机语言编好程序来实施,程序是计算机要实施指令集合,而程序全部全部是用我们所掌握语言来编写。所以大家要控制计算机一定要经过计算机语言向计算机发出命令。侦听服务器发送连接请求,有请求就接收发来信息,并经过短信猫发出去单说,服务器端是为用户端服务,服务内容诸如向用户端提供资源,保留用户端数据等等.用户端能够是任意一台电脑,只要它和服务器端存在连接,而且得到了服务器端授权,就能够使用服务器端服务.象现在就能够了解为baidu网站是服务器端,我们现在使用电脑就是用户端.我们能够使用它服务.4.2服务端设计因为用户端需要同时能够接收信息

14、和发送信息,所以也必需利用多个线程来实现。根本程用于接收用户输入内容并将之发送到服务器端,而一个后台线程将一直接收来自服务器端信息,并将之返回给用户端用户。用户端(Client)或称为用户端,是指和服务器相对应,为用户提供当地服务程序。除了部分只在当地运行应用程序之外,通常安装在一般用户机上,需要和服务端相互配合运行。因特网发展以后,较常见用户端包含了如万维网使用网页浏览器,收寄电子邮件时电子邮件用户端,和即时通讯用户端软件等。对于这一类应用程序,需要网络中有对应服务器和服务程序来提供对应服务,如数据库服务,电子邮件服务等等,这么在用户机和服务器端,需要建立特定通信连接,来确保应用程序正常运行

15、。不过用户端及伺服端关系不见得一定建立在两台分开机器上,同一台机器中也有这种主从关系存在。提供服务伺服端及接收服务用户端也有可能全部在同一台机器上,比如我们在提供网页服务器上实施浏览器浏览本机所提供网页,这么在同一台机器上就同时饰演伺服端及用户端。4.3多线程设计为了能实现一对多通话聊天也就是说间接多对多聊天功效,所以必需在用户端配置和服务端配置时候。实现多线程功效。实现程序并发。和能够降低创建进程是CPU资源浪费。和服务区负荷太重。多线程在用户端能够实现,用户进行群聊,和接收多个好友响应信息。在服务端能够降低创建进程开销。在一个程序中,这些独立运行程序片断叫作“线程”(Thread),利用它

16、编程概念就叫作“多线程处理”。多线程处理一个常见例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等候程序完成了目前任务以后才开始响应。使用线程能够把占据时间长程序中任务放到后台去处理用户界面能够愈加吸引人,这么比如用户点击了一个按钮去触发一些事件处理,能够弹出一个进度条来显示处理进度。程序运行速度可能加紧,在部分等候任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下能够释放部分珍贵资源如内存占用等等。不过假如有大量线程,会影响性能,因为操作系统需要在它们之间切换。更多线程需要更多内存空间。线程可能会给程序带来更多“bug”,所以要

17、小心使用。线程中止需要考虑其对程序运行影响。通常块模型数据是在多个线程间共享,需要预防线程死锁情况发生。5.代码实现5.1服务端设计 public class ServerFrame extends JFrame private JPanel contentPane;private JTextField txtPort;private JLabel lblState;private JTextArea txtAllUsers;/ 集合:用来保留全部登录用户private List allLoginUser = null;public static void main(String args)

18、EventQueue.invokeLater(new Runnable() public void run() try ServerFrame frame = new ServerFrame();/ 严禁用户更改窗体大小frame.setResizable(false);/ 距中frame.setLocationRelativeTo(null);frame.setVisible(true); catch (Exception e) e.printStackTrace(););public ServerFrame() allLoginUser = new ArrayList();initComp

19、onet();public List getAllLoginUser() return allLoginUser;public void setAllLoginUser(List allLoginUser) this.allLoginUser = allLoginUser;private void initComponet() setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 449, 506);contentPane = new JPanel();contentPane.setBorder(new Empty

20、Border(5, 5, 5, 5);setContentPane(contentPane);contentPane.setLayout(null);JPanel panel = new JPanel();panel.setBorder(new TitledBorder(UIManager.getBorder(TitledBorder.border),u670Du52A1u5668u4FE1u606F, TitledBorder.LEADING,TitledBorder.TOP, null, new Color(0, 70, 213);panel.setBounds(10, 10, 421,

21、143);contentPane.add(panel);panel.setLayout(null);JLabel label = new JLabel(u670Du52A1u5668u72B6u6001uFF1A);label.setBounds(48, 38, 81, 23);panel.add(label);lblState = new JLabel(New label);lblState.setBounds(161, 42, 110, 15);panel.add(lblState);JLabel label_1 = new JLabel(u670Du52A1u5668u7AEFu53E3

22、uFF1A);label_1.setBounds(48, 87, 81, 15);panel.add(label_1);txtPort = new JTextField();txtPort.setBounds(161, 84, 110, 21);panel.add(txtPort);txtPort.setColumns(10);JButton btnStart = new JButton(u542Fu52A8u670Du52A1u5668);btnStart.addActionListener(new ActionListener() public void actionPerformed(A

23、ctionEvent e) try startServer(e); catch (IOException e1) / TODO Auto-generated catch blocke1.printStackTrace(););btnStart.setBounds(289, 83, 93, 23);panel.add(btnStart);JPanel panel_1 = new JPanel();panel_1.setBorder(new TitledBorder(null,u5DF2u7ECFu767Bu5F55u7684u7528u6237,TitledBorder.LEADING, Tit

24、ledBorder.TOP, null, null);panel_1.setBounds(20, 163, 411, 299);contentPane.add(panel_1);panel_1.setLayout(new BorderLayout(0, 0);txtAllUsers = new JTextArea();panel_1.add(txtAllUsers, BorderLayout.CENTER);public void updateGui() this.txtAllUsers.setText(null);for (int i = 0; i this.allLoginUser.siz

25、e(); i+) this.txtAllUsers.append(allLoginUser.get(i).getUserName();this.txtAllUsers.append(n);protected void startServer(ActionEvent e) throws IOException / 验证:是否为空验证if (CommValidate.isEmpty(txtPort.getText() JOptionPane.showMessageDialog(null, 端口号不能空);return;/ 端口必需是数字if (!CommValidate.isDigit(txtPo

26、rt.getText() JOptionPane.showMessageDialog(null, 端口号必需是数字);return;/ 1024之上/ 建立一个监听socketint port = Integer.parseInt(txtPort.getText();ServerSocket serverSocket = new ServerSocket(port);ServerListerenThread serverListeren = new ServerListerenThread(serverSocket, this);this.lblState.setOpaque(true);th

27、is.lblState.setForeground(Color.red);this.txtPort.setEnabled(false);/ 禁用5.2用户端设计public class ClientLogin extends JFrame private JPanel contentPane;private JTextField txtLoginUser;private JTextField txtAddress;private JTextField txtPort;private Socket socket;/ 登录用户信息private UserInfo loginUser = null;

28、public UserInfo getLoginUser() return loginUser;public void setLoginUser(UserInfo loginUser) this.loginUser = loginUser;public Socket getSocket() return socket;public void setSocket(Socket socket) this.socket = socket;private ServerSocket serverSocket;public static void main(String args) EventQueue.

29、invokeLater(new Runnable() public void run() try ClientLogin frame = new ClientLogin();frame.setAlwaysOnTop(true);frame.setResizable(false);frame.setVisible(true); catch (Exception e) e.printStackTrace(););public ClientLogin() initComponet();private void initComponet() setDefaultCloseOperation(JFram

30、e.EXIT_ON_CLOSE);setBounds(100, 100, 397, 298);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5);setContentPane(contentPane);contentPane.setLayout(null);JPanel panel = new JPanel();panel.setBorder(new TitledBorder(null, u7528u6237u767Bu5F55,TitledBorder.LEADING, TitledBord

31、er.TOP, null, null);panel.setBounds(10, 10, 369, 244);contentPane.add(panel);panel.setLayout(null);JLabel label = new JLabel(u7528u6237u540DuFF1A);label.setBounds(37, 36, 54, 15);panel.add(label);txtLoginUser = new JTextField();txtLoginUser.setBounds(145, 33, 140, 21);panel.add(txtLoginUser);txtLogi

32、nUser.setColumns(10);JLabel label_1 = new JLabel(u670Du52A1u5668u5730u5740uFF1A);label_1.setBounds(37, 80, 98, 15);panel.add(label_1);txtAddress = new JTextField();txtAddress.setText(localhost);txtAddress.setBounds(145, 77, 140, 21);panel.add(txtAddress);txtAddress.setColumns(10);JLabel label_2 = ne

33、w JLabel(u7AEFu53E3u53F7uFF1A);label_2.setBounds(37, 120, 54, 15);panel.add(label_2);txtPort = new JTextField();txtPort.setText(5555);txtPort.setBounds(145, 117, 140, 21);panel.add(txtPort);txtPort.setColumns(10);JButton btnLogin = new JButton(u767Bu5F55);btnLogin.addActionListener(new ActionListene

34、r() public void actionPerformed(ActionEvent e) try login(e); catch (UnknownHostException e1) / TODO Auto-generated catch blocke1.printStackTrace(); catch (IOException e2) / TODO Auto-generated catch blocke2.printStackTrace(); catch (ClassNotFoundException e3) / TODO Auto-generated catch blocke3.prin

35、tStackTrace(););btnLogin.setBounds(69, 164, 93, 23);panel.add(btnLogin);JButton btnReset = new JButton(u91CDu7F6E);btnReset.setBounds(192, 164, 93, 23);panel.add(btnReset);protected void login(ActionEvent e) throws IOException,ClassNotFoundException / 验证/ 得到GUI界面上数据String userName = this.txtLoginUse

36、r.getText();String serverAddress = this.txtAddress.getText();int serverPort = Integer.parseInt(this.txtPort.getText();NormalClass.serverAddress = serverAddress;NormalClass.sererPort = serverPort;/ 创建一个登录用户String clientIP = NormalClass.splitIp(InetAddress.getLocalHost().toString();int clientPort = No

37、rmalClass.randomPort();loginUser = new UserInfo(userName, null, clientIP, clientPort);loginUser.setImageIndex(int) (Math.random() * 10);/ 向服务器建立一个连接: 请求Socket socket = new Socket(serverAddress, serverPort);/ 发送数据:构建一个数据包DataPacket dataPacket = new DataPacket(ICommands.LOGIN, loginUser,null, new Date

38、(), null);OutputStream out = socket.getOutputStream();ObjectOutputStream objOut = new ObjectOutputStream(out);objOut.writeObject(dataPacket);/ 等候服务器响应InputStream in = socket.getInputStream();ObjectInputStream objIn = new ObjectInputStream(in);dataPacket = (DataPacket) objIn.readObject();if (dataPack

39、et.getCommand().equals(ICommands.LOGIN_SUCCESS) ClientChat chat = new ClientChat(this);chat.setTitle(this.loginUser.getUserName() + 登录了);chat.setVisible(true);this.setVisible(false);objIn.close();objOut.close();socket.close();5.3多线程5.3.1服务端多线程public ServerChatThread(Socket socket, ServerFrame frame)

40、 this.socket = socket;this.frame = frame;this.start();public void run() / 接收用户传过来数据包try inputStream = this.socket.getInputStream();objIn = new ObjectInputStream(inputStream);DataPacket dataPacket = (DataPacket) this.objIn.readObject();/ 用户要干 什么?String command = dataPacket.getCommand();if (command.eq

41、uals(ICommands.LOGIN) / 表示用户要登录UserInfo loginUser = dataPacket.getFromUserInfo();/ 身份验证 (略)保留用户唯一性/ 保留登录用户this.frame.getAllLoginUser().add(loginUser);/ 更新用户最新信息this.frame.updateGui();/ 发送一个信息过去dataPacket.setCommand(ICommands.LOGIN_SUCCESS);dataPacket.setFromUserInfo(null);dataPacket.setToUserInfo(lo

42、ginUser);this.outPutStream = this.socket.getOutputStream();this.objOut = new ObjectOutputStream(this.outPutStream);this.objOut.writeObject(dataPacket);/ 向每个登录用户发送最新登录用户集合sendAllUserInfo(); else if (command.equals(ICommands.CLOSE_CLIENT_WINDOW) / 用户要关闭了UserInfo unLoginUser = dataPacket.getFromUserInfo();this.frame.getAllLoginUser().remove(unLoginUser);this.frame.updateGui();/ 给用户dataPacket.setCommand(ICommands.CLOSE_CLIENT_WINDOW_SUCCESS);this.outPutStream = this.socket.getOutputStream();this.objOut = new ObjectOutputStream(this.outPutS

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服