⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.java

📁 QQ聊天程序
💻 JAVA
字号:
package com.tarena.xiaozr.qq;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
/**
 * 客户端的程序,完成客户端屏幕的刷新
 * @Author xiaozr
 * @Date 2008-05-05
 * @version 1.0
 */
public class Client
  extends Thread 
    implements ActionListener
{
  private TextArea ta ;
  private TextField tf ;
  private Frame f;
  private Button b1;
  private Panel p ;
  private String name;
  private Socket socket;
  private DataInputStream in;
  private DataOutputStream out;
  private String temp = "";          //用于比较两次输入是否相同
  private boolean flag = true;       //用于判断是否需要刷新客户端的TEXTAREA显示
  
  /**
   * 构造器,记录客户的NAME和完成界面的初始化,同时调用INIT方法
   * @param name 客户名称
   * @Author xiaozr
   * @Date 2008-05-05
   */
  public Client(String name){
  	//记录登陆者的名字
  	this.name = name;
  	f = new Frame("client frame");
  	f.setLocation(300,300);
  	ta = new TextArea(20,60);
  	tf = new TextField("",40);
  	b1 = new Button("send");
  	p = new Panel();
  	ta.setEditable(false);
  	p.add(tf);
  	p.add(b1);
  	f.add(p,BorderLayout.NORTH);
  	f.add(ta,BorderLayout.CENTER);
  	f.pack();
  	f.show();
  	init();
  }
  /**
   * 完成SOCKET连接以及注册监听,同时启动线程
   * @Author xiaozr
   * @Date 2008-05-05
   */
  private void init(){
  	try{
  	  socket = new Socket("127.0.0.1", 2222);
  	  in = new DataInputStream(socket.getInputStream());
  	  out = new DataOutputStream(socket.getOutputStream());
  	  //发送登陆者名字,并读取服务端的信息
  	  out.writeUTF("<1.1>");//通知服务器,有新人登陆,<1.1>“标识”刚登录上来的用户名,相当于请求类型(请求协议);
	  //当然也可以将<1.1>与name信息封装成一个Message对象,这样更加方便。
      	  out.writeUTF(name);//发送新人的用户名
  	  out.writeUTF("<2.1>");//请求服务器发送全部聊天信息
  	  ta.setText(in.readUTF());	  
    }catch(Exception ee){
    	//出现SOCKET异常就退出
    	ee.printStackTrace();
    	System.exit(1);
    }
    //注册监听
  	tf.addActionListener(this);
  	b1.addActionListener(this);
  	f.addWindowListener(new WindowAdapter(){
  		//点关闭以后先通知服务器,然后将客户端刷新显示的线程关闭
  		public void windowClosing(WindowEvent e){
  			try{
  				out.writeUTF("<3.2>");//这种请求协议代表“有人离开”
  				flag = false;
  				Thread.sleep(2000);
  			}catch(Exception ee){
  				ee.printStackTrace();
  			}
  			System.exit(1);
  		}
  	});
    this.start();
  }
  /**
   * 监听处理方法,主要是将客户说的话提交到服务器端,同时更新客户端的显示
   * @Author xiaozr
   * @Date 2008-05-05
   */
  public void actionPerformed(ActionEvent e){
  	//判断是否和上句话相同,防止用回车刷屏
  	if(tf.getText()!=null && (!temp.equals(tf.getText()))){
  		temp = tf.getText();
  		try{
  	        out.writeUTF("<2.2>");//代表客户正常说话
  	        out.writeUTF(tf.getText());
  	        out.writeUTF("<2.1>");
  	        ta.setText(in.readUTF());
  	        //发送信息后清空TF,同时TF获得光标焦点
  	        tf.setText("");
  	        tf.requestFocus();
  	    }catch(Exception ee){
  	    	ee.printStackTrace();
  	    }
    }
  }
  /**
   * 线程的方法体,功能是每隔半秒更新客户端的显示;实现群发显示有两种方式1》由服务器主动调所有的socket;2》由客户端请      * 求服务器每隔单元时间发送全部聊天信息
   *@Author xiaozr
   *@Date 2008-05-05
   */
  public void run(){
  	//用FLAG判断客户端是否需要刷新屏幕
  	while(flag){
  		try{
  			Thread.sleep(500);
  	        	out.writeUTF("<2.1>");//要求刷新屏幕
  	        	ta.setText(in.readUTF());
  	    	}catch(Exception ee){
  	    		//出现异常代表服务器出现问题,客户端提示后退出
  	    		ee.printStackTrace();
  	    		ta.setText("服务器出现错误,本窗口3秒后关闭。");
  	    		try{
  	    			Thread.sleep(3000);
  	    		}catch(Exception ea){
  	    			ea.printStackTrace();
  	    		}
  	    		System.exit(1);
  	   	}
  	}
  }
	  
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -