计算机网络课程设计任务书学院计算机与信息工程学院专业物联网工程课程名称计算机网络题目基于C/S的简单聊天程序完成期限自2014年6月9日至2014年6月16日共1周内容及任务一、项目的目的利用socket。实现客户与服务器间的信息互通。二、项目任务的主要内容和要求(1)首先,设计一个登录程序。验证通过后才能进入聊天室。(2)用户聊天室具有群发,私聊,输入昵称与端口号等基本设置。点击“连接”按钮实现与服务器的连接。点击“断开”按钮实现与服务器的断开连接。(3)服务器聊天室具有启动服务器,停止服务器,显示当前在线的用户功能。点击“启动”按钮实现与服务器的连接。点击“停止”按钮实现与服务器的断开连接。(4)当服务器与客户机连接成功后。能够互相接受和发送消息。当多个客户机启动时,服务器会创建子线程处理对应线程的消息。三、项目设计(研究)思路(1)设计步骤:先画出聊天室的模型,布局。(2)设计要点:设计主类与子类,分别实现不同的功能(3)主要技术分析:需要掌握socket通信,swing和awt,io的简单应用.(4)解决思路:先按照草稿图设计出聊天室布局。再写各个类的功能。简单测试与修改代码。最后完善。四、具体成果形式和要求(见第三页)进度起止日期工作内容2014.6.1-2014.6.2绘出聊天室布局草稿图,查看资料安排2014.6.3-2014.6.7编写代码,初步实现各个类的功能,查看资料2014.6.8-2014.6.16查看资料,测试与完善各个功能。主要参考资料1.Java2实用教程(第三版)编著者耿祥义张跃平清华大学出版社20062.Java编程设计编著者刘海杰中国铁道出版社20063.Java网络编程精解编著者孙卫琴电子工业出版社指导教师意见(签字):年月日系(教研室)主任意见(签字):年月日计算机网络课程设计说明书学院名称:计算机与信息工程学院班级名称:2012级物联网工程学生姓名:宋余保学号:2012211466题目:基于C/S的简单聊天室指导教师姓名:赵欢欢起止日期:2014.6.9-2014.6.15一、选题背景使用Socket实现网上聊天功能。用户可以通过客户端连接到服务器端并进行网上聊天。聊天时可以启动多个客户端。服务器端启动后,接收客户端发来的用户名和密码验证信息。验证通过则以当前的聊天客户列表信息进行响应;此后接收客户端发来的聊天信息,转发给客户端指定的聊天客户(即私聊)或所有其他客户端;在客户断开连接后公告其退出聊天系统的信息。客户端启动后在GUI界面接收用户输入的服务器端信息、账号和密码等验证客户的身份。验证通过则显示当前系统在线客户列表。客户可以与指定对象进行私聊,也可以向系统中所有在线客户发送信息。实现本程序需要了解网络基础知识,掌握C/S结构的工作特点,掌握数据结构、高级语言及网络编程知识,可以选择VisualC++、C或Java等语言实现。二、方案设计基于C/S的简单聊天室可以实现用户与服务器间,服务器与多个用户间的通信。聊天室程序通常需要完成以下一些基本功能:(1)登录聊天室;(2)启动服务器;(3)关闭服务器;(4)用户之间的聊天;(5)退出聊天室。本系统其体功能需求如下:(1)聊天室管理员经登录界面登录到管理界而,即系统的服务器端。用户经登录界而都进入聊天大厅。(2)不论是管理员还是用户都需一要在登录界面输入正确的用户名和密码后才可以登录到各自的界面中去。(3)系统的两个主要界面都是为方便管理员和用户操作的。首先,管理员进入到管理界而后可以方便的启动/停止服务器,看到在线用户的信息和聊人信息、。用户进入到聊天大厅中可以聊天,查看服务器状态。(4)一个用户退出聊天室对其他用户不能产生影响,而服务器断开与客户端的连接则所有的用户都失去与服务器的连接。(5)用户的聊天信息录入,重写,发送,接收方便,快捷。(6)服务器状态,聊天信息和在线用户人数及时刷新。(7)聊天室系统运行稳定、安全性高、三、详细设计服务器端(1)首先实现的是服务器的GUI界面,如图3-1所示:图3-1服务器GUI代码如下://构造放法publicServer(){frame=newJFrame(服务器);contentArea=newJTextArea();contentArea.setEditable(false);contentArea.setForeground(Color.blue);txt_message=newJTextField();txt_max=newJTextField(30);txt_port=newJTextField(6666);btn_start=newJButton(启动);btn_stop=newJButton(停止);btn_send=newJButton(发送);btn_stop.setEnabled(false);listModel=newDefaultListModel();userList=newJList(listModel);southPanel=newJPanel(newBorderLayout());southPanel.setBorder(newTitledBorder(写消息));southPanel.add(txt_message,Center);southPanel.add(btn_send,East);leftPanel=newJScrollPane(userList);leftPanel.setBorder(newTitledBorder(在线用户));rightPanel=newJScrollPane(contentArea);rightPanel.setBorder(newTitledBorder(消息显示区));centerSplit=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,leftPanel,rightPanel);centerSplit.setDividerLocation(100);northPanel=newJPanel();northPanel.setLayout(newGridLayout(1,6));northPanel.add(newJLabel(人数上限));northPanel.add(txt_max);northPanel.add(newJLabel(端口));northPanel.add(txt_port);northPanel.add(btn_start);northPanel.add(btn_stop);northPanel.setBorder(newTitledBorder(配置信息));frame.setLayout(newBorderLayout());frame.add(northPanel,North);frame.add(centerSplit,Center);frame.add(southPanel,South);frame.setSize(600,400);//frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());//设置全屏intscreen_width=Toolkit.getDefaultToolkit().getScreenSize().width;intscreen_height=Toolkit.getDefaultToolkit().getScreenSize().height;frame.setLocation((screen_width-frame.getWidth())/2,(screen_height-frame.getHeight())/2);frame.setVisible(true);}(2)其实实现服务器的启动代码如下//启动服务器publicvoidserverStart(intmax,intport)throwsjava.net.BindException{try{clients=newArrayListClientThread();serverSocket=newServerSocket(port);serverThread=newServerThread(serverSocket,max);serverThread.start();isStart=true;}catch(BindExceptione){isStart=false;thrownewBindException(端口号已被占用,请换一个!);}catch(Exceptione1){e1.printStackTrace();isStart=false;thrownewBindException(启动服务器异常!);}(3)再次是实现服务器与客户机连接机制,如果有客户机申请连接,则为此客户机创建线程,代码如下://服务器线程classServerThreadextendsThread{privateServerSocketserverSocket;privateintmax;//人数上限//服务器线程的构造方法publicServerThread(ServerSocketserverSocket,intmax){this.serverSocket=serverSocket;this.max=max;}publicvoidrun(){while(true){//不停的等待客户端的链接try{Socketsocket=serverSocket.accept();if(clients.size()==max){//如果已达人数上限BufferedReaderr=newBufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriterw=newPrintWriter(socket.getOutputStream());//接收客户端的基本用户信息Stringinf=r.readLine();StringTokenizerst=newStringTokenizer(inf,@);Useruser=newUser(st.nextToken(),st.nextToken());//反馈连接成功信息w.println(MAX@服务器:对不起,+user.getName()+user.getIp()+,服务器在线人数已达上限,请稍后尝试连接!);w.flush();//释放资源r.close();w.close();socket.close();continue;}ClientThreadclient=newClientThread(socket);client.start();//开启对此客户端服务的线程clients.add(client);listModel.addElement(client.getUser().getName());//更新在线列表contentArea.append(client.getUser().getName()+client.getUser().getIp()+上线!\r\n);}catch(IOExceptione){e.printStackTrace();}}}}(4)再次是实现服务器的消息发送和接受的处理机制,代码如下:publicvoidrun(){//不断接收客户端的消息,进行处理。Stringmessage=null;while(true){try{message=reader.readLine();//接收客户端消息if(message.equals(CLOSE))//下线命令{contentArea.append(this.getUser().getName()+this.getUser().getIp()+下线!\r\n);//断开连接释放资源reader.close();writer.close();socket.close();//向所有在线用户发送该用户的下线命令for(int