Post

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소켓구현

유니티에서 소켓 통신하고 이벤트 등록하기 (C# 예제 코드)

[C#] TCP 소켓 통신

This post is licensed under CC BY 4.0 by the author.