문제

나는 간단한 IM 시스템 (가장 단순한 Windows Messenger와 거의 비슷함)에 대한 네트워크 프로그래밍 할당을 작업하고 있습니다.

사양은 단일 데이터 그램 패킷으로 4 개의 데이터 필드를 보내야한다고 지정합니다.

To From Type Message
where type refers to message type, implemented as a user defined enum class.

이 모든 데이터를 단일 패킷으로 포장하는 방법을 배우고 싶습니다.

업데이트 : 지금까지의 도움을위한 thx이지만, 패킷을 개별적으로 패치하는 일반적인 방법에서 문자열 문장과 문자열이 있다고 말합니다.

byte[] sendData = new byte [256]
sendData = sentence.getBytes();

그러나 문자열 문자열과 함께 "From"String에서 SendData로 정확히 추가 할 수 있습니까?

도움이 되었습니까?

해결책

간단히 말해서해야 할 일은 다음과 같습니다.

  1. 4 개의 필드가 포함 된 개체 (클래스)를 만듭니다 (/~/enum/message)
  2. 이것을 시리얼링하십시오. 구현해야합니다 직렬화 가능. 직렬화 방법은 여기에서 다른 솔루션을 참조하십시오
  3. 바이트 어레이로 변환하고 소켓을 보내십시오 (자세한 내용은 다른 곳 참조)

다른 쪽 끝에서는이 바이트를 읽고, 사라지고, 1에 정의 된 클래스의 인스턴스로 캐스팅 할 것입니다.

4 개의 필드가 포함 된 하나의 객체를 만들고이 객체를 직렬화함으로써 4 개의 필드를 모두 함께 보낼 수 있습니다 (이것이 걸림돌이라는 인상을 얻을 수 있습니까?).

데이터 그램은 네트워크 전송 계층에 의해 부과되는 크기 제한을 가지지만이 응용 프로그램의 경우 문제가되지 않는다고 생각합니다.

다른 팁

이와 같은 것을 사용하여 직렬화 가능한 객체를 보낼 수 있습니다.

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(buffer);
out.writeObject(objectYouWantToSend);
out.close();
buffer.close();
DatagramPacket packet = new 
    DatagramPacket(buffer.toByteArray(), 
                   buffer.size(), 
                   InetAddress.getByName(...),
                   portNumber);
socket.send(packet);

네트워크 인터페이스에 전달하기 전에 간단히 추가합니다. 라인을 따라 무언가 :

byte[] buff = new byte[256];
// Add al your fields here to buff.
DatagramPacket packet = new DatagramPacket(buff, buff.length, address, 1234);
socket.send(packet);

그들이 모든 문자열이 아니라면, 당신은 그것들을 인코딩해야합니다.

데이터를 인코딩하기위한 많은 옵션이 있으며,이 모든 것은 4 개의 필드를 하나의 데이터 구조에 넣은 다음 한 번에 그 모든 것을 보냅니다.

중요한 부분은 인코딩이 4 개의 필드 중 어느 것이 패킷의 지점에 있는지 보여줄 필요가 있다는 것입니다. 그렇지 않으면 맨 끝이 신뢰할 수 없을 정도로 해독 할 수 없다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top