java 聊天室

导读:
  import java.applet.*;
  import java.awt.*;
  import java.io.*;
  import java.net.*;
  import java.awt.event.*;
  public class ChatClient extends Applet{
  protected boolean loggedIn;//登入状态
  protected Frame cp;//聊天室框架
  protected static int PORTNUM=7777; //缺省端口号7777
  protected int port;//实际端口号
  protected Socket sock;
  protected BufferedReader is;//用于从sock读取数据的BufferedReader
  protected PrintWriter pw;//用于向sock写入数据的PrintWriter
  protected TextField tf;//用于输入的TextField
  protected TextArea ta;//用于显示对话的TextArea
  protected Button lib;//登入按钮
  protected Button lob;//登出的按钮
  final static String TITLE ="Chatroom applet>>>>>>>>>>>>>>>>>>>>>>>>";
  protected String paintMessage;//发表的消息
  public ChatParameter Chat;
  public void init(){
  paintMessage="正在生成聊天窗口";
  repaint();
  cp=new Frame(TITLE);
  cp.setLayout(new BorderLayout());
  String portNum=getParameter("port");//呢个参数勿太明
  port=PORTNUM;
  if (portNum!=null) //书上是portNum==null,十分有问题
  port=Integer.parseInt(portNum);
  //CGI
  ta=new TextArea(14,80);
  ta.setEditable(false);//read only attribute
  ta.setFont(new Font("Monospaced",Font.PLAIN,11));
  cp.add(BorderLayout.NORTH,ta);
  Panel p=new Panel();
  Button b;
  //for login button
  p.add(lib=new Button("Login"));
  lib.setEnabled(true);
  lib.requestFocus();
  lib.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e){
  login();
  lib.setEnabled(false);
  lob.setEnabled(true);
  tf.requestFocus();//将键盘输入锁定再右边的文本框中
  }
  });
  //for logout button
  p.add(lob=new Button ("Logout"));
  lob.setEnabled(false);
  lob.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
  logout();
  lib.setEnabled(true);
  lob.setEnabled(false);
  lib.requestFocus();
  }
  });
  p.add(new Label ("输入消息:"));
  tf=new TextField(40);
  tf.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
  if(loggedIn){
  //pw.println(Chat.CMD_BCAST+tf.getText());//Chat.CMD....是咩野来?
  int j=tf.getText().indexOf(":");
  if(j>0) pw.println(Chat.CMD_MESG+tf.getText());
  else
  pw.println(Chat.CMD_BCAST+tf.getText());
  tf.setText("");//勿使用flush()?
  }
  }
  });
  p.add(tf);
  cp.add(BorderLayout.SOUTH,p);
  cp.addWindowListener(new WindowAdapter(){
  public void windowClosing(WindowEvent e){
  //如果执行了setVisible或者dispose,关闭窗口
  ChatClient.this.cp.setVisible(false);
  ChatClient.this.cp.dispose();
  logout();
  }
  });
  cp.pack();//勿明白有咩用?
  //将Frame cp放在中间
  Dimension us=cp.getSize(),
  them=Toolkit.getDefaultToolkit().getScreenSize();
  int newX=(them.width-us.width)/2;
  int newY=(them.height-us.height)/2;
  cp.setLocation(newX,newY);
  cp.setVisible(true);
  paintMessage="Window should now be visible";
  repaint();
  }
  //登录聊天室
  public void login(){
  if(loggedIn) return;
  try{
  sock=new Socket(getCodeBase().getHost(),port);
  is=new BufferedReader(new InputStreamReader(sock.getInputStream()));
  pw=new PrintWriter(sock.getOutputStream(),true);
  }catch(IOException e){
  showStatus("Can't get socket: "+e);
  cp.add(new Label("Can't get socket: "+e));
  return;}
  //构造并且启动读入器,从服务器读取数据,输出到文本框中
  //这里,长成一个线程来避免锁住资源(lockups)
  new Thread (new Runnable(){
  public void run(){
  String line;
  try{
  while(loggedIn &&((line=is.readLine())!=null))
  ta.appendText(line+"/n");
  }catch(IOException e){
  showStatus("我的天啊,掉线了也!!!!");
  return;
  }
  }
  }).start();
  //假定登录(其实只是打印相关信息,并没有真正登录)
  // pw.println(Chat.CMD_LOGIN+"AppletUser");
  pw.println(Chat.CMD_LOGIN+"AppletUser");
  loggedIn =true;
  }
  //模仿退出的代码
  public void logout(){
  if(!loggedIn)
  return;
  loggedIn=false;
  try{
  if(sock!=null)
  sock.close();
  }catch(IOException ign){
  // 异常处理哦
  }
  }
  //没有设置stop的方法,即使从浏览器跳到另外一个网页的时候
  //聊天程序还可以继续运行
  public void paint(Graphics g){
  Dimension d=getSize();
  int h=d.height;
  int w=d.width;
  g.fillRect(0,0,w,2);
  g.setColor(Color.black);
  g.drawString(paintMessage,10,(h/2)-5);
  }
  }
  聊天室服务器端
  import java.net.*;
  import java.io.*;
  import java.util.*;
  public class ChatServer{
  //聊天室管理员ID
  protected final static String CHATMASTER_ID="ChatMaster";
  //系统信息的分隔符
  protected final static String SEP=": ";
  //服务器的Socket
  protected ServerSocket servSock;
  //当前客户端列表
  protected ArrayList clients;
  //调试标记
  protected boolean DEBUG=false;
  public ChatParameter Chat;
  //主方法构造一个ChatServer,没有返回值
  public static void main(String[] argv){
  System.out.println("Chat server0.1 starting>>>>>>>>>>>>>>>>");
  ChatServer w=new ChatServer();
  w.runServer();
  System.out.println("***ERROR*** Chat server0.1 quitting");
  }
  //构造和运行一个聊天服务
  ChatServer(){
  Chat=new ChatParameter();
  clients=new ArrayList();
  try{
  servSock=new ServerSocket(7777);//实有问题拉,不过可能是他自己定义既一个class.
  System.out.println("Chat Server0.1 listening on port:"+7777);
  }catch(Exception e){
  log("IO Exception in ChatServer. ");
  System.exit(0);
  }
  }
  public void runServer(){
  try{
  while(true){
  Socket us=servSock.accept();
  String hostName=us.getInetAddress().getHostName();
  System.out.println("Accpeted from "+hostName);
  //一个处理的线程
  ChatHandler cl=new ChatHandler(us,hostName);
  synchronized(clients){
  clients.add(cl);
  cl.start();
  if(clients.size()==1)
  cl.send(CHATMASTER_ID,"Welcome!You are the first one here");
  else{
  cl.send(CHATMASTER_ID,"Welcome!You are the latest of"+
  clients.size()+" users.");
  }
  }
  }
  }catch(Exception e){
  log("IO Exception in runServer:"+e);
  System.exit(0);
  }
  }
  protected void log(String s){
  System.out.println(s);
  }
  //处理会话的内部的类
  protected class ChatHandler extends Thread {
  //客户端scoket
  protected Socket clientSock;
  //读取socket的BufferedReader
  protected BufferedReader is ;
  //在socket 上发送信息行的PrintWriter
  protected PrintWriter pw;
  //客户端出主机
  protected String clientIP;
  //句柄
  protected String login;
  public ChatHandler (Socket sock,String clnt)throws IOException {
  clientSock=sock;
  clientIP=clnt;
  is=new BufferedReader(
  new InputStreamReader(sock.getInputStream()));
  pw=new PrintWriter (sock.getOutputStream(),true);
  }
  //每一个ChatHandler是一个线程,下面的是他的run()方法
  //用于处理会话
  public void run(){
  String line;
  try{
  while((line=is.readLine())!=null){
  char c=line.charAt(0);//我顶你老母啊 ,果只Chat.CMD咩xx冇定义 扑啊///!!!
  line=line.substring(1);
  switch(c){
  //case Chat.CMD_LOGIN:
  case 'l':
  if(!Chat.isValidLoginName(line)){
  send(CHATMASTER_ID,"LOGIN"+line+"invalid");
  log("LOGIN INVALID from:"+clientIP);
  continue;
  }
  login=line;
  broadcast(CHATMASTER_ID,login+" joins us,for a total of"+
  clients.size()+" users");
  break;
  // case Chat.CMD_MESG:
  case 'm':
  if(login==null){
  send(CHATMASTER_ID,"please login first");
  continue;
  }
  int where =line.indexOf(Chat.SEPARATOR);
  String recip=line.substring(0,where);
  String mesg=line.substring (where+1);
  log("MESG: "+login+"--->"+recip+": "+mesg);
  ChatHandler cl=lookup(recip);
  if(cl==null)
  psend(CHATMASTER_ID,recip+"not logged in.");
  else
  cl.psend(login,mesg);
  break;
  //case Chat.CMD_QUIT:
  case 'q':
  broadcast(CHATMASTER_ID,"Goodbye to "+login+"@"+clientIP);
  close();
  return;//ChatHandler结束
  // case Chat.CMD_BCAST:
  case 'b':
  if(login!=null)
  broadcast(login,line);
  else
  log("B
  break;
  default:
  log("Unknow cmd"+c+"from"+login+"@"+clientIP);
  }
  }
  }catch(IOException e){
  log("IO Exception :"+e);
  }finally{
  //sock 结束,我们完成了
  //还不能发送再见的消息
  //得有简单的基于命令的协议才行
  System.out.println(login+SEP+"All Done");
  synchronized(clients){
  clients.remove(this);
  if(clients.size()==0){
  System.out.println(CHATMASTER_ID+SEP+
  "I'm so lonely I could cry>>>>>");
  }else if(clients.size()==1){
  ChatHandler last=(ChatHandler)clients.get(0);
  last.send(CHATMASTER_ID,"Hey,you are talking to yourself again");
  }
  else{
  broadcast(CHATMASTER_ID,"There are now"+clients.size()+" users");
  }
  }
  }
  }
  protected void close(){
  if(clientSock==null){
  log("close when not open");
  return;
  }
  try{
  clientSock.close();
  clientSock=null;
  }catch(IOException e){
  log("Failure during close to "+clientIP);
  }
  }
  //发送一条消息给用户
  public void send(String sender,String mesg){
  pw.println(sender+SEP+"*>"+mesg);
  }
  //发送私有的消息
  protected void psend(String sender ,String msg){
  send("<*"+sender+"*>",msg);
  }
  //发送一条消息给所有的用户
  public void broadcast (String sender,String mesg){
  System.out.println("Broadcasting"+sender+SEP+mesg);
  for(int i=0;i
  ChatHandler sib=(ChatHandler)clients.get(i);
  if(DEBUG)
  System.out.println("Sending to"+sib);
  sib.send(sender,mesg);
  }
  if(DEBUG) System.out.println("Done broadcast");
  }
  protected ChatHandler lookup(String nick){
  synchronized(clients){
  for(int i=0;i
  ChatHandler cl=(ChatHandler)clients.get(i);
  if(cl.login.equals(nick))
  return cl;
  }
  }
  return null;
  }
  //将ChatHandler对象转换成一个字符串
  public String toString(){
  return "ChatHandler["+login+"]";
  }
  }
  }
  public class ChatParameter {
  public static final char CMD_BCAST='b';
  public static final char CMD_LOGIN='l';
  public static final char CMD_MESG='m';
  public static final char CMD_QUIT='q';
  public static final char SEPARATOR=':';//?????
  public static final int PORTNUM=7777;
  public boolean isValidLoginName(String line){
  if (line.equals("CHATMASTER_ID"))
  return false;
  return true;
  }
  public void main(String[] argv){
  }
  }
  客户端:
  import javax.swing.*;
  import java.awt.event.*;
  import java.io.*;
  import java.net.*;
  import java.awt.*;
  
  public class ClientPoint extends JFrame implements
  ActionListener,KeyListener{
  static int SERVERPORT=8088;
  static String SERVERADDRESS="127.0.0.1";
  private BufferedReader cin=null;
  private PrintWriter cout=null;
  private Socket client=null;
  public String clientname;
  private JPanel jPanel1=new JPanel();
  private JTextField jTextSendInfo=new JTextField(38);
  private JTextArea jTextGetInfo=new JTextArea(16,33);
  public JScrollPane areaScrollPane=new JScrollPane(jTextGetInfo);
  private Button Send=new Button("发送");
  private Button Link=new Button("连接");
  
  public ClientPoint(){
  super("欢迎使用聊天室^_^");
  enableEvents(AWTEvent.WINDOW_EVENT_MASK);
  setSize(480,465);
  jPanel1.add("South",jTextSendInfo);
  jPanel1.setBackground(new Color(75, 234, 166));
  jTextGetInfo.setBackground(new Color(122,150,223));
  jTextGetInfo.setFont(new java.awt.Font("Dialog", 0, 15));
  jTextGetInfo.setForeground(new Color(176, 42, 0));
  this.setResizable(false);
  Send.setBackground(Color.pink);
  Send.setForeground(Color.blue);
  Send.setBounds(new Rectangle(92, 400, 90, 37));
  Link.setBackground(Color.pink);
  Link.setForeground(Color.blue);
  areaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
  areaScrollPane.setAutoscrolls(true);
  jTextSendInfo.setText("");
  jPanel1.add("North",areaScrollPane);
  jTextGetInfo.setEditable(false);
  jPanel1.add("South",Send);
  Send.setEnabled(false);
  jPanel1.add("South",Link);
  Send.addActionListener(this);
  jTextSendInfo.addKeyListener(this);
  Link.addActionListener(new ActionListener()
  {public void actionPerformed(ActionEvent e){
  if(!jTextSendInfo.getText().equals("")){
  clientname=jTextSendInfo.getText();
  connect();
  Link.setEnabled(false);
  Send.setEnabled(true);
  jTextSendInfo.setText("");
  }
  else JOptionPane.showMessageDialog(null,"提示:请输入昵称!!","消
  息对话框",JOptionPane.WARNING_MESSAGE);
  }});
  this.setContentPane(jPanel1);
  }
  public void connect(){
  try{
  client=new Socket(SERVERADDRESS,SERVERPORT);
  cout=new PrintWriter(client.getOutputStream());
  cin=new BufferedReader(
  new InputStreamReader(client.getInputStream()));
  cout.println("欢迎["+clientname+"]进入聊天室");
  cout.flush();
  Receiver r=new Receiver();
  r.start();
  }catch(Exception e){
  
  e.printStackTrace();
  }
  }
  protected void processWindowEvent(WindowEvent e){
  if(e.getID()==WindowEvent.WINDOW_CLOSING){
  quit();
  }
  super.processWindowEvent(e);
  }
  public static void main(String[] args){
  ClientPoint cp=new ClientPoint();
  cp.show();
  
  }
  
  class Receiver extends Thread{
  public void run(){
  String msg=null;
  JScrollBar sb;
  try{
  msg=cin.readLine();
  while(true){
  jTextGetInfo.append(msg+"/n");
  sb=areaScrollPane.getVerticalScrollBar();
  sb.setValue(sb.getMaximum()+50);
  jTextSendInfo.setEnabled(true);
  msg=cin.readLine();
  }
  }catch(Exception e){
  Send.setEnabled(false);
  }
  }
  }
  void quit(){
  try{
  cout.println("["+clientname+"]离开聊天室");
  cout.flush();
  cout.println("exit");
  cout.flush();
  System.out.print("lianjieduankai");
  cin.close();
  cout.close();
  client.close();
  }catch(Exception e){}
  finally{System.exit(0);
  }
  }
  
  public void actionPerformed(ActionEvent e){
  if(!jTextSendInfo.getText().equals("")){
  cout.println("["+clientname+"]:"+jTextSendInfo.getText());
  cout.flush();
  jTextSendInfo.setText("");
  jTextSendInfo.setFocusable(true);
  }
  else JOptionPane.showMessageDialog(null,"提示:请输入聊天内容!
  !","消息对话框",JOptionPane.WARNING_MESSAGE);
  }
  
  public void keyPressed(KeyEvent e){}
  public void keyTyped(KeyEvent e){}
  public void keyReleased(KeyEvent e)
  {
  if (e.getKeyCode()==KeyEvent.VK_ENTER)
  {
  if(!jTextSendInfo.getText().equals(""))
  {
  if(cout==null)
  {
  clientname=jTextSendInfo.getText();
  connect();
  Link.setEnabled(false);
  Send.setEnabled(true);
  jTextSendInfo.setText("");
  }
  else
  {
  cout.println("["+clientname+"]:"+jTextSendInfo.getText());
  cout.flush();
  jTextSendInfo.setText("");
  jTextSendInfo.setFocusable(true);
  }
  }
  else
  {
  if (cout==null)
  {
  JOptionPane.showMessageDialog(null,"提示:请输入昵称!!","消息对话
  框",JOptionPane.WARNING_MESSAGE);
  }
  else JOptionPane.showMessageDialog(null,"提示:请输入聊天内容!!","消息对话
  框",JOptionPane.WARNING_MESSAGE);
  }
  
  
  
  }
  }
  
  }
  
  服务器端:
  
  import java.net.*;
  import java.io.*;
  
  public class ServerPoint extends Thread{
  static int SERVERPORT=8088;
  private Socket client;
  public static int i=0;
  public static String[] vct=new String[10];
  public ServerPoint(){}
  public void run(){
  ClientThread.log("服务器端程序启动...");
  try{
  ServerSocket server=new ServerSocket(SERVERPORT);
  while(true){
  client=server.accept();
  ClientThread ct=new ClientThread(client);
  ct.start();
  }
  }catch(Exception e){
  e.printStackTrace();
  ClientThread.log("服务器端程序关闭。。。");
  System.exit(0);
  }
  }
  public static void main(String[] args){
  
  ServerPoint sp=new ServerPoint();
  sp.start();
  }
  public static synchronized void message(String msg){
  vct[i]=msg;
  i=(i+1)%10;
  vct[i]="*";
  
  }
  }
  class ClientThread extends Thread{
  private static int ii=0;
  private Socket s;
  String msg=null;
  ServerSocket serverSocket=null;
  Socket socket=null;
  BufferedReader cin=null;
  PrintWriter cout=null;
  public ClientThread(Socket s){
  this.s=s;
  }
  public void run(){
  try{
  cin=new BufferedReader(
  new InputStreamReader(s.getInputStream()));
  
  cout=new PrintWriter(s.getOutputStream());
  SendToAll sta=new SendToAll();
  sta.start();
  msg=cin.readLine();
  ii++;
  System.out.println("some connect us!聊天室里总共有"+ii+"个人");
  while(!msg.equals("exit")){
  ServerPoint.message(msg);
  msg=cin.readLine();
  }
  
  if(msg.equals("exit"))
  { --ii;
  System.out.print("someone exit/n聊天室里总共有"+ii+"个人");
  cin.close();
  cout.close();
  s.close();
  }
  }catch(Exception e){
  e.printStackTrace();
  }
  }
  static void log(String strInfo){
  System.out.println(strInfo);
  }
  class SendToAll extends Thread{
  private int j=-1;
  public void run(){
  while(true)
  {
  try{
  sleep(500);
  if(j==-1){
  if(!ServerPoint.vct[0].equals("*")){
  cout.println(ServerPoint.vct[0]);
  cout.flush();
  j=1;
  }
  else {
  cout.println(ServerPoint.vct[1]);
  cout.flush();
  j=2;
  }
  }
  while(!ServerPoint.vct[j].equals("*"))
  {
  
  cout.println(ServerPoint.vct[j]);
  cout.flush();
  j=(j+1)%10;
  
  }
  }catch(Exception e){}
  }
  }
  }
  }

本文转自
http://xxw8393.blog.163.com/blog/static/37256834200822434843373/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值