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

📄 client.java

📁 简单的多用户聊天室,服务端和客户端使用AWT组件.
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import java.util.Calendar;
import javax.swing.*;

public class Client extends Frame implements ActionListener{

	private boolean login = false;
	private Color backGround = new Color(255, 255, 255);
	private String rightNow;
	private InetAddress clientAddress;
	private Socket connection;
	private DataInputStream in;
	private DataOutputStream out;
	private recThread receiver;
	
	private Button loginButton = new Button("登陆");
	private Button logoutButton = new Button("退出");
	private Button sendButton = new Button("发送");
	
	private Label userName = new Label("用户名:");
	private TextField getUserName = new TextField();	// 获取用户名
	private Label serverIP = new Label("服务器IP:");
	private TextField getServerIP = new TextField();		// 获取服务器 IP 地址
	private Label serverPort = new Label("服务器端口:");
	private TextField getServerPort = new TextField();  	// 获取服务器端口
	private Label inputTitle=new Label("想对大家说:");
	private TextArea input = new TextArea();            // 输入文本框
	private Label outputTitle=new Label("点滴心语:");
	private TextArea output = new TextArea();			// 输出文本框
	private Label user = new Label("在线好友(0)");
	private List userList = new List();
	// 用于接收服务器消息的线程类
	private class recThread extends Thread
	{
		public recThread()
		{
			start();
		}
		public void run()
		{
			try{
				while(login){
					String line = in.readUTF();
					rightNow = Calendar.getInstance().getTime().toLocaleString();
					if(line.charAt(0) == 'Q'){
						if(line.length() == 1){
							// 退出
							connection.close();
							rightNow = Calendar.getInstance().getTime().toLocaleString();
							output.append(rightNow+"\n!!!成功退出.\n\n");
							login = false;
							userList.clear();
							getUserName.setEditable(true);
							getServerIP.setEditable(true);
							getServerPort.setEditable(true);
							loginButton.setEnabled(true);
							sendButton.setEnabled(false);
							logoutButton.setEnabled(false);
							break;
						}
						else{
							// 其他用户退出
							userList.remove(line.substring(2));
							user.setText("User ("+userList.getItemCount()+")");
							output.append(rightNow+"\n"+"!!!很遗憾:"+line.substring(2)+"刚刚下线.\n\n");
						}
					}
					else if(line.charAt(0) == 'L'){
						// 其他用户登录
						userList.add(line.substring(2));
						user.setText("User ("+userList.getItemCount()+")");
						output.append(rightNow+"\n"+"!!!好消息: "+line.substring(2)+" 刚刚上线.\n\n");
					}
					else{
						output.append(rightNow+"\n"+line+"\n\n");
					}
				}
			}catch(SocketException se){
				rightNow = Calendar.getInstance().getTime().toLocaleString();
				output.append(rightNow+"\n!!!警告:与服务器断开连接.\n\n");
				login = false;
				userList.clear();
				getUserName.setEditable(true);
				getServerIP.setEditable(true);
				getServerPort.setEditable(true);
				loginButton.setEnabled(true);
				sendButton.setEnabled(false);
				logoutButton.setEnabled(false);				
			}catch (IOException ioe){
				output.append("Error: "+ioe+"\n\n");
			}
		}
	}
	// 响应关闭按钮的内部类
	private class WindowCloser extends WindowAdapter
	{
		public void windowClosing(WindowEvent we)
		{
			System.exit(0);
		}
	}
	
	
	//窗口布局
	private void openWindow()
	{
		Font fb = new Font("Helvetica", Font.BOLD, 17);
		Font fp = new Font("Courier", Font.PLAIN, 14);

		Panel userNamePanel=new Panel();
		userNamePanel.setLayout(new BorderLayout());
		userNamePanel.add("West",userName);
		userName.setBackground(backGround);
		userName.setFont(fp);
		userNamePanel.add("Center",getUserName);
		getUserName.setBackground(backGround);
		
		Panel serverIPPanel=new Panel();
		serverIPPanel.setLayout(new BorderLayout());
		serverIPPanel.add("West",serverIP);
		serverIP.setBackground(backGround);
		serverIP.setFont(fp);
		serverIPPanel.add("Center",getServerIP);
		getServerIP.setBackground(backGround);
		
		Panel serverPortPanel=new Panel();
		serverPortPanel.setLayout(new BorderLayout());
		serverPortPanel.add("West",serverPort);
		serverPort.setBackground(backGround);
		serverPort.setFont(fp);
		serverPortPanel.add("Center",getServerPort);
		getServerPort.setBackground(backGround);
		
		Panel logPanel=new Panel();
		logPanel.setLayout(new GridLayout(1,2,5,5));
		logPanel.add(loginButton);
		loginButton.setBackground(new Color(192, 192, 192));
		loginButton.setFont(fb);
		logPanel.add(logoutButton);
		logoutButton.setBackground(new Color(192, 192, 192));
		logoutButton.setFont(fb);
		
		Panel north = new Panel();
		north.setLayout(new GridLayout(2,2,10,5));
		north.add(serverIPPanel);
		north.add(userNamePanel);
		north.add(serverPortPanel);
		north.add(logPanel);
        
		Panel outputPanel = new Panel();
		outputPanel.setLayout(new BorderLayout());
		outputPanel.add("North",outputTitle);
		outputTitle.setBackground(backGround);
		outputTitle.setFont(fp);
		outputPanel.add("Center",output);
		output.setBackground(backGround);
		
		Panel inputPanel = new Panel();
		inputPanel.setLayout(new BorderLayout());
		inputPanel.add("North",inputTitle);
		inputTitle.setBackground(backGround);
		inputTitle.setFont(fp);
		inputPanel.add("Center",input);
		input.setBackground(backGround);
		
		Panel center = new Panel();
		center.setLayout(new BorderLayout());
		center.add("Center",outputPanel);
		center.add("South",inputPanel);
		
		Panel east = new Panel();
		east.setLayout(new BorderLayout());
		east.add("North", user);
		user.setBackground(backGround);
		user.setFont(fp);
		east.add("Center", userList);
		userList.setBackground(backGround);
		
		Panel south = new Panel();
		south.setLayout(new BorderLayout());
		south.add("Center", sendButton);
		sendButton.setBackground(new Color(192, 192, 192));
		sendButton.setFont(fb);

		
		setLayout(new BorderLayout());
		add("North", north);
		add("Center", center);
		add("East", east);
		add("South",south);
		setBackground(backGround);
			
	}
	

	
	
	
	// 构造方法
	public Client()throws UnknownHostException, IOException
	{
		super("多人聊天室客户端  Client");
		
		login = false;
		clientAddress = InetAddress.getLocalHost();
		byte[] ip = clientAddress.getAddress();
		String strIP = (ip[0]&0xFF)+"."+(ip[1]&0xFF)+
				"."+(ip[2]&0xFF)+"."+(ip[3]&0xFF);
		getServerIP.setText(strIP);
		getServerPort.setText("1234");

		output.setEditable(false);	// 输出文本框设为只读属性	
		loginButton.addActionListener(this);
		sendButton.addActionListener(this);
		sendButton.setEnabled(false);
		logoutButton.addActionListener(this);
		logoutButton.setEnabled(false);
		addWindowListener(new WindowCloser());
		
		getUserName.setText("请在此处输入您的名字");
		openWindow();
		pack();
		setSize(500, 550);
		show();
		
		rightNow = Calendar.getInstance().getTime().toLocaleString();
		output.append(rightNow+"\n多人聊天室客户端欢迎您!"+"\n\n");
	}
	// 登录
	private void logIn()
	{
		if(login) return;
		boolean accepted = false, refused = false;
		String line= new String("");
		try{
			connection = new Socket(getServerIP.getText(), 
					Integer.parseInt(getServerPort.getText()));
			in = new DataInputStream(connection.getInputStream());
			out = new DataOutputStream(connection.getOutputStream());
			out.writeUTF("L "+getUserName.getText());
			while(!accepted && !refused){
				line = in.readUTF();
				if(line.charAt(0) == 'R'){
					refused = true;
				}
				if(line.charAt(0) == 'A'){
					accepted = true;
				}
			}
			if(refused){
				rightNow = Calendar.getInstance().getTime().toLocaleString();
				output.append(rightNow+"\n!!!该用户已经登录,请换一个用户名再试试.\n\n");
			}
			if(accepted){
				rightNow = Calendar.getInstance().getTime().toLocaleString();
				output.append(rightNow+"\n!!!登录成功.\n\n");
				login = true;
				// 获取当前在线用户列表
				String[] str = line.split(" ");
				for (int i = 1; i < str.length; i ++){
					userList.add(str [i]);
				}
				user.setText("在线好友 ("+userList.getItemCount()+")");
				
				getUserName.setEditable(false);
				getServerIP.setEditable(false);
				getServerPort.setEditable(false);
				loginButton.setEnabled(false);
				sendButton.setEnabled(true);
				logoutButton.setEnabled(true);
				receiver = new recThread();
			}			
		}catch(ConnectException ce){
			rightNow = Calendar.getInstance().getTime().toLocaleString();
			output.append(rightNow+"\n!!!警告:未找到服务器\n\n");
		}catch(UnknownHostException uhe){
			rightNow = Calendar.getInstance().getTime().toLocaleString();
			output.append(rightNow+"\n!!!警告:未找到服务器\n\n");
		}catch(IOException ioe){
			output.append("Error: "+ioe+"\n\n");
		}
	}
	// 发送消息
	private void sendMsg()
	{
		if(!login) return;
		try{
			out.writeUTF("M "+input.getText());
			input.setText("");
		}catch (IOException ioe){
			output.append("Error: "+ioe+"\n\n");
		}
	}
	// 退出登录
	private void Quit()
	{
		if(!login) return;
		try{
			out.writeUTF("Q");
		}catch (IOException ioe){
			output.append("Error: "+ioe+"\n\n");
		}
	}
	// 消息处理方法
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource() == loginButton){
			logIn();
		}
		if(e.getSource() == sendButton){
			sendMsg();
		}
		if(e.getSource() == logoutButton){
			Quit();
		}
	}
	
	// 程序入口
	public static void main(String args [])throws UnknownHostException, IOException
	{
		Client c = new Client();
	}
}

⌨️ 快捷键说明

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