안녕하십니까, 저는 간단한 멀티 스레드 서버/클라이언트 응용 프로그램에 매우 이상한 문제가 있습니다. 현재 클라이언트 1과 서버 1이 실행중인 두 개의 실행 호스트와 C2와 S2가 실행중인 호스트가 있습니다. C1은 S2에 메시지를 보내고 S2는 C2와 메시지를 공유합니다. 그런 다음 어떤 데이터 (문자열)가 전송되었는지에 따라 다른 작업을 수행합니다.compareTo()가 클라이언트/서버 응용 프로그램에서 충돌하는 결과를 제공합니까?
그러나 일부 비교 결과 은 (는) 개의 결과를 제공합니다.
if(own_msg.compareTo("Let's play!") == 0 || own_msg.compareTo("Bye!") == 0)
{
break;
}
호스트 클라이언트 자체가 참으로 해당 옵션을 선택 할 때마다이 작동 예를 들어 (own_msg
chat_msg
가 다른 클라이언트로부터 서버를 통해받는 사람을 의미, 호스트 클라이언트 자체가 전송하는 문자열을 말한다) .
그러나,이되지 않습니다
if(!(chat_msg.compareTo("Bye!") == 0 || chat_msg.compareTo("Let's play!") == 0))
이것은, 어떤 이유로, 항상 true. chat_msg의 내용을 화면 (서버 및 클라이언트에서 chat_msg
을 수신함)로 인쇄하고 특정을 알고도 그 명령문의 결과는 false 여야합니다. 예를 들어, chat_msg = "Let's play!"
은이 앞의 if 문으로 들어갑니다.
세계 어디에서나 무엇이 일어나고 있습니까? 현재 다른 포트 쌍을 사용하여이 응용 프로그램을 localhost에서 테스트 중이므로 잘못된 형식의 패킷이 없어야합니다 (심지어 동일한 문자열이 반환되지 않을 수도 있습니다). 어떤 도움이라도 대단히 감사하겠습니다.
편집 : 일부 사람들이 내 의도를 오해하고있는 것을 봅니다. @RanEldan이 아래 답변에 대한 설명으로 언급 한대로 chat_msg
이 "안녕"과 다른 경우 if 문으로 이동하려고합니다. 또는 "놀자!".
if(chat_msg.compareTo("Bye!") == 0 || chat_msg.compareTo("Let's play!") == 0)
이 결코에 문을 원인 : 즉의 경우 비 반전 입력 할
하는 것으로. 그러므로 나는 비가 시적인 성격이 있어야한다고 @ dasblinkenlight가 믿고 싶어한다. 그러나 서버 문자열이 공유 변수에 직접 전달되기 때문에 어떻게 알 수 있는지 확신 할 수 없습니다.
equals()는 똑같은 효과가 있으며 NetBeans 디버거는 추가 공백없이 문자열 (예 : "Let's play!"
)을 나열합니다.
편집 2 :
SajalDutta의 제안 @ 참으로 옳았다! UDP를 바이트 배열과 함께 사용하고 있기 때문에 문자열의 '길이'가 1024로 고정되어있는 것으로 보입니다.
최종 편집는 :
내가이 데이터 그램의 문자열을 얻을 수있는 잘못된 문자열 생성자를 사용하고 있었던 것으로 보인다.String sentence = new String(receivePacket.getData(), 0, receivePacket.getLength());
@SajalDutta 대신 String sentence = new String(receivePacket.getData());
을 사용하고 있었으므로 위에서 설명한 답변을 게시하려면 정답으로 안내 했으므로 동의합니다. 그렇지 않다면 나는 시간이 지났을 때 가장 가까운 것을 받아 들일 것이다.
서버 문자열의 어딘가에 보이지 않는 문자가 있어야합니다. – dasblinkenlight
당신의 진술은 chat_msg의 값이 Bye가 아닐 때에 만 참일 것입니다! 그리고 놀자 ~! 또한 chat_msg 값의 대소 문자를주의하십시오. –
왜 compareTo를 사용하여 같음을 확인합니까? 왜 안돼? –