Unity tcp 통신
중앙 서버에서 데이터를 받아야 하니까, TCP 통신이 가능하도록 클라이언트를 만듬
Unity Version : 2022.3.16f1 LTS
TCP 클라이언트 만들기
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// TcpTest.cs
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class TcpTest : MonoBehaviour
{
private TcpClient socket;
private string host = "여긴 비밀";
private int port = 8000;
// TCP 연결 부분은 스레드로 해서 메인 스레드가 멈추지 않도록 함
void Start()
{
Thread connectThread = new Thread(new ThreadStart(ConnectToTcpServer));
connectThread.IsBackground = true;
connectThread.Start();
}
// = 키 누르면 test test 문자열이 가도록 했음 (이건 추후에 수정 가능)
void Update()
{
if (socket == null) { return; }
if (Input.GetKeyDown(KeyCode.Equals))
{
Thread sendThread = new Thread(() => sendMessage("test test"));
sendThread.Start();
}
}
// 시작할 때 스레드 화 해서 불러지는 TCP 서버 연결 함수
private void ConnectToTcpServer()
{
Debug.Log("Try to Connect...");
try
{
socket = new TcpClient(host, port);
Debug.Log("Connected!");
recvMessage(); // 메시지 수신 부분을 심어놨음
}
catch (Exception e)
{
Debug.Log("On client connect exception : " + e);
}
}
private void sendMessage(string message)
{
if (socket == null)
{
return;
}
try
{
NetworkStream stream = socket.GetStream();
if (stream.CanWrite)
{
// 문자열 -> 바이트로 변경
byte[] buffer = Encoding.UTF8.GetBytes(message);
stream.Write(buffer, 0, buffer.Length);
Debug.Log("[Client] : "+ message);
}
}
catch (SocketException e)
{
Debug.Log("send message exception : " + e);
}
}
private void recvMessage()
{
while (true)
{
try
{
NetworkStream stream = socket.GetStream();
if (stream.CanRead)
{
byte[] buffer = new byte[4098];
int bytes = stream.Read(buffer, 0, buffer.Length);
if (bytes <= 0) { continue; }
string message = Encoding.UTF8.GetString(buffer, 0, bytes);
if (message != null)
{
Debug.Log("[Server] : " + message);
}
}
}
catch (Exception e)
{
Debug.Log("recv message exception : " + e);
}
}
}
}
참고자료
C# 스레드, 쓰레드(Thread) 파라미터, 매개변수 전달 하기
C# TcpListener와 TcpClient를 이용한 TCP소켓구현
This post is licensed under CC BY 4.0 by the author.