2014-12-13 2 views
1

저는 데이터를 보내고 받기 위해 소켓을 사용하는 게임 프로젝트에서 작업하고 있습니다. 클라이언트 게임은 Unity이며 서버는 ASP.Net입니다.소켓을 통해 여러 변수 데이터를 보내고받는 가장 좋은 방법

우리 모두는 소켓에서 알 수 있듯이 바이트 만 보내고받을 수 있습니다. 속도 방향과 같은 여러 변수를 보내고받는 가장 좋은 방법은 무엇입니까?

나는 모든 변수를 문자열에 연결하고 해당 문자열을 바이트로 변환 한 후 다른 쪽에서 문자열을 보내고 취소하는 것이 가장 좋은 방법이라고 생각합니다. 하지만 아마도 최선의 방법이 아니며 C#에서 다른 방법이있을 수도 있습니다. 다음은 잘 작동한다고 생각되는 의사 코드입니다.

int position,rotation; 
string data=concat(data,position,rotation); 
byte[] byteBuffer = Encoding.ASCII.GetBytes(data); 
socket.send(bytebuffer); 

이 방법은 충분히 효율적이라고 생각하지 않습니다. 다른 방법을 찾을 수 있을까요?

+0

[도움을 청하는 건가요?] (http://www.gamedev.net/topic/663699-best-way-to-send-an-receive-multivarible-data-by-socket/) – TyCobb

+0

무엇을 의미합니까? ? @ TyCobb – virtouso

+1

나는 [SignalR] (http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-net-client)을 사용할 수 있다고 생각한다. –

답변

2

문자열이 실제로 필요하지 않으면 문자열을 잘못 이해하지 않아도됩니다.

대신 BinaryReaderBinaryWriter을 사용할 수 있습니다. 이렇게하면 페이로드 크기를 최소한으로 유지할 수 있으며 문자열 인코딩을 처리 할 필요가 없습니다 (물론 실제 문자열을 쓰거나 읽지 않는 한).


// Client 
using(var ms = new MemoryStream()) 
{ 
    using (var writer = new BinaryWriter(ms)) 
    { 
     //writes 8 bytes 
     writer.Write(myDouble); 

     //writes 4 bytes 
     writer.Write(myInteger); 

     //writes 4 bytes 
     writer.Write(myOtherInteger); 
    }  
    //The memory stream will now have all the bytes (16) you need to send to the server 
} 

// Server 
using (var reader = new BinaryReader(yourStreamThatHasTheBytes)) 
{ 
    //Make sure you read in the same order it was written.... 

    //reads 8 bytes 
    var myDouble = reader.ReadDouble(); 

    //reads 4 bytes 
    var myInteger = reader.ReadInt32(); 

    //reads 4 bytes 
    var myOtherInteger = reader.ReadInt32(); 
} 

내가이 방법은 충분히 효율적이지 수 있다고 생각합니다. 다른 방법을 찾을 수 있을까요? [sic]

아직 걱정할 필요가 없습니다. 당신이 프로젝트의 첫 단계에있는 것처럼 들립니다. 나는 먼저 뭔가를 얻는 것이 좋겠지 만 당신이 플러그 형으로 만들 수 있도록 노력해야한다. 그렇게하면 나중에 가지고있는 솔루션을 너무 느리게 만들거나 소켓 대신에 다른 것을 사용하기로 결정했다면 나중에 쉽게 바꿀 수 있습니다.

+0

좋은 것을 고맙다. 대답을 찾았지만 답을 찾았을 때마다 변수를 데이터 유형과 일치시킬 수 있습니다. 그러나 둘 다 int처럼 int의 일부가 같을 경우 어떻게 될까요? – virtouso

+1

@virtouso, 각 데이터 유형은 고정 길이입니다. 'int'는 4 바이트입니다. 그래서 만약 당신이 2 int (8 바이트), 당신은'ReadInt32()'를 두 번 호출합니다. Read 메서드를 호출 할 때마다 데이터 형식에 따라 특정 바이트 수를 읽습니다. – TyCobb

1

내 친구들에게 감사하지만 나는 훨씬 더 간단한 방법을 발견하고 그걸 당신과 공유하기로 선택했습니다. 당신은 문자열에 일부 varibales를 설정할 수 있습니다. 그리고 나서 당신은 그것을 seperatly로 나눌 수 있습니다. 좋아해 코드

string s = "first,second,x"; 
string[] s2=s.Split(','); 
Console.WriteLine(s2[0]); 
Console.ReadLine(); 

감사합니다.

관련 문제