BestHttp2
- WebGL에서 소켓에 직접 접근 불가(WebSocket-sharp 같은 패키지 사용)
- Js 플러그인을 만들어서 여러 단계를 거쳐서 통신해야함.
Socket
Usage
- Uri는 System 네임스페이스
- SocketManager는 SocketIO3 네임스페이스에 포함되어 있다.
Receive Event
server -> data.toString()
manager.Socket.On<string>("message", (data) => {
PlayerData playerData = JsonUtility.FromJson<PlayerData>(data);
Debug.Log(playerData.position);
}
server -> { position : (0,0,0)}
manager.Socket.On<PlayerData>("message", (data) => {
Debug.Log(data.position);
}
- message에 이벤트명, data에서 들어오는 데이터를 받는다.
- 서버에서 toString()으로 보내면 JsonUtility를 이용해서 파싱
- 서버에서 딕셔너리의 형태로 오면 동일한 Key값을 가진 클래스로 데이터를 받을 수 있다.
- PlayerData의 프로퍼티 변수명과 서버에서 보내는 데이터의 Key값이 일치하지 않으면 Null 뜸
Send Event
manager.Socket.Emit("message", "Hello!");
- message에 이벤트명, 두번째 파라미터에 보낼 데이터 작성.
RoomInfo roomInfo = new RoomInfo(_RoomID(), Network.manager.Socket.Id, 0, "");
manager.Socket.Emit("WSS_SEND_MAKE_ROOM", JsonUtility.ToJson(roomInfo));
ex) 서버에서 message 들어온 값을 그대로 반환하는 이벤트가 있다고 하면,
Emit("message") -> On("message") -> Log("Hello")
Warnings
- JsonUtility에서 ToJson으로 만드는 클래스는 프로퍼티(get, set) 사용불가
- 클래스 내 변수는 Object형식(Transform)이 아닌 Vector3, Quatanion 같이 분리해서 보내야 한다. (파싱할 때 null 발생)
- (서버)유저 목록 보낼 때 {ID : ID, ID2 : ID2}로 보내면 받을 수가 없다(받는 데이터에서 변수명과 키 값을 일치시켜줘야 하기때문), Array같은 형식으로 보내야 한다.
REST
Basic Usage
- Requset 인스턴스를 생성하고 Send 함수로 보낸다.
- 2번째 파라미터에 HTTPMethods를 추가해 GET, POST, UPDATE, DELETE 요청을 보낼 수 있다.
Request with data(json)
- 소켓 통신과 동일하게 클래스를 JSON화, 전송
- 비동기 처리를 위해 async, await 사용
Usage Example
- CompREST의 Send함수 : Send(string uri, string method, T? data)
- 서버에는 {data : 123}으로 전달된다.
Server-side code
[References]
https://benedicht.github.io/BestHTTP-Documentation/pages/best_http2/protocols/socketio/socketio.html