首页>代码>java swing聊天室代码>/jq/src/client/ClientThread.java
/**
 * ClassName: ClientThread.java
 * Author: qiujy
 * CreateTime: 2009-4-22
 * EMAIL: qjyong@gmail.com
 * Copyright 2009 ++YONG All rights reserved.
 */
package client;

import java.io.*;
import java.net.*;
import javax.swing.*;
import client.ui.ChatFrame;
import client.util.*;
import common.model.entity.*;
import common.util.*;

/** 客户端线程,不断监听服务器发送过来的信息 */
public class ClientThread extends Thread {
	private JFrame currentFrame;  //当前窗体
	
	public ClientThread(JFrame frame){
		currentFrame = frame;
	}
	
	public void run() {
		try {
			while (DataBuffer.clientSeocket.isConnected()) {
				Response response = (Response) DataBuffer.ois.readObject();
				ResponseType type = response.getType();
				
				System.out.println("获取了响应内容:" + type);
				if (type == ResponseType.LOGIN) {
					User newUser = (User)response.getData("loginUser");
					DataBuffer.onlineUserListModel.addElement(newUser);
					
					ChatFrame.onlineCountLbl.setText(
							"在线用户列表("+ DataBuffer.onlineUserListModel.getSize() +")");
					ClientUtil.appendTxt2MsgListArea("【系统消息】用户"+newUser.getNickname() + "上线了!\n"); 
				}else if(type == ResponseType.LOGOUT){
					User newUser = (User)response.getData("logoutUser");
					DataBuffer.onlineUserListModel.removeElement(newUser);
					
					ChatFrame.onlineCountLbl.setText(
							"在线用户列表("+ DataBuffer.onlineUserListModel.getSize() +")");
					ClientUtil.appendTxt2MsgListArea("【系统消息】用户"+newUser.getNickname() + "下线了!\n");

				}else if(type == ResponseType.CHAT){ //聊天
					Message msg = (Message)response.getData("txtMsg");
					ClientUtil.appendTxt2MsgListArea(msg.getMessage());
				}else if(type == ResponseType.SHAKE){ //振动
					Message msg = (Message)response.getData("ShakeMsg");
					ClientUtil.appendTxt2MsgListArea(msg.getMessage());
					new JFrameShaker(this.currentFrame).startShake();
				}else if(type == ResponseType.TOSENDFILE){ //准备发送文件
					toSendFile(response);
				}else if(type == ResponseType.AGREERECEIVEFILE){ //对方同意接收文件
					sendFile(response);
				}else if(type == ResponseType.REFUSERECEIVEFILE){ //对方拒绝接收文件
					ClientUtil.appendTxt2MsgListArea("【文件消息】对方拒绝接收,文件发送失败!\n");
				}else if(type == ResponseType.RECEIVEFILE){ //开始接收文件
					receiveFile(response);
				}
			}
		} catch (IOException e) {
			//e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} 
	}

	/** 发送文件 */
	private void sendFile(Response response) {
		final FileInfo sendFile = (FileInfo)response.getData("sendFile");
		
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		Socket socket = null;
		try {
			socket = new Socket(sendFile.getDestIp(),sendFile.getDestPort());//套接字连接
			bis = new BufferedInputStream(new FileInputStream(sendFile.getSrcName()));//文件读入
			bos = new BufferedOutputStream(socket.getOutputStream());//文件写出
			
			byte[] buffer = new byte[1024];
			int n = -1;
			while ((n = bis.read(buffer)) != -1){
				bos.write(buffer, 0, n);
			}
			bos.flush();
			synchronized (this) {
				ClientUtil.appendTxt2MsgListArea("【文件消息】文件发送完毕!\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			IOUtil.close(bis,bos);
			SocketUtil.close(socket);
		}
	}
	
	/** 接收文件 */
	private void receiveFile(Response response) {
		final FileInfo sendFile = (FileInfo)response.getData("sendFile");
		
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		ServerSocket serverSocket = null;
		Socket socket = null;
		try {
			serverSocket = new ServerSocket(sendFile.getDestPort());
			socket = serverSocket.accept(); //接收
			bis = new BufferedInputStream(socket.getInputStream());//缓冲读
			bos = new BufferedOutputStream(new FileOutputStream(sendFile.getDestName()));//缓冲写出
			
			byte[] buffer = new byte[1024];
			int n = -1;
			while ((n = bis.read(buffer)) != -1){
				bos.write(buffer, 0, n);
			}
			bos.flush();
			synchronized (this) {
				ClientUtil.appendTxt2MsgListArea("【文件消息】文件接收完毕!存放在["
						+ sendFile.getDestName()+"]\n");
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			IOUtil.close(bis,bos);
			SocketUtil.close(socket);
			SocketUtil.close(serverSocket);
		}
	}

	/** 准备发送文件	 */
	private void toSendFile(Response response) {
		FileInfo sendFile = (FileInfo)response.getData("sendFile");
		
		String fromName = sendFile.getFromUser().getNickname() 
				+ "(" + sendFile.getFromUser().getId() + ")";
		String fileName = sendFile.getSrcName()
			.substring(sendFile.getSrcName().lastIndexOf(File.separator)+1);
		
		int select = JOptionPane.showConfirmDialog(this.currentFrame, 
				fromName + " 向您发送文件 [" + fileName+ "]!\n同意接收吗?",
				"接收文件", JOptionPane.YES_NO_OPTION);
		try {
			Request request = new Request();
			request.setAttribute("sendFile", sendFile);
			
			if (select == JOptionPane.YES_OPTION) {
				JFileChooser jfc = new JFileChooser();
				jfc.setSelectedFile(new File(fileName));
				int result = jfc.showSaveDialog(this.currentFrame);
				
				if (result == JFileChooser.APPROVE_OPTION){
					//设置目的地文件名
					sendFile.setDestName(jfc.getSelectedFile().getCanonicalPath());
					//设置目标地的IP和接收文件的端口
					sendFile.setDestIp(DataBuffer.ip);
					sendFile.setDestPort(DataBuffer.RECEIVE_FILE_PORT);
					
					request.setAction("agreeReceiveFile");
					ClientUtil.appendTxt2MsgListArea("【文件消息】您已同意接收来自 "
							+ fromName +" 的文件,正在接收文件 ...\n");
				} else {
					request.setAction("refuseReceiveFile");
					ClientUtil.appendTxt2MsgListArea("【文件消息】您已拒绝接收来自 "
							+ fromName +" 的文件!\n");
				}	
			} else {
				request.setAction("refuseReceiveFile");
				ClientUtil.appendTxt2MsgListArea("【文件消息】您已拒绝接收来自 "
						+ fromName +" 的文件!\n");
			}
			
			ClientUtil.sendTextRequest2(request);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
最近下载更多
WenMeng  LV9 2024年12月30日
13133117021  LV5 2024年12月24日
矿泉水  LV30 2024年10月8日
你们的代码都是我的了  LV16 2024年4月29日
等风来2020  LV3 2023年12月10日
buhuia  LV4 2023年6月9日
yangguang  LV8 2022年12月28日
dongandmin  LV8 2022年12月10日
caohanren  LV11 2022年12月9日
daidin  LV11 2022年7月20日
最近浏览更多
gfbuhbaduiei 1月9日
暂无贡献等级
WenMeng  LV9 2024年12月30日
13133117021  LV5 2024年12月24日
MQ-EQW 2024年12月20日
暂无贡献等级
葫芦马戏  LV1 2024年12月11日
Sotouch  LV15 2024年12月9日
Wq1008611 2024年11月28日
暂无贡献等级
3263394665  LV9 2024年8月31日
interface  LV22 2024年8月10日
windy079 2024年7月1日
暂无贡献等级
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友