📄 inputthread.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 + -