群聊

来源:互联网 发布:程序员 霸气 口号 编辑:程序博客网 时间:2024/04/29 07:12

//服务器端。Server.java

package cc.nothing2012.blogServlet;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;

import javax.swing.DefaultListModel;

public class Server {
 private ServerSocket serverSocket;
 private Socket socket;
 private static Vector<ServerObject> vector = new Vector<ServerObject>();
 private static Vector<String> vectorIP=new Vector<String>();
 private ServerObject serverObject;
 

 public Server() {
  try {
   serverSocket = new ServerSocket(55555);
   System.out.println("服务器已经启动!"); // 后台提示
   while (true) {
    try {
     socket = serverSocket.accept(); // 一直在等待连接
     p(socket);
     final InetAddress address = socket.getInetAddress();
     p("那个丫的连接的IP:" + address);
     p(vector.size()); // 打印连接前,登陆客户端的个数。
     serverObject = new ServerObject(vector.size(), socket); // 说明一个客户端连接上了, 新建对象线程。
     vector.addElement(serverObject); // 往向量里面添加一个客户端。
     vectorIP.addElement(address.getHostAddress());   //把ip存起来。
     
     //Form.jList.removeAll();
     p("there");
     new Timer().schedule(new TimerTask(){
        public void run(){
                // Form.jList.setListData(vectorIP);
          DefaultListModel model2=new DefaultListModel();
        Form.jList.setModel(model2);
        model2.removeAllElements();
        model2.addElement(address.getHostAddress());
                 p("here");
        }
       }, 2000,3000);
     
     
     serverObject.start(); // 启动一个线程
     p(vector.size()); // 打印连接后,登陆客户端的个数。

    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  } catch (IOException e) {
   p("服务器启动失败!");
  }
 }

 public void p(Object o) {
  System.out.println(o);
 }

 public static void main(String[] args) {
        new Server();
 }

 class ServerObject extends Thread {
  private DataOutputStream out = null;
  private DataInputStream in = null;
  private Socket socket=null;
  private int id;

  // 每个连接过来的客户端,将初始化这样的一个对象。
  public ServerObject(int id, Socket socket) {
   this.socket=socket;
   this.id = id;
   try {
    in = new DataInputStream(socket.getInputStream());
    out = new DataOutputStream(socket.getOutputStream());
   } catch (IOException e) {
    e.printStackTrace();
   }
  }

  // 启动线程时,执行
  public void run() {
   boolean flag = true; // 只是一个标志
   int m;
   while (flag) {
    try {
     String message = in.readUTF(); // 输入进来的流,简称输入流,拿到客户端的信息。
     System.out.println(message);        // 后台打印出来
     if (message.equals("exit")) {// 如果接收到"exit"字符串说明运行该线程的客户端断开了连接
             // ,则需退出该循环,退出线程
      flag = false; // 退出循环
      Server.vector.remove(this); // 当客户端关闭时,从Vector里除去本对象
     } else {
      m = Server.vector.size(); // 返回共有多少个客户端目前。
      for (int i = 0; i < m; i++) { // 给每个客户端发送同样的信息。
       Server.vector.get(i).out.writeUTF(message); // 输出信息给每个客户端。
      }
     }
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  }
 }
}
 

//客户端   Client.java

package cc.nothing2012.blogServlet;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;

public class Client implements Runnable {
 private Socket socket;
 private DataInputStream in;
 private DataOutputStream out;
 private boolean flag = true; // 标志 如果多个客户端则会出错。

 private Form mf = new Form("通讯客户端"); // 新建了一个客户端的界面。
 private JButton jbSent = null;

 private boolean serverClose = false;// 标识服务器端是否关闭,true为关闭,false为没关闭

 public Client() {
  mf.mform();
  mf.mShow();
  mf.mClose();

  try {
   jbSent = new JButton("发送");
   jbSent.setBounds(400, 400, 80, 30); // 设置按钮的大小
   mf.add(jbSent); // 添加到JFrame中
   socket = new Socket("222.17.110.117", 55555); // 此处新建了一个Socket,并连接服务器。通信从此位置开始。
   jbSent.addActionListener(new ActionListener() { // “发送”按钮监听
      public void actionPerformed(ActionEvent e) { // 监听按钮的方法。必须实现的 。
       try {
        if (!serverClose) { // 第一次执行时,默认是开着的。之后,如果服务器开着,即没有关闭,则发送下面内容
         String message = mf.getMessage(); // 取得某人写的某些内容
         if (!message.equals("")) {
          out = new DataOutputStream(socket.getOutputStream());
          out.writeUTF(message); // 把message通过s输出去
          mf.clearWrite(); // 此处只有发送按钮在监听,故发送之后,内容理应删掉。
         }
        }
       } catch (IOException ioe) {
        ioe.printStackTrace();
       }
      }
     });
   mf.addWindowListener(new WindowAdapter() { //监听客户端是否关闭,如果关闭,则向服务器发送一个 “exit”字符串
      public void windowClosing(WindowEvent e) {
       try {
        if (serverClose) { // serverClose 的值一直都是false。
         // 此处永远不会被执行。
        } else { // 因为监听到了窗口被关闭了。
         out = new DataOutputStream(socket.getOutputStream());
         out.writeUTF("exit"); // 既然关闭了,就发送个信号给服务器。
               // 删除该客户端。
        }
       } catch (IOException e1) {
        e1.printStackTrace();
       }
      }
     });

   new Thread(this).start(); // 打开一个线程,即执行本类的run()函数。
  } catch (UnknownHostException e) {
   e.printStackTrace();// 打印出错信息而已,别无他意。
  } catch (IOException e) {
   serverClose = true;
   mf.setMessage("服务器不存在或未打开!");
  }
 }

 public void run() {
  while (flag) {
   try {
    in = new DataInputStream(socket.getInputStream());
    mf.setMessage(in.readUTF());
   } catch (IOException e) {
    serverClose = true; // 服务器可能在有客户端存在的时候关闭,此时,客户端输入流会出错,刚执行此处
    mf.setMessage("服务器关闭了!");
    flag = false;// 跳出循环
   }
  }
 }

 public static void main(String[] agrs) {
  new Client(); // 先开服务器,再开客户端。代码入口处。
 }
}

//客户端界面  Form.java

package cc.nothing2012.blogServlet;

import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Form extends JFrame {

 private static final long serialVersionUID = 1L;
 private JLabel jlabelName = new JLabel("用户昵称:");
 private JTextArea jtaName = new JTextArea("");
 private JTextArea jtaShow = new JTextArea("");
 private JTextArea jtaWrite = new JTextArea("");
 
 public static JList jList=new JList();
 JScrollPane jScrollPane1 = new JScrollPane();

 public Form() {
  // 测试!
 }

 public Form(String str) {
  super(str);
 }

 public void mShow() {
  this.setVisible(true);
 }

 public void mClose() {
  this.setDefaultCloseOperation(EXIT_ON_CLOSE);
 }

 public void mform() {
  
     
  this.setLayout(null);
  this.setBounds(300, 300, 550, 550);
  this.getContentPane().setBackground(Color.lightGray);
  
  jlabelName.setBounds(10, 10, 900, 25);
  jtaName.setBounds(100, 10, 200, 25);
  
  JScrollPane jspShow = new JScrollPane(jtaShow);
  JScrollPane jspWrite = new JScrollPane(jtaWrite);
  
  jspShow.setBounds(30, 40, 350, 350);  
  jtaShow.setLineWrap(true);
  jtaShow.setEditable(false);
  jtaShow.setCaretPosition(jtaShow.getDocument().getLength());
  
  jspWrite.setBounds(30, 400, 330, 35);
  jtaWrite.setLineWrap(true);
  jtaWrite.setCaretPosition(jtaWrite.getDocument().getLength());
  
  JLabel jlOn=new JLabel("目前在线人的IP:");
  jlOn.setBounds(400, 10, 200, 25);
  // 坐标 xy   width,height
  jList.setBounds(385, 40, 150, 350);
  //jList.setModel(new DefaultListModel());
  
  this.add(jlabelName);
  this.add(jtaName);
  this.add(jlOn);   //
  
  this.add(jspShow);
  this.add(jList);
  this.add(jspWrite);
 }

 public String getName() {
  return jtaName.getText();
 }

 public void setMessage(String message) {
  jtaShow.append(message + "/n"); // 添加信息并换行。
 }

 public String getMessage() {
  if (!(jtaWrite.getText()).equals("")) { // 如果写的东西不为空
   if (!(jtaName.getText()).equals("")) { // 判断是谁写的信息
    return (jtaName.getText() + ": " + jtaWrite.getText());
   } else {
    return ("默认是骚包: " + jtaWrite.getText()); // 无名氏默认是ClientX
   }
  } else { // 什么都没写
   return "";
  }
 }

 public void clearWrite() { // 清空所写的东西。
  jtaWrite.setText("");
 }

 public static void main(String[] args) {
  Form mf = new Form(); // 测试用的而已。
  mf.mform();
  mf.mShow();
  mf.mClose();

 }

}
 

原创粉丝点击