本科毕业设计-java—课程设计报告聊天小程序

课程设计说明书课程名称:Java程序设计专业:班级:设计人:2015年 1月 14 日课程设计任务书一、课程设计题目:聊天小程序二、设计原始资料:1、雍俊海,《Java程序设计教程》,清华大学出版社,2007;2、耿祥义,张跃平,《Java 2 实用教程》,清华大学出版社;3、张跃平,耿祥义,《Java 2 实验指导》,清华大学出版社;三、设计应解决下列各主要问题:1、用图形用户界面;(使用socket通信)2、能实现一个聊天室中的多人聊天;3、可以实现两个私聊;四、设计说明书应附有下列图纸:运行结果截图五、小组分工说明:六、命题发出日期:2014.12.29 设计完成日期: 2015.1.14指导教师评语成绩:指导教师(签章):年月日目录1需求分析说明 (1)1.1背景 (1)1.2 功能要求 (1)1.3 运行环境 (1)1.4功能实现 (1)2概要设计说明 (2)2.1 模块调用图 (2)2.2 套接字连接示意图 (2)2.3 主要函数声明 (2)3详细设计说明 (4)3.1功能描述 (4)3.2 主要功能详述 (4)3.3 主要代码分析 (5)4调试分析 (9)4.1遇到的问题 (9)4.2 测试结果分析 (10)5用户使用说明 (10)6课程设计总结 (12)7附录 (13)1 需求分析说明1.1 背景在当今的信息时代,越来越多的聊天工具被应用,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。

此课程设计的题目是聊天小程序,巩固所学的Java语言基本知识,增进Java语言编辑基本功,拓宽常用类库的应用。

使我们把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法。

1.2 功能要求1、使用图形用户界面。

2、能实现一个聊天室中多人聊天。

3、可以两人私聊。

1.3 运行环境本程序基于Java和Eclipse开发环境,可以在一般的装有Windows系统的主机上运行。

1.4 功能实现程序实现了聊天室的基本功能,其中有:1、启动服务器。

2、进入客户端界面。

3、登录聊天室。

4、发送信息。

5、关闭服务器。

6、输入昵称。

7、发送消息并收到其他客户的消息。

2 概要设计说明2.1 模块调用图2.2 套接字连接示意图2.3 主要函数声明1、Socket的构造方法如下:Socket(String host,int port)参数host是服务器的IP地址,port是一个端口号。

2、ServerSocket的构造方法如下:ServerSocket(int port)port是一个端口号。

port必须和客户呼叫的端口号相同3、当建立时可能发生IOException异常,因此应像下面那样建立到服务器的套接字连接:Try{Socket myscoket=new Socket(“http://192.168.0.78”,1880);}Catch(IOException e){}4、当建立服务器时可能发生IOException异常,因此,应像下面那样建立接收客户的服务器套接字:Try{ServerSocket server_scoket=new ServerSocket(1880);}Catch(IOException e){}比如1880端口已被占用时,就会发生IOException异常。

5、当服务器的ServerScoket对象server_socket建立后,就可以使用accept()方法接收客户的套接字连接呼叫,代码如下:Server_socket.accept();6、客户使用Socket类不带参数的构造方法Socket()创建一个套接字对象,该对象需调用Public void connect(SocketAddress endpoint) throws IOException 请求和参数SocketAddress指定地址的套接字建立连接,为了使用connect 方法,可以使用SocketAddress的子类InetSocketAddress建立一个对象,InetSocketAddress的构造方法如下:Public InetSocketAddress(InetAddress addr,int port)3 详细设计说明3.1 功能描述聊天程序分为服务器端和客户端两部分,服务端程序主要负责侦听客户端发来的消息,客户端需要登陆到服务器端才可以实现正常的聊天功能。

服务器:1、在特定端口上进行侦听,等待客户端连接。

2、向已经连接到服务器端的用户发送系统消息。

3、当停止服务时,断开所有的用户连接。

4、系统运行稳定、安全可靠。

客户端:1、连接到已经开启聊天服务的服务器端。

2、当服务器端开启后,用户可以发表聊天信息。

3、用户可以向所有人发送消息。

4、系统运行稳定、安全可靠。

3.2 主要功能详述3.2.1 客户建立连接到服务器的套接字对象1、当套接字连接mysocket建立后,可以想象一条通信“线路”已经建立起来。

mysocket可以使用getInputStream()方法获得一个输入流,然后用这个输入流读取服务器放入“线路”的信息。

mysocket还可以使用getOutputStream()方法获得一个输出流,然后用这个输出流将信息写入“线路”。

2、在实际编写程序时,把mysocket使用getInputStream()方法获得的输入流接到另一个数据流上,然后就可以从这个数据流读取服务器来的信息,之所以这样是因为后面DataInputStream流有更好的从流中读取信息的方法。

3、同样把mysocket使用getOutputStream()方法得到的输出流接到另一个DataOutputStream数据流上,然后向这个数据流写入信息,发送给服务器端,之所以这样做也是因为后面的DataOutputStream流有更好的向流中写入信息的方法。

3.2.2 ServerSocket类1、客户负责建立客户到服务器的套接字连接,即客户负责呼叫。

因此服务器必须建立一个等待接收客户的套接字的ServerSocket对象。

ServerSocket的构造方法如下:ServerSocket(int port)port是一个端口号。

port必须和客户呼叫的端口号相同2、所谓接收客户的套接字连接就是accept()方法会返回一个和客户端Socket 对象相连接的Socket对象,服务器端的这个Socket对象sc使用getOutputStream()方法获得的输出流将指向客户端Socket对象myscoket使用getInputStream()方法获得的那个输入流;同样,服务器端的这个Socket对象sc使用使用的 getInputStream()方法获得的输入流将指向客户端Socket对象myscoket使用getOutputStream()方法获得的那个输出流。

3、连接建立以后,服务器端的套接字对象调用getInetAddress()方法可以获取一个InetAddress对象,该对象含有客户端的IP地址和域名。

同样,客户端的套接字对象调用getInetAddress()方法可以获取一个InetAddress对象,该对象含有服务器端的IP地址和域名。

双方通信完毕后,应使用close()方法关闭套接字连接。

3.2.3 把套接字连接放在一个线程里需要注意的是,从套接字连接中读取数据与从文件中读取数据有很大的不同。

尽管两者都是输入流,但从文件中读取数据时,所有的数据都已经在文件上了,而使用套接字连接时,可能在另一端数据发送出来之前,就已经开始试着读取了,这时,就会堵塞本线程,直到该读取方法成功读取信息,本线程才继续执行后续的操作。

因此,服务器端收到一个客户的套接字后,就应该启动专门为该客户服务的线程。

3.3 主要代码分析3.3.1 使用套接字实现的主要方法服务器为每个客户启动一个线程,在该线程中通过套接字和客户交流信息。

当向服务器发送一条聊天信息时,服务器要让所有的这些线程中的输出流写入信息,这样所有的客户的套接字的输入流就读取到了这一条信息。

如果想把信息送给特定的用户,服务器就让特定的线程中的输出流写入信息,那么只有特定的客户的套接字的输入流可以读取到这条信息。

3.3.2 客户端public void actionPerformed(ActionEvent e){ if(e.getSource()==connection)//连接服务器{ try{ if(socket.isConnected()){}else{ InetAddressaddress=InetAddress.getByName("127.0.0.1");//传递域名InetSocketAddress socketAddress=new InetSocketAddress(address,666);socket.connect(socketAddress);in =newDataInputStream(socket.getInputStream());out = newDataOutputStream(socket.getOutputStream());name=inputName.getText();out.writeUTF("姓名:"+name);send.setEnabled(true);if(!(thread.isAlive()))thread=new Thread(this);thread.start();//启动线程,新建状态到就绪队列排队 }}catch (IOException ee){}}if(e.getSource()==send)//发送内容{ String s=inputContent.getText();if(s!=null){ try { out.writeUTF("聊天内容:"+name+":"+s);}catch(IOException e1){}}}}public void run()//线程对象调度之后所执行的操作{ String s=null;while(true){ try{ s=in.readUTF();//读取服务器发来的消息,堵塞状态chatResult.append("\n"+s);}catch(IOException e){ chatResult.setText("与服务器已断开");try { socket.close();}catch(Exception exp) {}break;}}}}3.3.3 服务器端public class ChatServer{ public static void main(String args[]){ ServerSocket server=null;//等待接收客户的套接字的ServerSocket对象Socket you=null;Hashtable peopleList;peopleList=new Hashtable();while(true){ try { server=new ServerSocket(666);//端口号}catch(IOException e1){ System.out.println("正在监听");}try { you=server.accept();//接收客户的套接字连接呼叫InetAddress address=you.getInetAddress(); System.out.println("客户的IP:"+address); }catch (IOException e) {}if(you!=null){ Server_thread peopleThread=newServer_thread(you,peopleList);peopleThread.start(); //客户线程}else { continue;}}}}class Server_thread extends Thread//服务线程{ String name=null;Socket socket=null;File file=null;DataOutputStream out=null;DataInputStream in=null;Hashtable peopleList=null;Server_thread(Socket t,Hashtable list)//构造{ peopleList=list;socket=t;try { in=newDataInputStream(socket.getInputStream());out=newDataOutputStream(socket.getOutputStream());}catch (IOException e) {}}4 调试分析4.1 遇到的问题1、图形用户界面设计按钮和文本框设计中的按钮上的事件处理问题。

合集下载

Java课程设计聊天室(含代码).docx

Java课程设计聊天室(含代码).docx

Java 程序课程设计任务书JAVA 聊天室的系统的设计与开发主要内容:用 JAVA 实现基于C/S 模式的聊天室系统。

聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。

2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。

2.用户可以配置服务器端的侦听端口,默认端口为8888 。

3.向已经连接到服务器端的用户发送系统消息。

4.统计在线人数。

5.当停止服务时,断开所有的用户连接。

B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。

2.用户可以配置要连接的服务器端的IP 地址和端口号。

3.用户可以配置连接后显示的用户名。

4.当服务器端开启的话,用户可以随时登录和注销。

5.用户可以向所有人或某一个人发送消息。

学习并掌握一下技术:Java JavaBean等熟练使用一下开发工具:Eclipse, JCreator 等实现系统上诉的功能。

3.进度安排:12 月 28 日~ 12 月 29 日:课程设计选题,查找参考资料12 月 30 日~ 1 月 1 日:完成系统设计1 月2 日~ 1 月 5 日:完成程序代码的编写1 月 6 日:系统测试与完善1 月 7 日:完成课程设计报告,准备答辩主要参考文献:[1]. 张广彬孟红蕊张永宝.Java课程设计(案例精编)[M]. 清华大学出版社.2007 年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。

基于 Java 网络编程的强大功能,本次毕业设计使用Java 编写一个聊天系统。

一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/ 服务器架构模式通过Java 提供的 Soket 类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java 提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用 SQL Server2000 完成并通过 JDBC-ODBC桥访问数据库。

JAVA课程设计报告(聊天软件)

JAVA课程设计报告(聊天软件)

Java2实用教程课程设计报告课题名称:用JAVA设计的聊天软件系别:计算机科学系班级:08软件工程2班学号:081403223 姓名:目录一、课程设计的目标二、开发及运行环境三、设计方法1.程序功能1)服务器功能2)客户端功能2.程序实现3.类的实现4.程序结果1)服务器端的运行结果2)客户端的运行结果四、设计心得五、参考文献一、课程设计的目标此次课程设计的目标是用JAVA语言实现一个功能比较完善的聊天软件,功能包含(用户注册、登录、修改昵称、更新心情、查找并添加好友、基本的文字聊天、传送文件、发送图片、窗口抖动、保存聊天记录等等),在设计该软件的过程中,综合运用了本学期所学的所有JAVA语言的基本知识,特别是线程、数据库、Swing、异常处理等知识。

通过这次课程设计,使我们对JAVA语言以及面向对象编程有了更深的体会,我们的程序设计能力也有了很大地提高。

二、开发及运行环境◇硬件:PC机◇操作系统:Windows XP◇数据库:MySQL◇开发工具:Eclipse◇JDK 要求jdk 7.0三、设计方法1.程序功能(1)服务器功能(2)客户端功能层次功能图:程序流程:(1)登录模块流程图(2)注册模块流程图(3)发送文件模块流程图2.程序实现客户端:服务器端:3.类的实现各主要类的方法、函数的核心代码:(附:源代码)(1) 数据库处理源代码:/*** 在数据库中查询用户的资料,保存在本地的PersonalData中* @return*/public void checkPersonalData(String id){PersonalData pd = PersonalData.getInstance();Connection conn = null;ResultSet rs = null;PreparedStatement pstmt = null;String sql = "select * from user where userid=?";try {conn = ConnMySQL.getConnection();pstmt = conn.prepareStatement(sql);pstmt.setString(1, id);rs = pstmt.executeQuery();if (rs.next()) {pd.setUserId(rs.getString("userId"));pd.setUserName(rs.getString("username"));pd.setPicNo(rs.getString("picNo"));}}catch(SQLException e) {e.printStackTrace();}finally {ConnMySQL.close(rs);ConnMySQL.close(pstmt);ConnMySQL.close(conn);}}(2) 其他数据处理关键语句:/*** 在数据库中查询用户的资料,保存在本地的PersonalData中* @return*/String sql = "select * from user where userid=?";/*** 在数据库中查询最新的心情* @return*/String sql = "select moodcontent from moodlist where moodid = (select max(moodid)from moodlist where pid=?)";/*** 查找用户的所有好友,保存在本地程序中* @param id* @return*/String sql = "select * from user where userId in (select friendid from relationlist where pid=?)";/*** 修改用户的昵称* @return*/String sql = "update user set username=? where userId=?";/*** 修改用户的密码* @return*/String sql = "update user set password=? where userId=?";/*** 获取自动编号ID* @param gen_name* @return*/String sql = "select gen_number from generator where gen_name =?";/*** 更新Id维护列表,此方法给此类别的函数调用* @param gen_name* @param current_id* @param conn*/String sql = "update generator set gen_number =? where gen_name = ?";/*** 添加心情* @param userId* @param mood* @return*/String sql = "insert into moodlist values(?,?,?,?);";String sql = "select * from moodlist order by moodId desc limit 20";/*** 加好友* @param args*/String sql = "insert into relationlist values(?,?,?);";String sql = "insert into user values(?,?,?,?);";(3) 客户端接收线程的run()函数:public void run() {while(run1){try {ObjectInputStream ois = new ObjectInputStream(sk.getInputStream());Message mes = (Message)ois.readObject();String messageType = mes.getMessageType();String sender = mes.getSender();String receiver = mes.getReceiver();if(messageType.equals(MessageType.CONTENT) || messageType.equals(MessageType.EXPRESSION)) {// System.out.println(receiver);ChatWindow cw = ChatWinMap.getChatWindow(sender);// System.out.println("来自用户"+cw);if(null == cw){if(null != FriendMap.getFriendData(mes.getSender())) {ReceiverMessage rm = new ReceiverMessage(mes);Thread th = new Thread(rm);th.start();}} else {cw.showMessage(mes);}} else if(messageType.equals(MessageType.ON_LINE)) {System.out.println("更新在线好友");String []all_online_ip = mes.getAll_online_id().split(",");ChatMainMap.getChatMain(mes.getReceiver()).getJp_center().changeOnlineState(all_onl ine_ip);Online_message on_mes = new Online_message(mes.getSender());Thread th = new Thread(on_mes);th.start();} else if(messageType.equals(MessageType.SHAKE_WIN)) {ChatWindow cw = ChatWinMap.getChatWindow(sender);Thread th = new Thread(cw);th.start();cw.showMessage(mes);} else if(messageType.equals(MessageType.REQUEST)){//把该好友的资料丛数据库中取出并保存在客户端程序中ReceiverRequestMessage rsm = new ReceiverRequestMessage(mes);Thread th = new Thread(rsm);th.start();} else if(messageType.equals(MessageType.REQUEST_CONFIRM)) {//把双边的关系加入数据库UserManager.getInstance().addFriend(mes.getSender(),mes.getReceiver());System.out.println("保存好友:"+mes.getSender());System.out.println(mes.getReceiver());UserManager.getInstance().addFriend(mes.getReceiver(),mes.getSender());//把该好友资料从数据库中取得并保存在客户端程序中String []fds = UserManager.getInstance().checkUser(mes.getSender());FriendData fd = new FriendData();fd.setFriendId(fds[0]);fd.setFriendName(fds[1]);fd.setFriendPic(fds[2]);FriendList.getFriendList().add(fd);FriendMap.addFriendData(fds[0], fd);//更新好友列表String all_ip = mes.getAll_online_id();ChatMainMap.getChatMain(PersonalData.getUserId()).updataCenter(all_ip);ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();} else if(messageType.equals(MessageType.REQUEST_REFUSE)){ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();} else if(messageType.equals(MessageType.NOT_ONLINE)) {MessageBox msb = new MessageBox("对方不在线");Thread th = new Thread(msb);th.start();} else if(messageType.equals(MessageType.OFF_LINE)) {System.out.println("有人下线了");//更新好友列表if(sender.equals(PersonalData.getUserId())) {break;}String all_ip = mes.getAll_online_id();System.out.println("当前在线好友:"+mes.getAll_online_id());ChatMainMap.getChatMain(PersonalData.getUserId()).updataCenter(all_ip);} else if(messageType.equals(MessageType.FILE_TRAN)) {ReceiverFileTransMessage rftm = new ReceiverFileTransMessage(mes);Thread th = new Thread(rftm);th.start();} else if(messageType.equals(MessageType.FILE_TRAN_CONFIRM)) {ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();} else if(messageType.equals(MessageType.FILE_TRAN_REFUSE)) {ConfirmRequestMessage rm = new ConfirmRequestMessage(mes);Thread th = new Thread(rm);th.start();}}catch (Exception e) {e.printStackTrace();}}}(4) 接收文件的客户端run()函数public void run() {Socket server;try {server = new Socket(msg.getFileTranMes().getServerIp(), Integer.parseInt(msg.getFileTranMes().getServerPort()));//创建网络接受流接受服务器文件数据InputStream netIn = server.getInputStream();InputStream in = new DataInputStream(new BufferedInputStream(netIn));//创建缓冲区缓冲网络数据// System.out.println("传输文件的长度:"+in.available());byte[] buf = new byte[2048];int num = in.read(buf);while (num != (-1)) {//是否读完所有数据raf.write(buf, 0, num);//将数据写往文件raf.skipBytes(num);//顺序写文件字节num = in.read(buf);//继续从网络中读取文件width = width+1;width_1 = width/size * 180;jl2.setBounds(10,40,(int)(width_1),20);jl2.setText(" "+(int)(width/size*100)+"%");}jl2.setText("传送完成");in.close();raf.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}(5) 发送文件的服务器run()函数public void run() {//创建网络服务器接受客户请求ServerSocket ss;Socket client = null;try {ss = new ServerSocket(5678);client = ss.accept();} catch (IOException e) {// TODO Auto-generated catch block// e.printStackTrace();}//创建网络输出流并提供数据包装器OutputStream netOut;try {netOut = client.getOutputStream();OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));//创建文件读取缓冲区byte[] buf = new byte[2048];int num = fos.read(buf);while (num != (-1)) {//是否读完文件doc.write(buf, 0, num);//把文件数据写出网络缓冲区doc.flush();//刷新缓冲区把数据写往客户端num = fos.read(buf);//继续从文件中读取数据width = width+1;width_1 = width/size * 180;jl2.setBounds(10,40,(int)(width_1),20);jl2.setText(" "+(int)(width/size*100)+"%");}jl2.setText("传送完成");fos.close();doc.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}(6) 客户端登录验证的函数public boolean CheckUser (Message msg) {boolean check = false;try {sk = new Socket(ip,port);System.out.println("获取socket");} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try {ObjectOutputStream oos = new ObjectOutputStream(sk.getOutputStream());oos.writeObject(msg);ObjectInputStream ois=new ObjectInputStream(sk.getInputStream());Message mss=(Message)ois.readObject();if(mss.getMessageType().equals(MessageType.ON_LINE)){ClientConnServerThread ccst = new ClientConnServerThread(sk);System.out.println("赋给ClietThreadMap的id:" + mss.getUser().getUserId());ClientThreadMap.setClientThreadHm(mss.getUser().getUserId(), ccst);ccst.start();User u = mss.getUser();//在这里查询数据库中用户的信息,并保存在客户端程序中UserManager.getInstance().checkPersonalData(u.getUserId());PersonalData.setMood(UserManager.getInstance().checkMood(u.getUserId()));UserManager.getInstance().checkAllFriend(u.getUserId());ChatMain cm = new ChatMain(u,mss);ChatMainMap.addChatMain(u.getUserId(), cm);check = true;} else if(mss.getMessageType().equals(MessageType.ON_LINE_FAIL)) {// JOptionPane.showMessageDialog(null, "用户名或密码错误");MessageBox msgb = new MessageBox("用户名或密码错误!");Thread th = new Thread(msgb);th.start();ois.close();oos.close();sk.close();}} catch (Exception e) {e.printStackTrace();}return check;}(7) 连接数据库的函数public static Connection getConnection() {Connection conn = null;try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost/chatdata?user=user1&password=m1 23");} catch (Exception ex) {ex.printStackTrace();}return conn;}(8) 发送消息的响应事件:if(e.getSource() == jb_send) {if(cardNo == 0) {Date time = new Date();SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");String sendtime = sdf.format(time);Document doc = jta.getDocument();try {doc.insertString(jta.getDocument().getLength(),PersonalData.getUserName()+"("+ erId+") "+sendtime+"\n", null);doc.insertString(jta.getDocument().getLength()," "+jta_send.getText()+"\n", null);} catch (BadLocationException e2) {// TODO Auto-generated catch blocke2.printStackTrace();}String sendMes = jta_send.getText();jta_send.setText("");Message mes = new Message();mes.setSender(erId);mes.setReceiver(this.receiveId);// System.out.println("发送前receiverId的值:"+receiveId);mes.setContent(sendMes);mes.setSendtime(sendtime);mes.setPic_no(PersonalData.getPicNo());mes.setMessageType(MessageType.CONTENT);try {ObjectOutputStream oos = new ObjectOutputStream(ClientThreadMap.getClientThreadHm(erId).getSocket().getOutp utStream());oos.writeObject(mes);} catch (Exception e1) {e1.printStackTrace();}} else {Date time = new Date();SimpleDateFormat sdf = new SimpleDateFormat("MM-DD hh:mm:ss");String sendtime = sdf.format(time);Document doc = jta.getDocument();try {doc.insertString(jta.getDocument().getLength(),PersonalData.getUserName()+"("+ erId+") "+sendtime+"\n", null);doc.insertString(jta.getDocument().getLength(), " ", null);jta.setCaretPosition(doc.getLength());jta.insertIcon(new ImageIcon("images/"+faceNo+".gif"));doc.insertString(jta.getDocument().getLength(), "\n", null);} catch (BadLocationException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}System.out.println("send picture:"+faceNo);String sendMes = faceNo;Message mes = new Message();mes.setSender(erId);mes.setReceiver(this.receiveId);mes.setContent(sendMes);mes.setSendtime(sendtime);mes.setMessageType(MessageType.EXPRESSION);try {// System.out.println("==============准备发送消息================");ObjectOutputStream oos = new ObjectOutputStream(ClientThreadMap.getClientThreadHm(erId).getSocket().getOutp utStream());// System.out.println(oos+":"+mes.getMessageType());oos.writeObject(mes);} catch (Exception e1) {e1.printStackTrace();}}}(9) 显示消息的函数:public void showMessage(Message ms) {try {Document doc = chat_window.jta.getDocument();doc.insertString(chat_window.jta.getDocument().getLength(),FriendMap.getFriendData(t his.receiveId).getFriendName()+"("+ms.getSender()+") "+ms.getSendtime()+"\n", null);if(ms.getMessageType().equals(MessageType.CONTENT)){doc.insertString(chat_window.jta.getDocument().getLength(),""+ms.getContent()+"\n", null);} else if(ms.getMessageType().equals(MessageType.EXPRESSION)){//插入图片doc.insertString(chat_window.jta.getDocument().getLength(), " ", null);chat_window.jta.setCaretPosition(doc.getLength());chat_window.jta.insertIcon(new ImageIcon("images/"+ms.getContent()+".gif"));doc.insertString(chat_window.jta.getDocument().getLength(), "\n", null);} else if(ms.getMessageType().equals(MessageType.SHAKE_WIN)){doc.insertString(chat_window.jta.getDocument().getLength(),""+ms.getContent()+"\n", null);}} catch (BadLocationException e) {e.printStackTrace();}}(10) 服务器端等待和验证客户端信息函数public void run() {while (true) {try {System.out.println("服务器正在等待客户端的连接");Socket sk = ssk.accept();ObjectInputStream ois=new ObjectInputStream(sk.getInputStream());Message ms = (Message)ois.readObject();User u = ms.getUser();String password = UserManager.getInstance().checkPersonalData(u.getUserId());if(null != password){if(u.getPassword().equals(password)) {System.out.println("验证密码");ServerConnClientThread sct = new ServerConnClientThread(sk);sct.start();ThreadMap.addThread(u.getUserId(), sct);/*验证成功后,把所有在线用户返回给所有的用户*/Iterator it = ThreadMap.hm.entrySet().iterator();String all_id = "";while(it.hasNext()){Entry entry = (Entry) it.next();all_id+=entry.getKey();if(it.hasNext()){all_id+=",";}// System.out.println(all_id);}ms.setAll_online_id(all_id);Iterator it2 = ThreadMap.hm.entrySet().iterator();while(it2.hasNext()) {Entry entry = (Entry) it2.next();ServerConnClientThread st = (ServerConnClientThread) entry.getValue();ObjectOutputStream oos = new ObjectOutputStream(st.sk.getOutputStream());ms.setReceiver(entry.getKey()+"");oos.writeObject(ms);}} else {//密码错误Message mss = new Message();mss.setMessageType(MessageType.ON_LINE_FAIL);mss.setContent("用户密码错误!");ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream());oos.writeObject(mss);sk.close();}} else {//用户不存在Message mss = new Message();mss.setMessageType(MessageType.ON_LINE_FAIL);mss.setContent("该用户不存在");ObjectOutputStream oos=new ObjectOutputStream(sk.getOutputStream());oos.writeObject(mss);sk.close();}} catch (Exception e) {e.printStackTrace();}}}(11) 服务器转发消息函数public void run() {boolean run = true;Message m = null;while(true){try {ObjectInputStream ois = new ObjectInputStream(sk.getInputStream());m=(Message)ois.readObject();System.out.println("开始接收数据");String messageType = m.getMessageType();String sender = m.getSender();String receiver = m.getReceiver();if(m.getMessageType().equals(MessageType.OFF_LINE)) {//重新获取在线IDIterator it = ThreadMap.hm.entrySet().iterator();String all_id = "";while(it.hasNext()){Entry entry = (Entry) it.next();if(!(entry.getKey().toString().equals(sender))){all_id+=entry.getKey();if(it.hasNext()){all_id+=",";}}}String all_id2 = all_id.substring(0, all_id.length());System.out.println(all_id2);//把消息传给每个人Iterator it2 = ThreadMap.hm.entrySet().iterator();ObjectOutputStream oos = null;ServerConnClientThread scct = null;while(it2.hasNext()){Entry entry = (Entry) it2.next();scct = (ServerConnClientThread) entry.getValue();oos = new ObjectOutputStream(scct.sk.getOutputStream());m.setAll_online_id(all_id2);oos.writeObject(m);}ThreadMap.hm.remove(sender);break;} else {if(messageType.equals(MessageType.REQUEST)||messageType.equals(MessageType.RE QUEST_CONFIRM)) {Iterator it = ThreadMap.hm.entrySet().iterator();String all_id = "";while(it.hasNext()){Entry entry = (Entry) it.next();all_id+=entry.getKey();if(it.hasNext()){all_id+=",";}// System.out.println(all_id);}m.setAll_online_id(all_id);}ObjectOutputStream oos = new ObjectOutputStream(ThreadMap.getThread(receiver).sk.getOutputStream());System.out.println("开始转发数据");oos.writeObject(m);}}catch(Exception ex){ex.printStackTrace();}}}4.程序结果(1)服务器端的运行结果附:效果图运行ServerWindow.java类,点击(3)客户端的运行结果附所有功能的效果图运行ChatLogin.java 类,用户注册:在登录界面点击快速注册,弹出注册向导如下图,输入注册资料;点击提交,结果如下图:注:号码10007是按顺序生成,先从10000开始生成,以此类推登录:在登录界面输入刚才注册的帐号跟密码:点击登录,显示界面如下图:修改昵称:点击主窗体右边的按键:输入新昵称跟密码:点击修改按键:更新心情:点击主窗体右边的按键:在文本框内输入心情,点击发表:查找并添加好友:点击主窗体右边的按键,并输入所要查找好友的帐号,点击查找:点击添加,出现以下提示窗口:同时,登录10006用户,这时屏幕右下角会出现如下提示窗口:用户10006点击同意,用户10007会出现如下提示窗口:用户拒绝添加申请的效果图如下:基本文字聊天:用户10007打开与用户10006的聊天窗口并发送文字信息:同时用户10006收到消息提示如下图:文件传送:点击聊天窗口中传送文件的按键,出现如下图的窗口,选择要传送的文件:点击打开,电脑桌面右下角将出现如下消息窗口:点击接收:点击拒绝:发送图片:窗口抖动:用户10007向用户10006发送一个窗口抖动:(通过产生随机数改变窗体的位置)保存跟读取聊天记录:点击保存按键:重新打开聊天窗口,点击读取按键:四、设计心得通过这次的Java课程设计,设计了一个聊天软件,主要的收获就是:(1) 更加熟悉的Java语言的特性;(2) 更熟悉的使用Java的界面库设计好的界面;(3) 对多线程有了更深刻的理解;(4) 数据库的相关处理存在的不足:(1)界面的某些布局不够合理,导致使用时有点不方便;(2)由于之前对多线程理解的不够深刻,导致在编写的过程中处理这些错误花了很多的时间;(3)有些实现思路不够简洁,每个用到更加合理的设计方法。

java课程设计报告__利用java实现简单聊天室(可编辑)

java课程设计报告__利用java实现简单聊天室(可编辑)

java课程设计报告_-_利用JAVA实现简单聊天室利用JAVA实现简单聊天室1.课程设计目的在当今的信息时代,越来越多的聊天工具被应用,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。

使用Java 语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的、嵌入式设备进行应用程序的开发Java语言的重要概念及其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。

此次课程设计的题目为简单的聊天室,通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。

使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。

2.设计方案论证2.1设计思路Java是一种简单的,面对象的,分布式的,解释的,键壮的安全的,结构中立的,可移植的,性能很优异的多线程的,动态的语言Java去掉了C++语言的许多功能,如:指针运算、结构、typedefs、#define让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。

这将减少平常出错的50%。

而且,Java很小,整个解释器只需215K的RAM。

Java简单聊天室,它是图形界面、线程、流与文件等技术的综合应用其界面主要采用了包程序实现了的基本功能有:Pentium 2.8GHz以上内存:256MB以上硬盘空间:80G以上操作系统:Windows XP运行环境:JDK,JCreator 2.5 程序功能图及程序相关说明主功能框图图1 程序基本框图表1 聊天室基本功能表序号文件名主要功能1ServerHost被服务器调用2Client显示聊天室3ClientUser被客户端调用4LogIn注册登陆5Objecting连接服务器6Server启动服务器程序代码是说明程序中引入的包:package Chat;import .*;import java.awt.*;import t.*;import javax.swing.*;import java.util.*;import java.io.*;(1)服务器端代码中用户自定义类:类名:Server作用:服务器启动继承的接口名:ActionListenerpublic class Server implements ActionListener定义的对象:count //记录点机关闭按钮次数2次关闭soconly //只有SOCKET,用于群发sockets //所有客户的SOCKETsocket_thread //Socket所在的线乘,用于退出;frame // 定义主窗体panel//定义面板start,stop //启动和停止按钮主要成员方法:public void center //定义小程序查看器的位置public void actionPerformed //定义处理异常机制定义子类:serverRun,Details继承的父类名:Threadclass serverRun extends Thread //启线乘用于接收连入的Socket class Details extends Thread //具体处理消息的线乘,只管发送消息创建一个ServerSocket 对象,用于接受指定端口客户端的信息ServerSocket server new ServerSocket "1234" ;接受请求时候,通过accept 方法,得到一个socket对象。

java聊天软件课课程设计

java聊天软件课课程设计

java聊天软件课课程设计一、教学目标本课程的学习目标包括以下三个方面:1.知识目标:学生需要掌握Java编程语言的基本语法、面向对象编程思想、常用数据结构和算法,以及JavaFX等图形用户界面开发技术,从而能够独立设计和开发简单的聊天软件。

2.技能目标:学生能够熟练使用Java开发工具和环境,具备查找和解决编程问题的能力,能够独立完成聊天软件的设计、编码、调试和测试工作。

3.情感态度价值观目标:通过本课程的学习,学生能够培养对编程和软件开发的兴趣和热情,认识软件开发对社会和科学的重要性,形成良好的学习态度和合作精神。

二、教学内容本课程的教学内容主要包括以下几个部分:1.Java编程基础:Java语言的基本语法、数据类型、运算符、控制结构、数组、字符串等。

2.面向对象编程:类和对象的概念、构造方法、成员变量、继承、多态、接口等。

3.常用数据结构和算法:数组、链表、栈、队列、排序、查找等。

4.JavaFX图形用户界面开发:窗口、控件、布局、事件处理等。

5.聊天软件设计与开发:设计模式、网络编程、多线程、消息传递机制等。

三、教学方法本课程的教学方法包括以下几种:1.讲授法:用于向学生传授基本概念、原理和方法。

2.案例分析法:通过分析典型聊天软件的案例,使学生更好地理解和掌握相关知识。

3.实验法:让学生动手编写代码,实际操作聊天软件的开发过程,培养实际编程能力。

4.讨论法:学生进行小组讨论,分享学习心得和解决问题的方法,提高合作和沟通能力。

四、教学资源本课程的教学资源包括以下几种:1.教材:《Java编程基础》、《JavaFX教程》、《Java网络编程》等。

2.参考书:为学生提供丰富的课外阅读材料,加深对课程内容的理解。

3.多媒体资料:教学PPT、视频教程、网络资源等,丰富教学手段,提高学习兴趣。

4.实验设备:计算机、网络设备等,为学生提供实际操作环境,培养实际编程能力。

五、教学评估本课程的评估方式包括以下几个方面:1.平时表现:通过课堂参与、提问、讨论等环节,评估学生的学习态度和积极性。

Java课程设计聊天室(含代码)

Java课程设计聊天室(含代码)

Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JA V A实现基于C/S模式的聊天室系统。

聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。

2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。

2.用户可以配置服务器端的侦听端口,默认端口为8888。

3.向已经连接到服务器端的用户发送系统消息。

4.统计在线人数。

5.当停止服务时,断开所有的用户连接。

B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。

2.用户可以配置要连接的服务器端的IP地址和端口号。

3.用户可以配置连接后显示的用户名。

4.当服务器端开启的话,用户可以随时登录和注销。

5.用户可以向所有人或某一个人发送消息。

学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse,JCreator 等实现系统上诉的功能。

3.进度安排:12月28日~ 12月29日:课程设计选题,查找参考资料12月30日~ 1月1日:完成系统设计1月2日~ 1月5日:完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊张永宝.Java课程设计(案例精编)[M].清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。

基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。

一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。

本科毕业论文-基于JAVA的聊天系统的设计与实现【范本模板】

本科毕业论文-基于JAVA的聊天系统的设计与实现【范本模板】

摘要随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐.目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。

该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。

前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。

后者通过与服务器建立连接,来进行客户端与客户端的信息交流。

其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。

开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。

在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。

经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java 语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统关键词:局域网聊天 socket javaAbstractAlong with the fast development of Internet,the network chating tool has already become one kind of important communication tools and received more and more web cams favor. At present, many extremely good chating tools have appeared . for example,Netmeeting, QQ,MSN—Messager and so on. This system development mainly includes two aspects of the server procedure of the network chat and the customer procedure of the network chat。

java实现聊天系统(计算机网络课程设计报告).doc

计算机网络课程设计报告学生姓名学号班级指导教师设计时间目录第一章系统描述1.1设计目的 (3)1.2系统设计任务 (3)1.3系统设计分析 (3)1.4系统功能分析 (4)第二章功能模块结构2.1模块划分 (5)2.2模块结构图 (5)2.1模块功能 (5)第三章模块算法实现3.1 服务器实现 (6)3.2 客户端实现 (9)第四章运行结果 (13)第五章课程设计总结 (17)第六章附录6.1 参考文献 (19)6.2 源代码 (19)第一章系统描述1.1设计目的1.学习网络编程的知识,掌握网络编程的方法。

2.进一步掌握编程思想与编程技巧,做到模块化程序设计,3. 强化语言学习,尤其是Java的图形界面与多线程,需反复练习,熟练掌握。

1.2系统设计任务聊天室软件的设计与开发:基本要求可以完成群聊、私人聊天,实时发送和显示聊天信息,完成好友列表;进一步要求带表情,附件发送,聊天信息的加密传送,设置黑名单等。

学习通信编程Socket接口编程,使用TCP或UDP接口完成信息传送,利用多线程技术实现服务器端的多个TCP连接的建立。

1.3系统设计分析一.实现网络聊天室编程,关键在于Socket通信,程序的功能都是在Socket 的基础上一层一层增加的。

实现Socket通信的基本方法为以下4个步骤。

(1)在客户端与服务器端创建相应的ServerSockot/Socket实例。

(2)打开连接到Socket的输入输出流(3)利用输入输出流,按照一定的协议(TCP协议)对Socket进行读写操作(4)关闭输入输出流和Socket我们要实现的功能都是在第3步对Socket的输入输出流做相应的操作二.因为是多客户端,所以必须用线程进行控制,不同的处理线程为不同的客户服务,主线程只负责循环等待,处理线程负责网络连接,接受客户输入的信息,再做相应的处理。

1.4系统功能分析本系统可以通过网络进行聊天,采用客户端服务器模式,所以程序简介清晰易懂,而且用户都是在客户端进行活动,方便对用户的管理,也使得程序运行与差错简单起来。

JAVA聊天室毕业论文设计

JAVA聊天室毕业论文设计引言:随着计算机和互联网技术的快速发展,人们的交流方式也日新月异。

传统的面对面交流已经无法满足人们日益增长的沟通需求。

在这样的背景下,即时通信工具应运而生,成为人们日常生活中不可或缺的一部分。

聊天室作为一种即时通信工具,在互联网时代广受欢迎。

本论文旨在设计一个基于JAVA的聊天室系统,以满足用户在网络上进行实时交流的需求。

一、项目背景随着互联网时代的到来,“聊天”逐渐成为人们日常生活中重要的沟通方式之一、无论是个人还是企业,都希望能够通过聊天室系统来随时随地和朋友、同事或客户进行沟通。

目前市面上已经存在着许多聊天室系统,但是他们往往存在着一些局限性,如功能不完善、用户体验较差等。

因此,设计一款功能全面、操作简单、界面友好的JAVA聊天室系统对于满足用户需求十分必要。

二、系统需求2.1功能需求(1)用户注册和登录功能:用户需要能够通过注册和登录功能进行聊天室的使用。

(2)好友添加和管理功能:用户需要能够添加好友并进行好友管理。

(3)实时聊天功能:用户需要能够进行实时聊天并发送文字、图片等多种消息。

(4)聊天记录保存:用户需要能够查看和保存聊天记录。

(5)群组功能:用户需要能够创建和加入群组,并进行群组聊天。

(6)文件传输功能:用户需要能够进行文件发送和接收。

2.2性能需求(1)系统响应时间应尽量减少,避免用户长时间等待。

(2)系统稳定性较高,能够处理大量用户同时在线的情况。

(3)系统安全性较高,能够对用户信息进行保护。

三、系统设计3.1技术选型本系统采用JAVA语言进行开发,其中使用了JAVA Socket编程和GUI开发技术。

数据库采用MySQL来存储用户信息和聊天记录。

3.2系统架构本系统采用客户端-服务器架构,即客户端向服务器发送请求,服务器接收请求并进行处理,然后将结果返回给客户端。

3.3数据库设计本系统数据库设计主要包括用户信息表、好友关系表、群组信息表和聊天记录表。

Java聊天室程序设计报告

计算机与信息科学系课程设计报告课程名称:面向对象程序设计—Java 设计题目: Java聊天室程序专业:学号:姓名:指导老师:提交时间:2009-6-20目录第一章可行性分析报告 (3)1.1 引言 (3)1.1.1 编写目的 (4)1.1.2项目背景 (4)1.1.3参考资料 (4)1.2 可行性分析 (5)1.2.1系统简要描述 (5)1.2.2系统流程图 (5)1.2.3经济可行性分析 (5)第二章需求规格说明书 (7)2.1 编写目的 (8)2.2 数据描述 (8)2.2.1文字叙述 (9)2.2.2系统数据流图 (9)2.3 功能划分 (9)第三章概要设计说明书 (9)3.1 总体设计 (9)3.1.1总体结构设计 (9)3.2.接口设计 (11)3.3 数据结构设计 (11)3.3 运行设计 (12)3.4 维护设计 (12)第四章详细设计说明书 (12)4.1 总体设计 (12)4.1.1需求概要 (13)4.1.2软件结构 (13)4.2 模块程序流程 (13)4.2.1用户登录模块 (13)4.2.2注册模块 (14)4.2.3系统总体流程图 (15)第五章编码测试与实现说明 (15)5.1 功能模块的测试 (15)5.2 工作的过程 (16)5.3 软件设计效果 (16)第六章设计问题总计 (19)第七章总结 (19)可行性分析报告1.引言1.1编写目的:可行性研究的目的是为了对问题进行研究,以最小的代价在最短时间内确定问题是否可解。

经过对此项目进行详细调查研究,初拟系统实现报告,对软件开发中将要面临的问题及其解决方案进行初步设计及合理安排。

明确开发风险及其所带来的经济效益。

本报告经审核后,交软件经理审查。

1.2 项目背景:开发软件名称:Java聊天室小软件项目任务提出者:**高校项目开发者:***软件开发小组用户:**高校实现软件单位:**高校项目与其他软件,系统的关系:开发环境:本项目采用客户机/服务器原理,服务器端采用Windows XP为操作系统的工作站,客户端的程序是建立在Window XP系统上,在JDK1.5上开发,JAVA程序工程采用JCreator、Elipse 为编程工具进行开发。

java课程设计---java聊天室的系统的设计与开发(含代码)-java

Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JA V A实现基于C/S模式的聊天室系统。

聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。

(包括技术要求等):系统的功能要求::,等待客户端连接。

,默认端口为8888。

,断开所有的用户连接。

:。

,用户可以随时登录和注销。

学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse,JCreator 等实现系统上述的功能。

:5月20日~ 5月21日:课程设计选题,查找参考资料5月22日~ 5月23日:完成系统设计5月24日~ 5月27日:完成程序代码的编写5月28日:系统测试与完善5月29日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊(案例精编)[M].摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。

基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。

一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。

本系统建立在JAVA平台上,系统的设计使用了面向对象技术和面向对象的设计原则。

系统采用C/S结构,客户端与客户端以及客户端与服务器端之间通过Socket传送消息。

使用JAVA语言编写,开发工具采用Eclipse。

服务器端设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档