Reference 👉👉 Microsoft Docs
게임에 소켓 통신을 적용하고 싶어서 Microsoft의 문서에 소개된 샘플 코드를 테스트해봤다. (편의를 위해 아주 약간 수정했다.)
Client Socket
using System;
using System.Text;
using System.Net.Sockets;
public class ClientSocket
{
public void Client(string server, int port, string message)
{
try
{
TcpClient client = new TcpClient(server, port);
Byte[] data = Encoding.ASCII.GetBytes(message);
NetworkStream stream = client.GetStream();
stream.Write(data, 0, data.Length);
Console.WriteLine("Sent: {0}", message);
data = new Byte[256];
String responseData = String.Empty;
Int32 bytes = stream.Read(data, 0, data.Length);
responseData = Encoding.ASCII.GetString(data, 0, data.Length);
Console.WriteLine("Received: {0}", responseData);
stream.Close();
client.Close();
}
catch (ArgumentException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("Socket Exception: {0}", e);
}
Console.WriteLine("\n Press Enter to continue...");
Console.Read();
}
}
클라이언트 소켓이다. 서버의 로컬 주소와 포트 넘버를 알아야한다.
데이터를 보내면, 데이터를 받은 서버가 보내준 데이터(responseData:여기서는 Upper case로 수정한 문자열)를 받아와 바로 출력해주었다.
Server Socket
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
public class ServerSocket
{
public void Server()
{
TcpListener server = null;
Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
try
{
server = new TcpListener(localAddr, port);
server.Start();
Byte[] bytes = new Byte[256];
String data = null;
while (true)
{
Console.Write("Waiting for connection...");
TcpClient client = server.AcceptTcpClient();
Console.Write("Connected!");
data = null;
NetworkStream stream = client.GetStream();
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
data = data.ToUpper();
byte[] msg = Encoding.ASCII.GetBytes(data);
stream.Write(msg, 0, msg.Length);
Console.WriteLine("Sent: {0}", data);
}
client.Close();
}
}
catch (SocketException e)
{
Console.WriteLine("Socket Exception: {0}", e);
}
finally
{
// stop listening for new clients
server.Stop();
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
}
서버 소켓이다. 주소를 지정하여 서버를 열면 Listening 상태로 클라이언트 소켓이 데이터를 보내길 기다린다(AcceptTcpClient()).
연결이 되면 데이터를 읽어온다. 마찬가지로 Write를 이용해 받은 데이터에 대한 답을 보낸다. 이 작업이 끝나면 서버는 클라이언트 소켓을 종료시키고 다음 클라이언트와의 연결을 기다린다.