2012-08-06 4 views
2

소켓 연결을 프로그래밍하고 있습니다. 서버 및 클라이언트. 서버가 연결을 대기합니다. socket.accept(); 그러면 모든 들어오는 메시지를 처리 ​​할 수 ​​있습니다.소켓 연결 - 메시지 순서?

지금까지는 그렇게 좋았지 만 어떻게 이러한 메시지를 제어 할 수 있습니까? 현재로서는 서버가 특정 메시지를 예상하고 클라이언트가이 메시지를 보내야한다는 것을 알 수 있습니다. 메시지는 String 일 수 있습니다. 그러나 클라이언트가 다른 메시지 (예 : Integer)를 보내는 경우에는 어떻게해야합니까? 어떻게하면 서버가 다른 메시지를 기대할 수 있습니까? 그리고 매개 변수 유형과 매개 변수 개수에 따라 실행할 메소드를 결정하십시오.

또는 클라이언트와 서버간에 잘 알려진 순서로 메시지를 교환하기위한 소켓입니까?

특별히 sth가 서버 측에서 예 : processIntegergetString()을 제공하고 싶습니다. 그리고 클라이언트에서 메시지를 보내면이 메시지를 기반으로 다른 방법이나 하나를 실행하려고합니다. 메시지를 보내는 방법을 클라이언트가 어떻게 든 제어 할 수 있습니까?

+0

전달 된 개체가 인스턴스인지 확인할 수 있습니다. – Vulcan

+0

http://docs.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html에 대해 이야기하고 있습니까? – mfrankli

+0

예이 소켓을 사용합니다. OK의 인스턴스가 시도해 볼만한 가치가 있을지 모릅니다. 하지만 여전히 메시지 순서를 제어 할 수는 없습니다. – membersound

답변

0

원하는 종류의 메시지를 전송할 때 소켓 연결이 사용됩니다. 메시지의 "원시"바이트가이를 통해 전송됩니다. 메시지의 형식 (문자 데이터 - 문자열, 정수 또는 다른 유형의 객체, 이진 데이터 등)을 정의하는 것은 소켓에 달려 있지 않습니다. 그것은 당신에게 달려 있습니다. 또한 메시지 (요청 및 응답)의 순서는 사용자가 정의합니다. 함께, 메시지 형식, 순서 및 기타 동작을 전송 및/또는 메시지 "프로토콜"이라고합니다.

정의하고 자신의 프로토콜을 구현하거나, 등 등 HTTP, RMI, XML, JSON,

행운 같은 기존 프로토콜 또는 프로토콜의 조합을 사용할 수 있습니다! Tom

0

유닉스 스타일의 소켓 (Java 용)은 구조화 된 ("유형화 된") 데이터의 Abstraction을 제공하지 않습니다. 대신에 임의의 바이트 스트림을 나타냅니다. 이 구조를 제공하는 유일한 방법은 클라이언트와 서버가 통신 방법 (프로토콜)에 동의하는 경우입니다. 이 문서에서 알 수 있듯이 실제로 Socket에서 데이터를 가져 오는 유일한 방법은 getInputStream()을 사용하여 read()를 수행하여 byte 또는 byte[] 중 하나를 제공하는 것입니다. Double 등을위한 'DBL'클라이언트가 String를 보내려고하면

예를 들어, 아마도 메시지의 처음 세 바이트로 'STR'을 둘 것, 그리고 그것이 Integer을 있다면 그건 'INT', 또는 에. 서버가 처음 3 바이트가 데이터 유형을 나타냄을 알고 있으면 나머지 메시지를 읽는 방법을 알아 내기 위해이를 사용할 수 있습니다. 이것은 기본적으로 모든 네트워킹 - 클라이언트와 서버가 동일한 '언어'를 사용하는 기초입니다.

0

Java 튜토리얼 페이지는 매우 쉽게 설명합니다 : Java Tutorials: Sockets.

직렬화 가능 객체를 보내고 서버로 직렬화 해제 할 수 있습니다. 물론 직렬화 가능 클래스는 클라이언트와 서버 모두에서 정의되어야합니다.

ObjectInputStream 및 ObjectOutputStream을 사용하여 해당 객체를 읽고 쓸 수 있습니다.