// [A] 클라이언트에서, 서버 접속에 필요한 데이터를 준비합니다.(Private 필드, 맴버 변수)
private IPAddress? _serverIPAddress = IPAddress.Parse("127.0.0.1"); //서버IP
private int _serverPort; //서버Port
private TcpClient? _client; //클라Socket
// [B] getter 구현 (외부에서 변경 불가, 내부 메서드를 통해서만 변경)
// (동일) // public IPAddress? ServerIPAddress { get { return _serverIPAddress; } }
public IPAddress? ServerIPAddress => _serverIPAddress;
public int ServerPort => _serverPort;
public TcpClient? Client => _client;
// [C] setter 구현 (IP 검증 및 설정)
public bool SetServerIPAddress(string addressStr)
{
if (!IPAddress.TryParse(addressStr, out var parsed))
{
Console.WriteLine(" - 잘못된 서버 IP입니다.");
return false;
}
_serverIPAddress = parsed;
return true;
}
// [D] setter 구현 (포트 번호 검증 및 설정 메서드)
public bool SetServerPort(string portStr)
{
int portNum;
if (!int.TryParse(portStr, out portNum) || portNum <= 0 || portNum > 65535)
{
Console.WriteLine(" - 잘못된 Port입니다. (유효 범위: 1~65535)");
return false;
}
_serverPort = portNum;
return true;
}
// [E] 서버 접속 메서드
public async Task ConnectToServerAsync()
{
// [E.1] 서버가 연결되어 있지 않으면,
if (_client == null) _client = new TcpClient();
try
{ // [E.2] 검증한 IP, Port 를 기반으로 서버 연결 시도
await _client.ConnectAsync(_serverIPAddress, _serverPort);
Console.WriteLine(string.Format("서버 접속 IP/Port: {0}/{1}", _serverIPAddress, _serverPort));
}
catch (Exception ex)
{ // [E.3] 예외 발생시 상태 출력
Console.WriteLine(ex.ToString());
throw;
}
}
// [A] TCPSocketClient 인스턴스 생성
TCPSocketClient client = new TCPSocketClient();
// [B] 사용자로부터 서버 IP 주소와 포트 번호 입력 받고, 설정
Console.WriteLine("*** 소켓 클라이언트 예제 ***");
Console.Write("서버 IP를 입력하세요: ");
string strIPAddress = (Console.ReadLine() ?? "").Trim();
Console.Write("포트 번호(1~65535)를 입력하세요: ");
string strPortInput = (Console.ReadLine() ?? "").Trim();
// [C] IP 또는 Port가 잘못된 경우
if (!client.SetServerIPAddress(strIPAddress) || !client.SetServerPort(strPortInput))
{
Console.WriteLine($" - 잘못된 IP 또는 포트 (IP: {strIPAddress}, Port: {strPortInput})");
Console.WriteLine("아무 키나 누르면 종료합니다...");
Console.ReadKey();
return;
}
// [D] 서버에 비동기 접속 시도
_ = client.ConnectToServerAsync();
// [E] 사용자 입력 대기
string? userInput = null;
Console.WriteLine("메시지를 입력하세요. (종료하려면 <EXIT> 입력 후 Enter)");
do
{
userInput = Console.ReadLine() ?? string.Empty;
} while (userInput != "<EXIT>");
Console.WriteLine("클라이언트 프로그램을 종료합니다.");