C# 으로 서버와 클라이언트 기본적인 연결 및 string 데이터 전송 코드이다
서버 코드
using System;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Text;
namespace ServerCore
{
class Program
{
static void Main(string[] args)
{
//DNS : Domain Name System
// 도메인을 하나 등록해서 해당하는 IP 를 찾아오면 관리가 쉬워짐
//www.google.com =>
string host = Dns.GetHostName();
//host = "google.com"; //ipHost.AddressList[0] == {172.217.161.238}
IPHostEntry ipHost = Dns.GetHostEntry(host);
//이렇게 GetHostEntry 로 주소를 얻어오는 건 DNS 서버를 통해서 얻어 올 수 있게 됨
// ipHost.addressList[0] = IPAddress.Parse(" 경우에 따라서 ip 주소는 여러개 일 수도 있다 부하 분산을 위해서 addressList
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777); //최종 주소
//AddressFamily ip version 4,6 에 대한 것 , 위에서 자동으로 만들어줌,
//tcp 로 할 경우 stream, tcp 로 설정해준다
//리슨 하는 자체가 소켓을 하나 만들어야 한다
Socket listenSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
listenSocket.Bind(endPoint); //소켓에 ip 와 포트 할당
//최대 동시 대기 수, 동시에 들어올대 10명까지만 처리 가능하고 그 위로는 실패가 된다
listenSocket.Listen(10);
while (true)
{
Console.WriteLine("Listening .... ");
//클라의 접속이 있다면 받아오는 처리, 접속이 있을때까지 계속 대기, 즉 다음으로 넘어가지 않는다
//클라로부터 접속이 왔다면 accept 되어 클라와 별도 통실한 socket 이 생성되어 리턴된다
Socket clientSocket = listenSocket.Accept();
//클라이언트로부터 받아오는 처리
byte[] recvBuff = new byte[1024];
int recvBytpes = clientSocket.Receive(recvBuff);
string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytpes);
Console.WriteLine($"[From Client] {recvData}");
//클라이언트로 보내는 처리
byte[] sendBuff = Encoding.UTF8.GetBytes("Welcome to server!");
clientSocket.Send(sendBuff);
clientSocket.Shutdown(SocketShutdown.Both); //연결된 소켓 끊기, 듣기와 말하기를 하지 않겠다는 것
clientSocket.Close(); //클라와 서버간의 연결 끊기
}
}
catch(Exception e)
{
Console.WriteLine(e);
}
}
}
}
클라이언트 코드
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace DummyClient
{
class Program
{
static void Main(string[] args)
{
string host = Dns.GetHostName();
IPHostEntry ipHost = Dns.GetHostEntry(host);
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint endPoint = new IPEndPoint(ipAddr, 7777);
Socket socket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
//소켓으로 서버에 연결한다 , 서버 입장에선 accept 가 된다
socket.Connect(endPoint);
Console.WriteLine($"connected to {socket.RemoteEndPoint.ToString()}");
//서버로 보낸다
byte[] sendBuff = Encoding.UTF8.GetBytes("Hello world!");
int bytesSent = socket.Send(sendBuff);
//서버에서 받는다
byte[] recvBuff = new byte[1024];
int recvBytes = socket.Receive(recvBuff);
string recvData = Encoding.UTF8.GetString(recvBuff, 0, recvBytes);
Console.WriteLine($"received : {recvData}");
//서버와 통신을 위해 생성했던 소켓 종료 처리
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
}
}
결과 창
서버에서는 클라에서 보낸 데이터를 보여주고
클라에서는 서버로부터 받은 데이터를 뿌려주고 종료한다
반응형
'서버(Server) > Server' 카테고리의 다른 글
_socket.ReceiveAsync 비동기 처리 (0) | 2022.12.23 |
---|---|
비동기 accept 처리 : _listenSocket.AcceptAsync (0) | 2022.12.23 |
소켓 통신 (0) | 2022.12.22 |
통신 모델 OSI 7 계층 (0) | 2022.12.22 |
javascript : Class (0) | 2018.08.19 |