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

📄 client.java

📁 用JAVA实现聊天系统,能够实现多线程,多个用户同时聊天.
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.io.*;
import java.net.*;

public class Client extends JFrame{
	private JComboBox combobox;//组合框
	private JTextArea textarea;//区编辑框,用于显示各种信息
	private JScrollPane js;//区编辑框中的滚动条
	private JTextField textfield,textfield1,textfield2;//行编辑框,用于输入昵称,主机IP,聊天信息
	private JCheckBox checkbox;//复选框
	private JComboBox actionlist;//表情列表
	private JButton jb;//登录和离线按钮
	private Border border;//按钮背景
	Socket socket;//套接字
	ObjectOutputStream output;//输出流
	ObjectInputStream input;//输入流
	ClientReceiveThread recvthread;//客户端接收线程类对象
	public Client()//构造方法
	{
		super("用户");//标题
		Border bevelBorder=BorderFactory.createBevelBorder(BevelBorder.RAISED,Color.white,Color.white,Color.white,Color.white);
		Border emptyBorder=BorderFactory.createEmptyBorder(1,1,1,1);
		border=BorderFactory.createCompoundBorder(bevelBorder,emptyBorder);//定义按钮背景
		jb=new JButton();//创建按钮
		jb.setText("登录");//在按钮上显示登录
		jb.setForeground(Color.red);//按钮字显示为红色
		combobox=new JComboBox();//创建组合框
		combobox.addItem("全部");//在组合框里面添加"全部"
		combobox.setSelectedIndex(0);
		textarea=new JTextArea(20,20);//创建区编辑框
		
		textarea.setEditable(false);//设置为可读
		js=new JScrollPane();//创建滚动条
		js.getViewport().add(textarea);//在滚动条中添加区编辑框
		textfield=new JTextField("输入你的昵称!~",20);//在行编辑框中显示各种提示信息
		textfield1=new JTextField("输入主机的IP地址!~",20);
		textfield2=new JTextField("输入聊天信息!~",20);
		checkbox=new JCheckBox("悄悄话");//创建复选按钮
		checkbox.setSelected(false);
		actionlist=new JComboBox();//创建组合框
		actionlist.addItem("平常的");//在组合框中添加各种表情
		actionlist.addItem("高兴的");
		actionlist.addItem("气愤的");
		actionlist.addItem("发狂的");
		actionlist.setSelectedIndex(0);
		jb.setBorder(border);//添加按钮样式
		jb.setBounds(10,10,50,30);//设置各种组件的位置
		textarea.setBounds(30,55,450,250);
		textfield2.setBounds(30,360,450,35);
		textfield2.setEnabled(false);//设置为可读
		js.setBounds(30,55,450,250);
		
		combobox.setBounds(30,320,90,30);
		actionlist.setBounds(150,320,90,30);
		checkbox.setBounds(270,320,90,30);
		textfield.setBounds(100,10,120,20);
		textfield1.setBounds(230,10,120,20);
		setLayout(null);//布局管理器为空
		getContentPane().add(jb);//添加各种组件到容器中
		getContentPane().add(js);
		getContentPane().add(textfield2);
		getContentPane().add(combobox);
		getContentPane().add(actionlist);
		getContentPane().add(checkbox);
		getContentPane().add(textfield);
		getContentPane().add(textfield1);
		jb.addActionListener(new ActionListener()//添加按钮监听器
		{
			public void actionPerformed(ActionEvent e)
			{
				Login();//登录的方法
			}
		});
		
		textfield2.addActionListener(new ActionListener()//添加行编辑框监听器
		{
			public void actionPerformed(ActionEvent e)
			{
				SendMessage();//发送消息的方法
			}
		});
		addWindowListener(new WindowAdapter()//添加容器的监听器
		{
			public void windowClosing(WindowEvent e)
			{
				Logout();//离线的方法
				System.exit(0);
			}
		});
		setSize(550,460);//设置容器的大小
		show();//设置容器为可见
	}
	
	public void Login()//登录方法
	{
		if(jb.getText()=="登录"){//当点击按钮时,判断按钮上字,就使用不同的方法
		jb.setText("离线");
		textfield2.setEnabled(true);//设置各种状态
		textfield1.setEnabled(false);
		textfield.setEnabled(false);
		jb.setForeground(Color.blue);//设置颜色为蓝色
		try
		{
			String n=textfield1.getText();//输入主机IP的方法,并与主机连接,定义输入输出流
			socket=new Socket(n,8000);
			output=new ObjectOutputStream(socket.getOutputStream());
			output.flush();
			input=new ObjectInputStream(socket.getInputStream());
			output.writeObject(textfield.getText());
			output.flush();
			recvthread=new ClientReceiveThread(socket,output,input,combobox,textarea);//服务器接收信息线程
			recvthread.start();
			textfield1.setEnabled(false);
			textfield.setEnabled(false);
		}catch(Exception e)
		{;
		}
		
		}else{//当按钮上的字是离线时
			jb.setText("登录");
			textfield1.setEnabled(true);//设置各种状态
		textfield.setEnabled(true);
			textfield2.setEnabled(false);
			jb.setForeground(Color.red);
		if(socket.isClosed())//判断套接字是否关闭
		{
			return;
		}
		try
		{
			output.writeObject("用户下线");
			output.flush();
			input.close();
			output.close();
			socket.close();
			

		}catch(Exception e)
		{;
		}
			
		}
	}
	
	public void Logout()//离线的方法
	{
		textfield.setText("输入你的昵称!~");
		if(socket.isClosed())
		{
			return;
		}
		try
		{
			output.writeObject("用户下线");
			output.flush();
			input.close();
			output.close();
			socket.close();
			

		}catch(Exception e)
		{;
		}
	}
	
	public void SendMessage()//传消息的方法
	{
		String tosomebody=combobox.getSelectedItem().toString();//得到发送消息的对象
		String status="";//得到发送信息状态
		if(checkbox.isSelected())//判断是否选择了复选按钮
		{
			status="悄悄话";
		}
		String action=actionlist.getSelectedItem().toString();//得到表情
		String message=textfield2.getText();//得到聊天信息
		if(socket.isClosed())//判断套接字是否关闭
		{
			return;
		}
		try
		{
			output.writeObject("聊天信息");//处理各类信息
			output.flush();
			output.writeObject(tosomebody);
			output.flush();
			output.writeObject(status);
			output.flush();
			output.writeObject(action);
			output.flush();
			output.writeObject(message);
			output.flush();
		}catch(Exception e)
		{;
		}
	}
		
}

⌨️ 快捷键说明

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