聊天室功能实现

来源:互联网 发布:什么是云计算服务 编辑:程序博客网 时间:2024/05/16 05:51

服务器端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
/*
 * 聊天服务器
 */
public class ChatServer {
 private boolean serverNormal = true;
 private ServerSocket ss;
 //把负责通信的对象放到集合,以便遍历
 private List<TongxinThread> list = new ArrayList<TongxinThread>();
 
 public ChatServer(int port)throws Exception{
  ss = new ServerSocket(port);//创建服务器
  new Thread(){
   public void run(){
    try{
     while(serverNormal){
      //每建立一个连接,都会产生一个连接通道socket
      //阻塞方法要使用独立线程执行,不影响其它的代码执行。
      Socket socket = ss.accept();//如果有异常代表服务停止,不能建立连接了
      if(!serverNormal){//服务器正在停止
       socket.close();
       return ;
      }
      //设置接收数据超时时间,如果此时间内收不到数据,则会抛出SocketTimeoutException
      socket.setSoTimeout(1000*60);
      //把socket交给通信线程
      TongxinThread tx = new TongxinThread(socket);
      list.add(tx);//可以遍历发送数据
      tx.send("欢迎登陆聊天室");
      tx.send("当前在线人数: "+list.size());
      tx.start();
     }
    }catch(Exception e){
     e.printStackTrace();
     System.out.println("服务已经停止");
    }
   }
  }.start();
  
  new Thread(){
   public void run(){
    try {
     Scanner sc = new Scanner(System.in);
     while(true){
      String s = sc.nextLine();
      if("close".equals(s)){
       //停止服务器
       //*不允许建立新的连接
       //*断开所有的客户端
       //*停止服务器
       serverNormal = false;
       for(TongxinThread tx : list){
        tx.s.close();
       }
       ss.close();//停止服务器
      }
     }
    } catch (Exception e) {
     e.printStackTrace();
     System.out.println("服务器停止时出错");
    }
   }
  }.start();
 }
 /*
  * 通信线程类,使用内部类实现
  */
 class TongxinThread extends Thread{
  Socket s;
  BufferedReader in ;//readLine();
  PrintStream out;//println(String);
  public TongxinThread(Socket s)throws Exception{
   this.s = s;
   in = new BufferedReader(new InputStreamReader(s.getInputStream()));
   out = new PrintStream(s.getOutputStream());
  }
  public void run(){
   //接收数据
   try{
    while(true){
     
     String line = null;
     try{
      line = in.readLine();//针对每个客户端发过来的每句话。如果客户端断开,会抛出SocketException异常//Connection Reset异常
     }catch(SocketTimeoutException e){
      send("你很久没说话了。。");
      continue;
     }
     if(line==null){
      break;
     }
     //接收到的line,遍历发送到每个客户端。
     for(Iterator<TongxinThread> it = list.iterator();it.hasNext();){
      TongxinThread tx = it.next();
      try{
       tx.send(line);//如果发不出去,可能已断开,会出现异常
      }catch(Exception e){
       //对其中一个客户端发送失败,将其移除掉
       it.remove();
      }
     }
    }
   }catch(Exception e){
    e.printStackTrace();
    //从当前客户端接收数据失败,即自己断开,把自己移除掉
    list.remove(this);
   }
  }
  public void send(String s){
   out.println(s);
   out.flush();
  }
 }
 
 public static void main(String[] args)throws Exception{
  ChatServer s = new ChatServer(8000);
  System.out.println("聊天服务器已经启动。。。");
 }
}//ChatServer

 

 

客户端代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

/*
 * 客户端读与写都是阻塞操作,得在不同的线程执行其代码。
 */
public class ChatClient {
 private Socket s;
 private BufferedReader in;
 private PrintStream out;
 private String name;
 private Scanner sc = new Scanner(System.in);
 
 public ChatClient(String ip,int port)throws Exception{
  s = new Socket(ip, port);
  in = new BufferedReader(new InputStreamReader(s.getInputStream()));
  out = new PrintStream(s.getOutputStream());
 }
 
 public void start(){
  System.out.print("请输入姓名: ");
  name = sc.nextLine();
  new Thread(){
   public void run(){
    try{
     while(true){
      System.out.println("......................");
      String line = in.readLine();//如果出现异常,表示已经断开,接收不到数据
      if(line==null)
       break;
      System.out.println(line);
    }
    }catch(Exception e){
     e.printStackTrace();
     System.out.println("你已断开");
    }
   }
  }.start();
  new Thread(){
   public void run(){
    try{
     while(true){
      String s = sc.nextLine();
      System.out.println("-------------------");
      out.println(name + " 说: " + s);
      out.flush();
      System.out.println("=======================");
    }
    }catch(Exception e){
     e.printStackTrace();
     System.out.println("你已断开");
    }
   }
  }.start();
 }
 public static void main(String[] args)throws Exception{
  ChatClient c = new ChatClient("localhost", 8000);
  c.start();
 }
}

 

原创粉丝点击