포트에 앉아 클라이언트 연결을 수신하는 응용 프로그램 (서버 측)이 있습니다. 연결되면 앱은 해당 연결을 처리하는 파서 (다른 스레드)를 실행합니다.자바 스레드가 데이터를 공유하지 못하게 하시겠습니까?
내 문제는 다른 부분이 처리되는 동안 서버 응용 프로그램이 새 스레드를 시작한다는 점입니다. 이것은 바람직한 행동으로, 문제 자체가 아닙니다. 새로운 스레드가 이전 스레드에서 일부 상태 변수를 읽으므로 잘못 작동하는 것입니다.
느슨하게 파서가하는 것은 다음과 같습니다. 클라이언트는 항상 두 개의 패킷을 보냅니다. 첫 번째는 기본적으로 노크 노크 패킷이고 두 번째는 실제 데이터 패킷입니다. 나는 첫 번째를 읽고, 내가 그것을 받아들이기로 결정하면, 다음 패킷을 읽을 수 있도록 변수에 넣는다.
am 시나리오에서 첫 번째 스레드는 노크 노크 패킷을 읽고이를 확인합니다. 다음 패킷이 (동일한 스레드에서) 도착하고 구문 분석이 시작됩니다.
한편, 다른 파서가 만들어지고 첫 번째 패킷을 기다립니다. 그런 다음 (이 문제는) 유효성 검사 변수 (이 스레드에 대해 false 여야 함)를 확인하고 ok (여전히 실행중인 이전 스레드에서 읽음)를 찾은 후 노크 패킷을 마치 데이터 패킷처럼 노크하십시오.
lokoing for은 데이터 공유를 완전히 제거하는 방법입니다. 세션 상태를 추적하기 위해 다음 클래스를 사용하고 있습니다 :
public class SessionInfo {
private Constants.PacketValidity validity;
private int packetSize;
private String IMEI;
private int packetReportedSize;
private Constants.PacketType packetType;
private int codec;
private int records;
private boolean valid;
private Constants.ResponseType responseType;
private String clientIP;
private int serverPort;
private Date parseInit;
private Date parseEnd;
}
이 클래스는 setter와 getter를 많이 가지고 있습니다.
파서는이 개체의 인스턴스를 개인 필드로 사용합니다.
어떻게하면 좋을까요?
스레드를 만들고 변수를 확인하는 코드를 보여주십시오. – DaveJohnston
두 패킷 쌍이 동일한 세션에 있어야합니까? 같은 세션에있는 경우 대화와 같은 것을 만들어야합니다. 즉 SessionInfo는 ConversationInfo와 유사하며 여러 인스턴스가 있어야합니다. – tkr