반응형
✔ Unity3D - Socket 통신 서버, 클라이언트 구축하기
WebSocket-Sharp 활용
데이터를 주고 받을 경우 통신은 필수항목이다.
어떻게 서버와 통신을 하여 데이터를 주고 받을지는 다양한 방법이 있다. ( 포툰, UNET 등 )
여기에서는 WebSocketSharp.dll 을 이용하여 서버와 Unity 클라이언트와 통신을 하는 방법에 대해 알아본다.
필자는 서버측은 Windows Form으로 구축하고 클라이언트를 Unity로 제작했다.
(서버측도 Unity나 다른 어떤 시스템으로 구축해도 무방하다.)
WebSocket-Sharp.dll에 대한 자세한 내용은 아래 링크 참조
github.com/sta/websocket-sharp
귀찮은 사람들을 위해 파일을 첨부드립니다.
다운로드 후 Unity의 Asset폴더 안에 Plugins 폴더안에 넣어주시면 됩니다 (Plugins 폴더 없으면 생성)
아래는 구축 예제를 보여준다.
● 서버측
using System;
using WebSocketSharp;
using WebSocketSharp.Server;
namespace Example
{
public class Server : WebSocketBehavior
{
//클라이언트로부터 데이터를 받았을때 처리
protected override void OnMessage (MessageEventArgs e)
{
var msg = e.Data;
Send (msg);
}
}
public class Program
{
public static void Main (string[] args)
{
//WebSocket 생성 (IP, Port)
var wssv = new WebSocketServer (IPAddress.Any,6000);
//Server 서비스 추가
wssv.AddWebSocketService<Server> ("/Server");
//서비스 실행
wssv.Start ();
Console.ReadKey (true);
wssv.Stop ();
}
}
}
● 클라이언트 (Unity)
using System.Collections.Generic;
using UnityEngine;
using WebSocketSharp;
using System;
using System.Threading;
using System.Text;
public class WebSocketClient : MonoBehaviour
{
private string IP = "127.0.0.1";
private string PORT = "6000";
//서버 서비스 이름
private string SERVICE_NAME = "/Server";
public WebSocketSharp.WebSocket m_Socket = null;
private void Start()
{
try
{
m_Socket = new WebSocketSharp.WebSocket("ws://" + IP + ":" + PORT + SERVICE_NAME);
m_Socket.OnMessage += Recv;
m_Socket.OnClose += CloseConnect;
}
catch
{ }
}
//서버 연결함수
public void Connect()
{
try
{
if(m_Socket == null || !m_Socket.IsAlive)
m_Socket.Connect();
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
}
private void CloseConnect(object sender, CloseEventArgs e)
{
DisconncectServer();
}
//연결 해제 함수
public void DisconncectServer()
{
try
{
if (m_Socket == null)
return;
if (m_Socket.IsAlive)
m_Socket.Close();
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
}
//서버로 데이터 전송할 함수
public void SendMessage(string msg)
{
if (!m_Socket.IsAlive)
return;
try
{
m_Socket.Send(Encoding.UTF8.GetBytes(msg));
}
catch (Exception)
{
throw;
}
}
//서버로 부터 받은 데이터 처리
public void Recv(object sender, MessageEventArgs e)
{
//string 데이터
Debug.Log(e.Data);
//bytes 데이터
Debug.Log(e.RawData);
}
private void OnApplicationQuit()
{
DisconncectServer();
}
}
감사합니다.
반응형
'Programming > Unity' 카테고리의 다른 글
[Unity3D] 카메라 거리에 따라 오브젝트 활성화/비활성화 (5) | 2020.12.04 |
---|---|
[Unity] C# 외부 프로세스(프로그램) 조회 및 실행, 종료 - args 매개변수 전달 (2) | 2020.12.04 |
[Unity3D] NVIDA Flex Error - ArgumentException: ComputeBuffer.SetData() (121) | 2020.11.06 |
[Unity3D] 마우스 클릭 시 UI인지 3D객체 인지 구별 (2) | 2020.10.16 |
[Unity3D] 3D오브젝트 공간 정렬 (7) | 2020.09.21 |
댓글