C#의 GZipStream을 이용해 패킷을 압축해서 보내고 받고 테스트를 하니 잘된다.
그래서 unity에 적용!!!!! 하자 마자 오류 ...
유니티가 GZipStream과의 호환성 문제가 있나보다.
이것 저것 찾다가 sharpZipLib 라는걸 추천하길래 써봤다.
현재 서버의 구조는
1. 버퍼 생성
2. 버퍼의 데이터를 압축
3. 데이터를 암호화
4. 전송
1. 수신
2. 복호화
3. 압축 해제
4. 버퍼를 읽어 들임.
순서다.
압축 코드는 초 간단..
암호화와 압축이 옵션이라 호출 하는 쪽에서 버퍼를 공유하기 위해 out byte[] ret 으로 받고 있지만 그냥 애초에 리턴으 byte[]로 받는게 보통이다..
private void Compress(byte[] data, out byte[] ret)
{
using(MemoryStream ms = new MemoryStream(data)) // 패킷 데이터를 넣어 메모리 스트림 생성 (input)
{
using(MemoryStream zip = new MemoryStream()) // 리턴받을 메모리 스트림 생성(output)
{
BZip2.Compress(ms, zip, false, 3); // input 스트림의 데이터를 output 스트림으로 압축하여 저장
ret = zip.ToArray();
}
}
}
public void Decompress(byte[] data, out byte[] ret)
{
using(MemoryStream ms = new MemoryStream(data)) // 패킷 데이터를 넣어 메모리 스트림 생성
{
using(MemoryStream zip = new MemoryStream()) // 리턴받을 메모리 스트림 생성
{
BZip2.Decompress(ms, zip, false); // 압축 해제 하여 output 스트림에 저장
ret = zip.ToArray();
}
}
}
이렇게 데이터를 보내고 받으니 unity 에서도 잘 된다.
패킷 사이즈는 총 12000 byte 정도가 4000 byte 정도까지 줄어들었다.
'프로그래밍 > C#' 카테고리의 다른 글
[C#] Socket.BeginReceive 딜레이 현상. (0) | 2014.02.26 |
---|---|
[C#]MDI부모폼에서 자식폼의 함수 호출 (0) | 2012.10.08 |
[C#]byte[] 데이터 암호화 (0) | 2012.08.31 |
BinaryWriter pointer 사용(seek) (0) | 2012.08.06 |
[ASP.NET C#]이미지 메타태그 값 수정하기 / keyword, comment / EXIF (0) | 2011.12.08 |