[오늘의 코딩테스트]
[프로그래머스/JS] LEVEL1 햄버거 만들기
[문제][오답코드]function solution(ingredient) { var answer = 0; ingredient = ingredient.join(""); const pos = '1231'; let num = 0; let count = 0; while(1){ let num = ingredient.indexOf(pos); if(num != -1){ count++; ingredient = ingredient.replace(pos
ezez99.tistory.com
[프로그래머스/JS] LEVEL 1 : 둘만의 암호
[문제][풀이코드]function solution(s, skip, index) { let ans = ""; s = s.split(""); s.map((item) => { let a = item.charCodeAt(); for (let i = 0; i 122) { a = 97; } if(skip.includes(String.fromCodePoint(a))){ i--; } } ans += String.fromCodePoint(a); })
ezez99.tistory.com
[오늘 한일]
- 유니티 복습 & 서버와 연결
유니티를 사전에 학습하였지만 다시 한번 배운다는 생각으로 유니티를 학습하였다.
처음에는 간단한 PINGPONG 게임을 제작하였다.
서로 1player , 2player가 되어서 튕기는 공을 위아래로 막는 게임을 제작하였고, 간단한 물리엔진만 적용되었다. 이 학습을 통해서 리지드바디, Box collider 등의 이해도를 높일 수 있었다.
- 그리고 사전에 만들어둔 서버기능을 통해 유니티와 연결하는 방법을 학습하였다.
Hello를 입력한뒤 핸들러 10번의 이벤트를 발동하면 우리는 사전에 핸들러 10번의 이벤트에서 소문자들을 모두 대문자로 바꾸게 하였기 때문에 대문자가 적용되는 것을 확인해야한다.
왼쪽 위의 텍스트가 잘 적용 되는 것을 확인할 수 있다.
이번엔 11번 핸들러를 적용 시켰을 때 Hello 가 뒤집혀서 olleH가 되어야한다. 확인해보면
다음과 같이 잘 적용되는 것을 확인할 수 있고, 12번을 클릭 할 경우 없는 핸들러기 때문에 적용이 안되는 것 또한 확인 할 수 있다.
소스코드를 조금 더 파보자면
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class HandlerUI : MonoBehaviour
{
public Client client;
public InputField inputField;
public void OnClickHandler10()
{
client.HANDLER_ID = 10;
client.SendMessageToServer(inputField.text);
}
public void OnClickHandler11()
{
client.HANDLER_ID = 11;
client.SendMessageToServer(inputField.text);
}
public void OnClickHandler12()
{
client.HANDLER_ID = 12;
client.SendMessageToServer(inputField.text);
}
}
위의 코드는 버튼을 각각 클릭 할 때 발생하는 핸들러 이벤트이다. 10번을 누르면 client.sendMessageToserver로 해당하는 텍스트를 보내서 10번 핸들러 이벤트가 발생하게 끔 구현되었다. 11번 12번 또한 마찬가지로 적용되어있다.
using System;
using System.Net.Sockets;
using UnityEngine;
using System.Threading;
using System.Text;
using System.Linq;
using UnityEngine.UI;
using System.Collections.Generic;
using UnityEngine.Events;
public class Client : MonoBehaviour
{
TcpListener listener = null;
TcpClient client = null;
NetworkStream stream = null;
Thread thread;
private Queue<UnityAction> actionBuffer = new Queue<UnityAction>();
public string SERVER_IP = "43.201.27.61";
public int SERVER_PORT = 5555;
public int HEADER_LENGTH = 6;
public short HANDLER_ID = 10;
public Text text;
private void Awake()
{
ConnectToServer();
}
void Update()
{
if (actionBuffer.Count > 0)
{
actionBuffer.Dequeue().Invoke();
}
if (Input.GetKeyDown(KeyCode.Space))
{
SendMessageToServer("a");
}
}
private void ConnectToServer()
{
try
{
client = new TcpClient(SERVER_IP, SERVER_PORT);
stream = client.GetStream();
Debug.Log("Connected to server.");
thread = new Thread(new ThreadStart(ListenForData));
thread.IsBackground = true;
thread.Start();
}
catch (SocketException e)
{
Debug.LogError("SocketException: " + e.ToString());
}
}
private void ListenForData()
{
try
{
byte[] bytes = new byte[1024];
while (true)
{
if (stream.DataAvailable)
{
int length;
while ((length = stream.Read(bytes, 0, bytes.Length)) != 0)
{
length -= HEADER_LENGTH;
var incomingData = new byte[length];
Array.Copy(bytes, 6, incomingData, 0, length);
string serverMessage = Encoding.UTF8.GetString(incomingData);
actionBuffer.Enqueue(delegate { OnSetText(serverMessage);});
Debug.Log("Server message received: " + serverMessage);
}
}
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
}
}
public void SendMessageToServer(string message)
{
if (client == null || !client.Connected)
{
Debug.LogError("Client not connected to server.");
return;
}
byte[] data = SetPacket(message);
stream.Write(data, 0, data.Length);
Debug.Log("Sent message to server: " + message);
}
byte[] SetPacket(string data)
{
byte[] header_length = BitConverter.GetBytes(data.Length);
Array.Reverse(header_length);
byte[] header_id = BitConverter.GetBytes(HANDLER_ID);
Array.Reverse(header_id);
byte[] m_header = header_length.Concat(header_id).ToArray();
byte[] body = Encoding.UTF8.GetBytes(data);
byte[] packet = m_header.Concat(body).ToArray();
return packet;
}
public void OnSetText(string str)
{
if(text != null)
{
text.text = str;
}
}
private void OnApplicationQuit()
{
stream.Close();
client.Close();
listener.Stop();
thread.Abort();
}
}
클라이언트 코드의 경우 시작할 때 서버에 연결하고 서버의 정보를 불러들이고, 해당 서버의 메시지를 SendMessage함수로 전달할 때 마다 클라이언트의 메시지를 서버에 보내주는 역할을 한다.
- wireshark 학습
서버의 패킷정보를 확인하기 위해서 wireshark에 대해서 학습하였다.
다음과 같이 패킷이 어떻게 전송이 되는지 데이터의 전달 과정을 자세히 나타냈다.
[오늘 총평]
과제하기에 어떻게 시작을 해야하는지에 조금 막막함을 느끼고 있는 것같다. 천천히 하나하나 진행한다는 생각으로 해봐야겠다
'코딩 > TIL' 카테고리의 다른 글
[TIL] Websocket 멀티서버 구현 (0) | 2024.07.16 |
---|---|
[TIL] TCP서버 제작 개인 과제 진행 (0) | 2024.07.08 |
[TIL] TCP 서버의 이해(핸들러의 역할) (0) | 2024.06.27 |
[TIL] 게임서버의 이동 연출 (선형보간, 외삽법) (0) | 2024.06.27 |
[TIL] Socket.io 의 on 과 emit의 이해 (0) | 2024.06.26 |