2014-10-22 3 views
1

현재 서버와 클라이언트로 수행하고있는 작업은 바이트 간 간단한 문자열을 사용하여 명령을 전송합니다.TCP 소켓을 통해 명령을 보내는 가장 좋은 방법은 무엇입니까?

byte[] outStream = System.Text.Encoding.UTF8.GetBytes("$msg:Test Message"); 
serverStream.Write(outStream, 0, outStream.Length); 

그리고 잡 끝은 다시 문자열 인코딩 : 그것은 무엇에 내려 오는 것은이 (예를 들어 서버에 메시지를 보낼 수) 기본적으로. 다음을 수행하여 명령을 인식합니다.

recievedstring.Split(':')[0] 

recievedstring.Split(':')[1]을 인수로 가정합니다. 사용자가 메시지에 콜론을 입력하면 해당 메시지가 차단됩니다. 두 종점간에 데이터를 전송하는 해킹 방법이라고 생각합니다. 이 작업을 수행하는보다 표준적인 방법이 있습니까? 죄송합니다. 충분한 정보를 제공하지 못했을 때, 저는이 문제에 익숙하지 않았습니다!

답변

3

문자열로 전달 된 모든 데이터를 처리해야 할 필요는 없습니다. 데이터를 바이트로 통신하고 나중에 바이트를 모든 데이터 형식 (보낸 사람이 보낸 것처럼)으로 변환 할 수 있습니다.

더 나은 방법은 각 msg에 대해 서버와 클라이언트 사이에 프로토콜 (예 : 패킷 형식)을 정의하는 것입니다. 예를 들어, 처음 4 바이트가 메시지의 길이와 지정된 길이의 메시지를 포함하도록 패킷을 정의 할 수 있습니다. 패킷 형식은 [길이 : 데이터]가됩니다.

송신 측에서는 먼저 스트림에서 메시지의 길이를 쓰고 실제 데이터를 작성해야합니다. 수신 측에서는 처음에 int 데이터)를 수신 한 다음 그 많은 바이트를 수신합니다.

더 자세히 말하면, 엔드 포인트 사이에서 통신 할 수있는 여러 유형의 패킷이있을 수있는 경우에만 $ msg 대신 (예 :). $ command, $ notification etc 패킷에 메시지 유형 필드를 정의 할 수도 있습니다. 패킷 형식은 [길이 : 유형 : 데이터]가됩니다

+0

길이 int를 바이트 배열로 변환하는 방법은 무엇입니까? length-byte-array의 길이가 항상 같을까요? 클라이언트는 유형과 데이터를 분리하는 방법을 어떻게 알 수 있습니까? –

+0

당신은'BitConverter.GetBytes (length)'를 사용하여 int를 C#에서 바이트 배열로 변환 할 수 있습니다. 그렇습니다. 길이는 항상 동일합니다. 즉 4 바이트입니다. 형식과 데이터를 구분하기 위해 형식은 int 일 수도 있으므로 항상 길이는 4 바이트입니다. –

+0

그래서 내 패킷 형식은 [typelength : datalength : type : data]가 될 것입니까? 클라이언트는 읽는 바이트 수를 어떻게 알 수 있습니까? 내가 지금 가지고있는 것은 : 'byte [] buffer = new byte [4096]; int 길이 = serverStream.Read (버퍼, 0, buffer.Length); byte [] newbuffer = buffer.Take (length) .ToArray(); 문자열 returndata = Encoding.UTF8.GetString (newbuffer); ' –

관련 문제