天天看点

模拟QQ聊天程序_服务器端_网络编程

import java.io.*;

import java.net.*;

import java.util.*;

public class ChatServer {                   //使用TCP协议,先创建服务器端类

 boolean started = false;

 ServerSocket ss = null;

 List<Client> clients = new ArrayList<Client>();

 public static void main(String[] args) {

  new ChatServer().start();

 }

 public void start() {

  try {

   ss = new ServerSocket(8888);   //建立一个带有端口8888的“码头”

   started = true;

  }  catch(BindException e) {

   e.printStackTrace();

   System.out.println("端口已被占用!");

   System.out.println("请关掉相关程序!");

   System.exit(0);

  } catch (IOException e) {

   e.printStackTrace();

  }

  try {

   while(started){

    Socket s = ss.accept();     //阻塞试的“等待客户端进行连接”

    Client c = new Client(s);

System.out.println("a client connected!");

    new Thread(c).start();      //用户连接上后,立刻建立一个新的线程

    clients.add(c);

    //dis.close();

   }

  } catch (IOException e) {

   e.printStackTrace();

  } finally {                      

   try{

    ss.close();

   } catch (IOException e) {

    e.printStackTrace();

   }

  }

 }

 class Client implements Runnable {             //创建继承父类线程的客户端类

  private Socket s;

  private DataInputStream dis = null;

  private DataOutputStream dos = null;

  private boolean bConnected = false;

  public Client (Socket s) {                 //构造方法,对新创建的客户端对象进行初始化

   this.s = s;

   try {

    dis = new DataInputStream(s.getInputStream()); 

    dos = new DataOutputStream(s.getOutputStream());

    bConnected = true;

   } catch (IOException e) {

    e.printStackTrace();

   }

  }

  public void send(String str){

   try {

    dos.writeUTF(str);                 //把输入的字节流数据转换为UTF字符流数据再进行输出

   } catch (IOException e) {

    e.printStackTrace();

   }

  }

  public void run() {                        //把从键盘输入的数据进行显示,并且进行发送

   try {

    while(bConnected) {

     String str = dis.readUTF();

     System.out.println(str);        

     for(int i=0; i<clients.size(); i++) {

      Client c = clients.get(i);

      c.send(str);

     }

    } 

   } catch (EOFException e) {

    System.out.println("Clien Close!");

   } catch (IOException e) {

    e.printStackTrace();

   } finally {

    try {

     if(dis != null) dis.close();

     if(dos != null) dos.close();

     if(s != null) s.close();

    } catch (IOException e) {

     e.printStackTrace();

    }

   }

  }

 }

}