黑马程序员-Java基础综合练习:简易聊天客户端

本文介绍了如何使用Java编程实现一个简单的聊天客户端。涵盖了socket编程、按钮操作和字符串处理等基础知识,适合初学者进阶实践。
摘要由CSDN通过智能技术生成

------- android培训java培训、期待与您交流! ----------


package along.client.model;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import along.chatserver.common.MessageInfo;
import along.chatserver.common.MessageType;
public class ConnectToServer {
	public  ConnectToServer() {
	}
	public Socket connectToServer(Object obj) {
		Socket socket=null;
		try {
			socket=new Socket("127.0.0.1",3002);
			ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream());
			oos.writeObject(obj);
			oos.flush();
			ObjectInputStream ois=new ObjectInputStream(socket.getInputStream());
			MessageInfo info=(MessageInfo)ois.readObject();
			if(info.getMsgType()!=MessageType.TYPE_1){
				ois.close();
				oos.close();
				socket.close();
				socket=null;
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return socket;
	}
}
package along.client.model;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
/**
 * 查询数据,并将数据显示在列表中
 * @author Along
 *
 */
public class DataModel extends AbstractTableModel{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Vector<Vector<String>> rowVector=null;
	private Vector<String> colum=null;
	public  DataModel(Vector<Vector<String>> rowVector,Vector<String> colum) {
		this.rowVector=rowVector;
		this.colum=colum;
	}
	public Vector<Vector<String>> queryData(String sql,String[]paras){
		return rowVector;
	}
	@Override
	public int getColumnCount() {
		if(colum==null)
			return 0;
		return colum.size();
	}
	@Override
	public int getRowCount() {
		if(rowVector==null)
			return 0;
		return rowVector.size();
	}
	@Override
	public Object getValueAt(int row, int colum) {
		//返回第 row 行,第 colum 列的内容给JTable对象用以填充相对应的单元格
		return rowVector.get(row).get(colum);
	}
	@Override
	public String getColumnName(int column) {
		//返回第 column列的值用作 JTable 对象相对应位置的标题
		return this.colum.get(column);
	}
}
package along.client.model;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Vector;
import along.chatserver.common.MessageInfo;
import along.chatserver.common.MessageType;
import along.client.tools.ChatFrams;
import along.client.tools.ChatRoomFrames;
import along.client.tools.ClientTools;
import along.client.tools.MessagesStore;
import along.client.view.ChatJFrame;
import along.client.view.ChatRoomJFrame;
public class ReceiveThread implements Runnable{
	private ObjectInputStream ois;
	public  ReceiveThread(ObjectInputStream ois) {
		this.ois=ois;
	}
	@Override
	public void run() {
		try {
			ChatRoomJFrame roomJFrame;
			while (true) {
				MessageInfo messageInfo=(MessageInfo)ois.readObject();
				switch (messageInfo.getMsgType()) {
				case MessageType.TYPE_3:
					ChatJFrame frame=ChatFrams.getChatFramsMap().get(messageInfo.getSender());
					if(frame==null){
						String sender=messageInfo.getSender();
						if(!ClientTools.getAllFriends().contains(sender))
							return;
						ClientTools.getUserList().getNewMessages(sender);
						Vector<MessageInfo>messages=MessagesStore.getMessagesStoreMap().get(sender);
						if(messages==null){
							messages=new Vector<MessageInfo>();
							messages.add(messageInfo);
							MessagesStore.getMessagesStoreMap().put(sender, messages);
						}
						else{
							messages.add(messageInfo);
							MessagesStore.getMessagesStoreMap().put(sender, messages);
						}
					}
					else {
						frame.addNewInfo(messageInfo);
					}
					break;
				case MessageType.TYPE_5:
					ClientTools.getUserList().changeUserOnlineState(messageInfo);
					break;
				case MessageType.TYPE_6:
					String account=messageInfo.getContent();
					if(!ClientTools.getAllFriends().contains(account))
						continue;
					ClientTools.getUserList().changeUserLoginState(account);
					break;
				case MessageType.TYPE_7:
					String account2=messageInfo.getContent();
					if(!ClientTools.getAllFriends().contains(account2))
						continue;
					ClientTools.getUserList().changeUserLogoutState(account2);
					break;
				case MessageType.TYPE_8:
					Vector<String> friends=messageInfo.getFriendVector();
					ClientTools.getAllFriends().addAll(friends);
					ClientTools.getUserList().getAllFriendList();
					break;
				case MessageType.TYPE_10:
					if(ClientTools.getSearchDialog()!=null){
						ClientTools.getSearchDialog().receiveQueryFriendMessage(messageInfo);
					}
					break;
				case MessageType.TYPE_13:
					if(ClientTools.getSearchDialog()!=null)
						ClientTools.getSearchDialog().receiveAddFriendResult(messageInfo);
					break;
				case MessageType.TYPE_14:
					ClientTools.getAllFriends().add(messageInfo.getContent());
					ClientTools.getUserList().addFriendChangeList(messageInfo.getContent(),messageInfo.isOnline());
					break;
				case MessageType.TYPE_15:
					ClientTools.getAllFriends().remove(messageInfo.getContent());
					ClientTools.getUserList().delFriendChangeList(messageInfo.getContent());
					break;
				case MessageType.TYPE_17:
					roomJFrame=ChatRoomFrames.getChatRoomFramMap().get(messageInfo.getReceiver());
					if(roomJFrame==null)
						continue;
					roomJFrame.userJoinRoom(messageInfo);
					break;
				case MessageType.TYPE_18:
					roomJFrame=ChatRoomFrames.getChatRoomFramMap().get(messageInfo.getReceiver());
					if(roomJFrame==null)
						continue;
					roomJFrame.userLeaveRoom(messageInfo);
					break;
				case MessageType.TYPE_19:
					roomJFrame=ChatRoomFrames.getChatRoomFramMap().get(messageInfo.getReceiver());
					if(roomJFrame==null)
						continue;
					roomJFrame.addNewInfo(messageInfo);
					break;
				case MessageType.TYPE_20:
					if(ClientTools.getSearchDialog()!=null)
						ClientTools.getSearchDialog().receiveJoinChatRoomResult(messageInfo);
					break;
				case MessageType.TYPE_23:
					if(ClientTools.getCreateChatRoomDialog()==null)
						System.out.println("创建聊天室窗口为空");
					ClientTools.getCreateChatRoomDialog().getCreateResult(messageInfo);
					break;
				case MessageType.TYPE_25:
					if(ClientTools.getSearchDialog()!=null)
						ClientTools.getSearchDialog().receiveQueryChatRoomMessage(messageInfo);
					break;
				}
			}
		} catch (IOException e) {
			try {
				ois.close();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			ClientTools.getUserList().quitProgram();
			System.out.println("退出客户端");
			return;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
package along.client.tools;
import java.util.HashMap;
import along.client.view.ChatJFrame;
public class ChatFrams {
	private static HashMap<String, ChatJFrame> chatFramMap=new HashMap<String, ChatJFrame>();
	public  ChatFrams() {
	}
	public static HashMap<String, ChatJFrame> getChatFramsMap() {
		return chatFramMap;
	}
}
package along.client.tools;
import java.util.HashMap;
import along.client.view.ChatRoomJFrame;
public class ChatRoomFrames {
	private static HashMap<String, ChatRoomJFrame> chatRoomFramMap=new HashMap<String, ChatRoomJFrame>();
	public static HashMap<String, ChatRoomJFrame> getChatRoomFramMap() {
		return chatRoomFramMap;
	}
}
package along.client.tools;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.Vector;
import javax.imageio.ImageIO;
import along.chatserver.common.MessageInfo;
import along.client.view.CreateChatRoomDialog;
import along.client.view.SearchDialog;
import along.client.view.UserJPanel;
import along.client.view.UserList;
public class ClientTools {
	private static UserList userList;
	private static SearchDialog searchDialog;
	private static CreateChatRoomDialog createChatRoomDialog;
	private static ObjectOutputStream oos;
	private static Vector<String>friendList=new Vector<String>();;
	private static UserJPanel currentSelectedUser=null;
	/**
	 * 宋体 斜体,20号
	 */
	public static Font font1=new Font("宋体", Font.PLAIN|Font.ITALIC, 20);
	/**
	 * 楷体 粗斜体,30号
	 */
	public static Font font2=new Font("楷体", Font.PLAIN|Font.BOLD|Font.ITALIC, 30);
	/**
	 * 楷体体 粗体,20号
	 */
	public static Font font3=new Font("楷体", Font.PLAIN|Font.BOLD, 20);
	/**
	 * 楷体 粗体,40号
	 */
	public static Font font4=new Font("楷体", Font.PLAIN|Font.BOLD, 40);
	/**
	 * 楷体 普通,15号
	 */
	public static Font font5=new Font("楷体", Font.PLAIN, 15);
	/**
	 * 计算机屏幕宽度
	 */
	public static final int SCREEN_WIDTH=(int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
	/**
	 * 计算机屏幕高度
	 */
	public static final int SCREEN_HEIGHT=(int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
	/**
	 * 接收图片路径参数,并返回图片对象
	 * @param picDirectory图片的存储路径
	 * @return图片对象
	 */
	public static Image getImage(String picDirectory) {
		Image im=null;
		try
		{
			im=ImageIO.read(new File(picDirectory));
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return im;
	}
	public static void sendMessage(MessageInfo messageInfo) {
		try {
			oos.writeObject(messageInfo);
		} catch (IOException e) {
			e.printStackTrace();
			ClientTools.getUserList().quitProgram();
		}
	}
	/**
	 * 
	 * @param imageDirectory 图片路径
	 * @return  变成灰色的图片
	 */
	public static BufferedImage getGrayPicture(String imageDirectory){
		BufferedImage originalImage=null;
		try {
			originalImage = ImageIO.read(new FileInputStream(imageDirectory));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		BufferedImage grayPicture;  
		int imageWidth = originalImage.getWidth();  
		int imageHeight = originalImage.getHeight();  
		grayPicture = new BufferedImage(imageWidth, imageHeight,     
				BufferedImage.TYPE_3BYTE_BGR);  
		ColorConvertOp cco = new ColorConvertOp(ColorSpace     
				.getInstance(ColorSpace.CS_GRAY), null);     
		cco.filter(originalImage, grayPicture);     
		return grayPicture;     
	}
	public static BufferedImage getSRGBPicture(String imageDirectory){
		BufferedImage originalImage=null;
		try {
			originalImage = ImageIO.read(new FileInputStream(imageDirectory));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		BufferedImage magentaPicture;  
		int imageWidth = originalImage.getWidth();  
		int imageHeight = originalImage.getHeight();  
		magentaPicture = new BufferedImage(imageWidth, imageHeight,     
				BufferedImage.TYPE_3BYTE_BGR);  
		ColorConvertOp cco = new ColorConvertOp(ColorSpace     
				.getInstance(ColorSpace.CS_sRGB), null);     
		cco.filter(originalImage, magentaPicture);     
		return magentaPicture;     
	}
	publ
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值