본문 바로가기
Programming/Unity

[Unity] WebSocket을 이용한 통신 서버 - 클라이언트 구축하기

by 타임박스 2020. 12. 3.
반응형


✔ Unity3D - Socket 통신 서버, 클라이언트 구축하기

WebSocket-Sharp 활용


 


 

데이터를 주고 받을 경우 통신은 필수항목이다.

어떻게 서버와 통신을 하여 데이터를 주고 받을지는 다양한 방법이 있다. ( 포툰, UNET 등 )

여기에서는 WebSocketSharp.dll 을 이용하여 서버와 Unity 클라이언트와 통신을 하는 방법에 대해 알아본다.

필자는 서버측은 Windows Form으로 구축하고 클라이언트를 Unity로 제작했다.

(서버측도 Unity나 다른 어떤 시스템으로 구축해도 무방하다.)

WebSocket-Sharp.dll에 대한 자세한 내용은 아래 링크 참조

github.com/sta/websocket-sharp

 

sta/websocket-sharp

A C# implementation of the WebSocket protocol client and server - sta/websocket-sharp

github.com

귀찮은 사람들을 위해 파일을 첨부드립니다.

websocket-sharp.dll
0.22MB

다운로드 후 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();
    }
}

 

감사합니다.

반응형

댓글