2017-11-02 2 views
0

:처리 : 서버에서 한 번에 여러 개의 메시지를 개별적으로 읽도록 클라이언트를 설정하려면 어떻게해야합니까? 내가 처리에 대한 기본적인 네트워크 시스템을 설정하는 작업입니다

import processing.net.*; 
Server myServer; 
Client myClient; 

는 그러나, 나는 설정 내 서버와 클라이언트 측의 통신에 문제가 있어요. 내 클라이언트는 들어오는 모든 메시지를 문자열로 해석합니다. 문제는 같은 프레임의 여러 메시지가 서버에서 전송 될 때마다 내 프로그램에서 해석 할 수없는 단일 문자열에 추가된다는 것입니다. 테스트를 마친 후, 단일 클라이언트에서 서버로 여러 메시지를 보내는 데 동일한 처리가 수행되는 것으로 나타났습니다.

내 클라이언트 독자는 다음과 같습니다 문제가 판독기 (문자열 결합), 또는 사실에 내가 사용하는 것이 쓰기에있는 경우

지금 현재로
while (myClient.available() > 0) { 
    String dataIn = myClient.readString(); 

, 나는 모른다()을 여러 번 한 번씩 (그리고 데이터를 단일 문자열로 보내고).

메시지가 어떻게 든 개별적으로 보내고받을 수 있는지 궁금합니다. 그렇지 않은 경우 메시지가 이미 전송 된 경우 (클라이언트와 서버 측 모두에서 작동 함) 테스트 할 수있는 방법이 있습니다. 전송할 메시지를 추적하는 대기열을 설정하십시오.

답변

0

글쎄, 나는 그 일을 도울 수있는 어떤 기능도 보지 못했기 때문에 메시지가 이미 보내 졌는지 확인하지 않기로 결정했다. 대신, 내가 나서서 메시지를 전송하는 큐 역할을 serverQ라는 서버에 대한 문자열의 ArrayList를 만들어 :

ArrayList <String> serverQ = new ArrayList<String>(); 

가 나는 또한으로 모든 입력 문자열을 배치 할 함수 writeSQ (String)를 추가 큐 :

void writeSQ(String s) { 
    serverQ.add(s); 
} 

그런 다음 myServer.write (String)의 모든 사용을 writeSQ (String s)로 바꾸는 작업을 계속했습니다. 내 ServerUpdate 함수의 끝에서, 나는 모든 클라이언트에 다음 문자열을 전송, 큐를 비울 것 섹션을 추가, 한 번에 하나의 프레임은 :

// send data 
    if (serverQ.size() > 0) { 
     myServer.write(serverQ.get(0)); 
     serverQ.remove(0); 
    } 
    } 

그러나, 어떤 이유로, 메시지는 계속 악화되었다, 그래서 나는 보낸 메시지 (각 프레임)의 친밀 성 (빈도) 때문일 것이라고 추측했다. 그래서 나는 다른 모든 프레임으로 보내지는 메시지를 대체하기 위해 boolean serverSent를 설정했다. 새 코드는 다음과 같습니다.

// send data 
    if (serverQ.size() > 0) { 
    if (!serverSent) { 
     myServer.write(serverQ.get(0)); 
     serverQ.remove(0); 
     serverSent = true; 
    } else 
     serverSent = false; 
    } 

이것은 완벽하게 작동했으며 메시지는 클라이언트에 의해 개별적으로 해석되었습니다. 필자는 정확한 지원 코드를 클라이언트에 추가했으며 (필요한 경우 서버에서 클라이언트로 모든 것을 변경 함) 많은 양의 테스트를 거친 후에이 새로운 지원이 제대로 작동하는지 확인할 수 있습니다.

관련 문제