Java聊天室搭建

来源:互联网 发布:淘宝双十一营销案例 编辑:程序博客网 时间:2024/06/06 17:32

  • 做这个项目前需要先做好分析:
  1. 聊天室分为两个模块,服务器和客户端。
  2. 服务器主要实现逻辑是:客户端第一次进入聊天室打印欢迎日志、接收客户端的消息打印在聊天室中、群发给其他用户、判断私聊的条件。
  3. 客户端主要实现逻辑是:初始化信息、发送消息给服务器、接收来自服务器的消息。
  • 项目从简单版本往上写,逐步增加功能:
     第一个版本:通过TCP搭建服务器和客户端,一个客户端上线服务器就打印一条上线提示。
     第二个版本:客户端发送一条消息,服务器接收一条,并反馈一条已接收的信息给客户端。
     第三个版本:通过多线程使客户端能不断给服务器发送消息,服务器也能不断回复客户端的信息。
     第四个版本:多个客户端开启时,自身发送的消息由服务器发给其他所有客户端,在聊天室中打印出以客户端姓名为前缀的每个人发出的消息。
     第五个版本:判断哪些是私聊的信息,私聊信息既不打印在聊天室中也只会发送给当前用户的私聊对象。完善代码。
  • 服务器代码:来一个客户端就开启一个服务器线程。具体逻辑放在线程中完成。
publicclassServer {
     publicstaticvoidmain(String[]args)throwsIOException {
          List<ServerThread>list=newArrayList<ServerThread>();
//判断私聊时需要知道发送给哪个客户端,所以把为每一个客户端服务的线程放入一个集合中。以此来遍历所以客户端。
          ServerSocketserverSocket=newServerSocket(8080);
          while(true){
              Socketsocket=serverSocket.accept();
              ServerThread serverThread=newServerThread(socket,list);
//开启线程时把当前客户端对应套接字和装有所有serverThread对象的集合传递给为当前客户端服务的线程。
              list.add(serverThread);
//开启一个就往list中添加一个。
              serverThread.start();
          }
     }
}
  • 客户端代码:读入键盘输入数据,发送给服务器,并接收来自服务器的消息。读和写分别使用不同的线程。
publicclassClient {
     publicstaticvoidmain(String[]args)throwsUnknownHostException, IOException {
          Socketsocket=newSocket("10.2.155.91", 8080);
//通过服务器ip地址和服务器端口号建立与服务器的连接。
          WriterThreadwriterThread=newWriterThread(socket);
//开启一个写线程发送数据到服务器。
          writerThread.start();
          ReaderThreadreaderThread=newReaderThread(socket);
//开启一个读线程接收来自服务器的消息。
          readerThread.start();
     }
}
  • 服务器线程代码:
publicclassServerThreadextendsThread{
     privateSocketsocket;
     privateBufferedReaderbReader;
     privateBufferedWriterbWriter;
     privateList<ServerThread>list;
     privateStringname;
     publicServerThread(Socketsocket,List<ServerThread>list) {
          try{
              this.socket=socket;
              this.list=list;
              bReader=newBufferedReader(newInputStreamReader(socket.getInputStream()));
              bWriter=newBufferedWriter(newOutputStreamWriter(socket.getOutputStream()));
          }catch(IOExceptione) {
              e.printStackTrace();
          }
     }
     publicvoidrun() {
          WelcomeChat();
          try{
              while(true){
                   Stringinfo=bReader.readLine();
                   if(info.startsWith("@")&&info.indexOf("#") !=-1&&
                             info.indexOf("#")-info.indexOf("@")>1) {
                        SendByName(info);
                   }
                   else{
                        System.out.println(name+"说:"+info);
                        SendToOthers(info);
                   }
              }
          }catch(IOExceptione) {
              e.printStackTrace();
          }
     }
     privatevoidWelcomeChat() {
          try{
              name=bReader.readLine();
              System.out.println("欢迎"+name+"进入聊天室");
          }catch(IOExceptione1) {
              //TODOAuto-generated catch block
              e1.printStackTrace();
          }
     }

     privatevoidSendByName(Stringinfo)throwsIOException {
          Stringname2=info.substring(info.indexOf("@") + 1,info.indexOf("#"));
          info=info.substring(info.indexOf("#")+1);
          for(ServerThreadserverThread:list) {
              if(name2.equals(serverThread.name)) {
                   bWriter=newBufferedWriter(newOutputStreamWriter(serverThread.socket.getOutputStream()));
                   bWriter.write(name+"悄悄对你说:"+info);
                   bWriter.newLine();
                   bWriter.flush();
                   break;
              }
          }
     }
     privatevoidSendToOthers(Stringinfo)throwsIOException {
          for(ServerThreadserverThread:list) {
              if(Thread.currentThread()!=serverThread) {
                   bWriter=newBufferedWriter(newOutputStreamWriter(serverThread.socket.getOutputStream()));
                   bWriter.write(name+"说:"+info);
                   bWriter.newLine();
                   bWriter.flush();
                   }
              }
          }
}

1 0
原创粉丝点击