#1에 이어 #2이다. 이번에는 Client코드를 살펴보자.

 

먼저 소켓에 접속하는 함수

 

ConnectToServer()

    public void ConnectToServer()
    {
        // 이미 연결되었다면 함수 무시
        if (_bSoketReady) return;

        // 기본 호스트/ 포트번호
        string ip = ins_inputIPNumber.text == "" ? "127.0.0.1" : ins_inputIPNumber.text;
        int port = ins_inputPort.text == "" ? 9999 : int.Parse(ins_inputPort.text);

        // 소켓 생성
        try
        {
            _tcpSoket = new TcpClient(ip, port);
            _NetworkStream = _tcpSoket.GetStream();
            _writer = new StreamWriter(_NetworkStream);
            _reader = new StreamReader(_NetworkStream);
            _bSoketReady = true;
        }
        catch (Exception e)
        {
            Chat.instance.ShowMessage($"소켓에러 : {e.Message}");
        }
    }

 

 

OnIncomingData

    void OnIncomingData(string data)
    {
        if (data == "%NAME")
        {
            _strClientName = ins_inputNickName.text == "" ? "Guest" + UnityEngine.Random.Range(1000, 10000) : ins_inputNickName.text;
            Send($"&NAME|{_strClientName}");
            return;
        }

        Chat.instance.ShowMessage(data);
    }

if(data = "%NAME") : 으로 들어오는 %,&인 특수문자로 체크하는데 영상 댓글에 보니 들어오기 전 이름, 나갈 이름을 구분하는 용도라 한다. 여기서는 % 들어오기 전에 이름인거같다.

사용자가 입력한 string이 없으면 Guest + 숫자로 임의로 만들어준다.

send : &NAME으로 서버에 보낸다.

 

연결되는 부분이 Server클래스에 OnIncomingData()에서

//Server.cs.

void OnIncomingData(ServerClient c, string data)
    {
        if (data.Contains("&NAME"))
        {
            c.clientName = data.Split('|')[1];
            Broadcast($"{c.clientName}이 연결되었습니다", _listClients);
            return;
        }

        Broadcast($"{c.clientName} : {data}", _listClients);
    }

연결된 클라이언트의 이름을 접속한 클라이언트들에게 보내는 내용이다.

 

OnSendButton

    public void OnSendButton(InputField SendInput)
    {
#if (UNITY_EDITOR || UNITY_STANDALONE)
        if (!Input.GetButtonDown("Submit")) return;
        SendInput.ActivateInputField();
#endif
        if (SendInput.text.Trim() == "") return;

        string message = SendInput.text;
        SendInput.text = "";
        Send(message);
    }

메시지 보내기 버튼으로 입력된 내용을 send 해주는 과정이다.

 

 

OnApplicationQuit

    void OnApplicationQuit()
    {
        CloseSocket();
    }
    
    void CloseSocket()
    {
        if (!_bSoketReady) return;

        _writer.Close();
        _reader.Close();
        _tcpSoket.Close();
        _bSoketReady = false;
    }

앱 종료하면 연결된 소켓들의 정보를 끊어준다.

 

tcp에 대한 간단한 개념잡기에는 괜찮은거 같다.

 

참고:

https://www.youtube.com/watch?v=y3FU6d_BpjI

+ Recent posts