#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
'유니티' 카테고리의 다른 글
unity) UniRX (0) | 2024.12.01 |
---|---|
[유니티 커스텀 에디터] 맵툴 #2 (0) | 2021.08.04 |
유니티)TCP 채팅 #1 (0) | 2021.06.09 |
[유니티] 유니티 PlayerPrefs 저장경로/ Application.dataPath/ (0) | 2021.05.03 |
[유니티] 어드레서블 알아보기 어드레서블 개념과 로드방법 - 1 (0) | 2021.05.01 |