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

📄 inputthread.java

📁 java的网络编程
💻 JAVA
字号:
package com.ntc.listen;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.logging.Logger;

class InputThread extends Thread {

	Socket socketConnection;
	ClientMap clientMap;
	String id;
	public InputThread(Socket _socketConnection, ClientMap _clientMap, String _id) {
		this.socketConnection = _socketConnection;
		this.clientMap = _clientMap;
		this.id = _id;
	}

	public void run(){
		Logger logger = Logger.getLogger(InputThread.class.getName());
		
		try {
			OutputStream outputStream = socketConnection.getOutputStream();
			InputStream inputStream = socketConnection.getInputStream();
			while(true){
				byte[] hand_date = new byte[12];
				int ddd = inputStream.read(hand_date, 0, 12);
				//フラグ
				String sign = "0x" + Integer.toHexString(hand_date[0]);
				logger.info("実行-----" + log(sign) + "----操作---------------------------------------");
				//パケット長
				int packLength = getLengthOfDate(hand_date[4], hand_date[5], hand_date[6], hand_date[7]);
				
				logger.info("ID:" + id + " が受信したパケットの長さ:" + packLength);
				
				//配列を定義して全データを取り出す
				byte[] all_date = new byte[packLength+12];
				inputStream.read(all_date, 12, packLength);
				all_date[0] = hand_date[0];
				all_date[1] = hand_date[1];
				all_date[2] = hand_date[2];
				all_date[3] = hand_date[3];
				all_date[4] = hand_date[4];
				all_date[5] = hand_date[5];
				all_date[6] = hand_date[6];
				all_date[7] = hand_date[7];
				all_date[8] = hand_date[8];
				all_date[9] = hand_date[9];
				all_date[10] = hand_date[10];
				all_date[11] = hand_date[11];
				
				if("0x32".equals(sign)){
					//URLを設定 
					int nNewWndflag = getLengthOfDate(all_date[16],all_date[17],all_date[18],all_date[19]);
					if(nNewWndflag == 0){
						//両側からデータパケットを送信する
						outputStream.write(all_date);
					}
					//接続先にデータパケットを送信
					String id2 = clientMap.getConClientMap(id);
					Socket socket2 = clientMap.getClietMap(id2);
					OutputStream outputStream2 = socket2.getOutputStream();
					outputStream2.write(all_date);
					outputStream2.flush();
					
					logger.info("ID:" + id + "がURLを:" + id2 + "に送信\n");
				}else if("0x40".equals(sign)){
					//ユーザ名とパスワードを判断
					byte[] username_byte = new byte[32];
					for(int i=0; i<32; i++){
						if(all_date[i+12]==0){
							break;
						}
						username_byte[i] = all_date[i+12];
					}
					String username = new String(username_byte).trim();   
					byte[] password_byte = new byte[32];
					for(int i=0; i<32; i++){
						password_byte[i] = all_date[i+44];
					}
					String password = new String(password_byte).trim();   
					
					DbOperator dbo = new DbOperator();
					boolean isLogin = dbo.UserLogin(username, password);	
					
					logger.info("ログイン中のユーザ:\n" + "ユーザ名:" + username + "\nパスワード:" + password + "\n");
					//許可又は拒否を示すフラグを設定して送信 
					all_date[0] = 66;
					if(isLogin){
						byte[] id_str = toByteArray(Integer.parseInt(id));
						all_date[76] = id_str[3];
						all_date[77] = id_str[2];
						all_date[78] = id_str[1];
						all_date[79] = id_str[0];
						all_date[all_date.length-4] = 1;
						outputStream.write(all_date);
						clientMap.setClientMap(id, socketConnection);
						logger.info("ログイン成功!ID:" + id + "\n");
					}else{
						all_date[all_date.length-1] = 0;
						outputStream.write(all_date);
						logger.info("ログインは失敗します" + "\n");
					}
				}else if("0x43".equals(sign)){
					//接続要請に応答
					byte[] id_byte = new byte[32];
					for(int i=0; i<32; i++){
						if(all_date[i+44]==0){
							break;
						}
						id_byte[i] = all_date[i+44];
					}
					String id2 = new String(id_byte).trim();
					logger.info("ID:" + id + "がID:" + id2 + "の接続要請に応答\n");
					Socket socket2 = clientMap.getClietMap(id2);
//					if(socket2 != null){
//						
//					}
					OutputStream outputStream2 = socket2.getOutputStream();
					int requestSign = all_date[all_date.length-4];
					if(requestSign == 1){
						//接続許可の応答を受信してから接続する
						clientMap.setConClientMap(id, id2);
						logger.info("ID:" + id + "がID:" + id2 + "からの接続要請を許可。接続中…" + "\n");
					}else{
						logger.info("ID:" + id + "がID:" + id2 + "からの接続を拒否" + "\n");
					}
					byte[] id_str = id.getBytes();
					for(int i=0; i<id_str.length; i++){
						all_date[44+i] = id_str[i];
					}
					
					outputStream2.write(all_date);
					outputStream2.flush();
				}else if("0x39".equals(sign)){
					//他のユーザへ接続するよう要請する
					byte[] id_byte = new byte[32];
					for(int i=0; i<32; i++){
						if(all_date[i+44]==0){
							break;
						}
						id_byte[i] = all_date[i+44];
					}
					String id2 = new String(id_byte).trim();
					logger.info("ID:" + id + "がID:" + id2 + "に接続するように要請する");
					Socket socket2 = clientMap.getClietMap(id2);
					if(!id.equals(id2) && socket2 != null && clientMap.getConClientMap(id2) == null){
						//接続先のIDが存在し、そのユーザが未接続状態で、かつ当方でない場合
						OutputStream outputStream2 = socket2.getOutputStream();
						byte[] id_str = id.getBytes();
						for(int i=0; i<id_str.length; i++){
							all_date[44+i] = id_str[i];
						}
						outputStream2.write(all_date);
						outputStream2.flush();
						logger.info("ID:" + id + "からID:" + id2 + "への接続要請を、サーバが転送する" + "\n");
					}else{
						//接続先のIDが存在しない、又は、すでに接続中の場合、接続失敗の情報を返す
						logger.info("ID:" + id + "からID:" + id2 + "への接続要請が失败しました" + "\n");
						//パケットヘッダ部を修正
						all_date[0] = 67;
						all_date[all_date.length-4] = 0;
						outputStream.write(all_date);
					}
				}else if("0x48".equals(sign)){
					//スクロールバーをスクロールする際に、両側に情報を送信
					//当方に送信
					outputStream.write(all_date);
					//接続先に送信
					String id2 = clientMap.getConClientMap(id);
					Socket socket2 = clientMap.getClietMap(id2);
					OutputStream outputStream2 = socket2.getOutputStream();
					outputStream2.write(all_date);
					outputStream2.flush();
					logger.info("スクロールバーがスクロールされた \n");
				}else if("0x41".equals(sign)){
					//接続中のユーザに切断要請を出す
					//メッセージを送信して接続先に通知
					logger.info("ID:" + id + "から切断を要請");
					String id2 = clientMap.getConClientMap(id);
					if(id2 != null){
						Socket socket2 = clientMap.getClietMap(id2);
						OutputStream outputStream2 = socket2.getOutputStream();
						outputStream2.write(all_date);
						outputStream2.flush();
						//ペアとなっているユーザの接続関係を削除
						clientMap.removeConClient(id);
					}
				}else if("0x".equals(sign)){
					String id2 = clientMap.getConClientMap(id);
					Socket socket2 = clientMap.getClietMap(id2);
					OutputStream outputStream2 = socket2.getOutputStream();
					outputStream2.write(all_date);
					outputStream2.flush();
				}else if("0x44".equals(sign)){
					//ログオフの際に接続を切断してユーザリストから削除
					if(clientMap.getConClientMap(id) != null){
						//接続中の情報を削除
						String id2 = clientMap.getConClientMap(id);
						Socket socket2 = clientMap.getClietMap(id2);
						OutputStream outputStream2 = socket2.getOutputStream();
						all_date[0] = 65;
						outputStream2.write(all_date);
						outputStream2.flush();
						clientMap.removeConClient(id);
					}
					clientMap.removeClient(id);
					logger.info("ID:" + id + "が終了した");
					break;
				}else if("0x0".equals(sign)){
					//強制的に異常終了の可能性がある
					logger.info("ID:" + id + "が終了した");
					if(clientMap.getConClientMap(id) != null){
						//接続中であれば、接続先にパケットを送信
						String id2 = clientMap.getConClientMap(id);
						Socket socket2 = clientMap.getClietMap(id2);
						OutputStream outputStream2 = socket2.getOutputStream();
						all_date[0] = 65;
						outputStream2.write(all_date);
						outputStream2.flush();
						//接続中の情報を削除
						clientMap.removeConClient(id);
						logger.info("異常終了で接続が切断されたことをID:" + id + "がID:" + id2 + "に通知");
					}
					break;
				}else{
					//情報をそのまま転送
					String id2 = clientMap.getConClientMap(id);
					Socket socket2 = clientMap.getClietMap(id2);
					if(socket2 != null){
						OutputStream outputStream2 = socket2.getOutputStream();
						outputStream2.write(all_date);
						outputStream2.flush();
						logger.info("ID:" + id + "からパケットをそのままID:" + id2 + "に送信\n");
					}
				}
				outputStream.flush();
			}
		}catch(IOException e1) {
			e1.printStackTrace();
			logger.info("ID:" + id + "が異常終了した");
		}finally{
			clientMap.removeClient(id);
			if(clientMap.getConClientMap(id) != null){
				//接続中であれば、接続先にパケットを送信
				String id2 = clientMap.getConClientMap(id);
				Socket socket2 = clientMap.getClietMap(id2);
				try{
					OutputStream outputStream2 = socket2.getOutputStream();
					byte[] cut = new byte[12];
					cut[0] = 65;
					outputStream2.write(cut);
					outputStream2.flush();
					//接続中の情報を削除
					clientMap.removeConClient(id);
					logger.info("異常終了で接続が切断されたことをID:" + id + "がID:" + id2 + "に通知");
				}catch(IOException ee){
					ee.printStackTrace();
				}
			}
		}
	}
	/**
	 * byte配列からint配列に変換
	 * @param byte1
	 * @param byte2
	 * @param byte3
	 * @param byte4
	 * @return
	 */
	private int getLengthOfDate(byte byte4, byte byte5, byte byte6, byte byte7){
		//パケット長を格納している4バイトデータを取得
		byte[] b=new byte[]{byte7, byte6, byte5, byte4}; 
        int mask=0xff;
        int temp=0;
        int len=0;
        for(int i=0;i<4;i++){
        	len<<=8;
        	temp=b[i]&mask;
        	len|=temp;
        }
        return len;
	}
	/**
	 * int型をByte配列に変換
	 * @param number
	 * @return
	 */
	private  byte[] toByteArray(int number){
		byte[] b=new byte[4];
		for(int i=0;i<4;i++){
			b[i]=(byte)(number>>>(24-i*8));
	    }
		return b;
	}
	/**
	 * データパケットの種類を取得
	 * @param sign
	 * @return
	 */
	private  String log(String sign){
		String logStr = null;
		if("0x30".equals(sign)){
			logStr = "PACKET_NULL";
		}else if("0X50".equals(sign)){
			logStr = "PACKET_ERROR";
		}else if("0x31".equals(sign)){
			logStr = "PACKET_REGISTER_WIN";
		}else if("0x32".equals(sign)){
			logStr = "PACKET_SET_URL";
		}else if("0x33".equals(sign)){
			logStr = "PACKET_UPDATE_HTML";
		}else if("0x34".equals(sign)){
			logStr = "PACKET_MOUSE_MSG";
		}else if("0x35".equals(sign)){
			logStr = "PACKET_UNREGISTER_WIN";
		}else if("0x36".equals(sign)){
			logStr = "PACKET_WINDOW_SIZE";
		}else if("0x37".equals(sign)){
			logStr = "PACKET_WINDOW_MOVE";
		}else if("0x40".equals(sign)){
			logStr = "PACKET_LOGIN";
		}else if("0x42".equals(sign)){
			logStr = "PACKET_LOGIN_RESPONSE";
		}else if("0x39".equals(sign)){
			logStr = "PACKET_CONNPEER";
		}else if("0x43".equals(sign)){
			logStr = "PACKET_CONNPEER_RESPONSE";
		}else if("0x41".equals(sign)){
			logStr = "PACKET_REQUEST_DISCONNECT";
		}else if("0x44".equals(sign)){
			logStr = "PACKET_QUIT";
		}else if("0x47".equals(sign)){
			logStr = "PACKET_SET_ACTIVE";
		}else if("0X45".equals(sign)){
			logStr = "PACKET_GET_ACCESS";
		}else if("0X46".equals(sign)){
			logStr = "PACKET_GET_ACCESS_RESPONSE";
		}else if("0x48".equals(sign)){
			logStr = "PACKET_SCROLL_POS";
		}else if("0x49".equals(sign)){
			logStr = "PACKET_PROGRESS";
		}
		return logStr;
	}
}

⌨️ 快捷键说明

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