virtual thread is good

This commit is contained in:
NetRiceCake
2025-12-08 02:18:55 +09:00
parent 4bf3959c33
commit 56c7730ecf
6 changed files with 25 additions and 19 deletions

View File

@@ -6,8 +6,6 @@
<U>**device uuid 무조건 바꾸시오.**</U>
자바21에 추가된 virtual thread 사용하도록 바꾸는중...
## Example
![ex](./ex.png)
@@ -80,6 +78,8 @@ jar 파일은 build/libs 디렉터리 안에 생성됩니다.
## Usage
자바21 이상 필요합니다.
첫 로그인시에 기기등록이 필요합니다. 콘솔창에 방법 나오니 따라하세요.
로그인하면 로그인 정보(토큰 등)가 email_deviceName 폴더 안에 저장됩니다. 서버 연결이 안되면 삭제하고 시도하세요.

View File

@@ -4,6 +4,8 @@ plugins {
group = 'com.github.netricecake'
version = '1.0-SNAPSHOT'
sourceCompatibility = '21'
targetCompatibility = '21'
jar {
manifest {

View File

@@ -16,12 +16,10 @@ import com.github.netricecake.loco.packet.outbound.room.InfoLinkOut;
import com.github.netricecake.loco.packet.outbound.message.MessageOut;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import lombok.Getter;
public class LocoSocketHandlerImpl extends LocoSocketHandler {
@Getter
private TalkClient client;
private final TalkClient client;
public LocoSocketHandlerImpl(TalkClient client) {
this.client = client;
@@ -41,7 +39,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler {
Member member = room.getMembers().get(in.getAuthorId());
Message msg = new Message(in.getLogId(), room, member, in.getType(), in.getMessage(), in.getAttachment());
Thread.ofVirtual().start(() -> {
client.getTalkHandler().onMessage(msg);
});
} else if (packet.getMethod().equals("NEWMEM")) {
NewMemIn in = new NewMemIn();
in.fromBson(packet.getBody());
@@ -50,7 +50,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler {
ChatRoom room = client.getChatRooms().get(in.getChatId());
if (!room.getType().equals("OM")) return;
Thread.ofVirtual().start(() -> {
client.getTalkHandler().onNewMember(room, room.getMembers().get(in.getUserId()));
});
} else if (packet.getMethod().equals("DELMEM")) {
DelMemIn in = new DelMemIn();
in.fromBson(packet.getBody());
@@ -58,7 +60,9 @@ public class LocoSocketHandlerImpl extends LocoSocketHandler {
ChatRoom room = client.getChatRooms().get(in.getChatId());
if (!room.getType().equals("OM")) return;
Thread.ofVirtual().start(() -> {
client.getTalkHandler().onDelMember(room, new Member(in.getUserId(), in.getNickname(), 2));
});
room.getMembers().remove(in.getUserId());
} else if (packet.getMethod().equals("SYNCLINKPF")) {
SyncLinkPfIn si = new SyncLinkPfIn();

View File

@@ -36,14 +36,14 @@ import java.util.concurrent.Executors;
public class TalkClient {
private String email;
private String password;
private String deviceName;
private String deviceUuid;
private String sessionDir;
private final String email;
private final String password;
private final String deviceName;
private final String deviceUuid;
private final String sessionDir;
@Getter
private Map<Long, ChatRoom> chatRooms = new HashMap<>();
private final Map<Long, ChatRoom> chatRooms = new HashMap<>();
@Getter
protected boolean connected;

View File

@@ -9,7 +9,7 @@ import java.util.List;
public class SecureLayerCodec extends MessageToMessageCodec<byte[], byte[]> {
private CryptoManager cryptoManager;
private final CryptoManager cryptoManager;
private int currentLength = -1;
private byte[] buffer = new byte[0];
@@ -20,6 +20,7 @@ public class SecureLayerCodec extends MessageToMessageCodec<byte[], byte[]> {
@Override
protected void encode(ChannelHandlerContext channelHandlerContext, byte[] bytes, List<Object> list) throws Exception {
// TODO 길이 길면 짤라서 암호화해서 보내야됨
byte[] encryptedBody = cryptoManager.encryptMessage(bytes);
byte[] packet = ByteUtil.concatBytes(ByteUtil.intToByteArrayLE(encryptedBody.length), encryptedBody);
list.add(packet);

View File

@@ -55,10 +55,9 @@ public class CryptoManager {
byte[] length = ByteUtil.intToByteArrayLE(HANDSHAKE_BODY_SIZE);
return ByteUtil.concatBytes(length, ByteUtil.intToByteArrayLE(RSA_LOCO_HEADER), ByteUtil.intToByteArrayLE(AES_LOCO_HEADER), encryptedKey);
} catch (Exception e) {}
return new byte[0];
return null;
}
// 바디 사이즈가 131067가 최대인거 같은데 잘 모르겠음
public byte[] encryptMessage(byte[] message) {
try {
byte[] nonce = new byte[AES_NONCE_SIZE];
@@ -67,7 +66,7 @@ public class CryptoManager {
cipher.init(Cipher.ENCRYPT_MODE, aesKey, new GCMParameterSpec(AES_KEY_SIZE, nonce));
return ByteUtil.concatBytes(nonce, cipher.doFinal(message));
} catch (Exception e) {}
return new byte[0];
return null;
}
public byte[] decryptMessage(byte[] message) {
@@ -77,7 +76,7 @@ public class CryptoManager {
cipher.init(Cipher.DECRYPT_MODE, aesKey, new GCMParameterSpec(AES_KEY_SIZE, nonce));
return cipher.doFinal(ByteUtil.sliceBytes(message, AES_NONCE_SIZE, message.length - nonce.length));
} catch (Exception e) {}
return new byte[0];
return null;
}
}