csharp 배열값 가져오기?? 질문드립니당

소켓 통신 실습하고 있는데
지금 구현하고 싶은 게 배열에 값들을 넣어서…

예를 들면

클라이언트에서 123을 보내면 서버에서는 456 이 뜨고 이런 식으로 만들어 보려고 하는데 어떻게 접근해야 할지 모르겠습니다.

배열에 값들을 저장해서 찾아야 하나 이렇게 생각도 드는데 접근 방법을 잘 몰라서 질문드립니다. ㅠㅠ

1 Like

질문의 요지를 알 수가 없어 효과적으로 답변드리기 힘듭니다.

C#에서는 TcpClientTcpListener를 이용해 TCP 소켓 통신을 할 수 있습니다. 또는 Socket을 바로 사용할 수 도 있습니다. TcpListenerTcpClientSocket을 좀 더 편하게 사용할 수 있도록 .NET에서 Socket을 이용해 좀 더 구현된 클래스입니다.

데이터는 문자열이던 숫자던 기타 다양한 데이터 형태던 최종적으로 바이너리로 전송됩니다. 그래서 최초 획득할 수 있는 데이터 유형은 byte[]이고요, 일반적으로 byte[]형을 바로 처리하지 않고 TcpClient에서 제공하는 GetStream() 메소드로 NetworkStream으로 처리하는데, 이것을 BinaryReader로 읽고 BinaryWriter로 네트워크 스트림에 쓰면 원하는 기본 데이터 유형으로 데이터를 주거니 받거니 할 수 있습니다.

위의 링크를 통해 관련 샘플을 살펴보시고, 그래도 잘 모르시겠으면 추가 질문 해주세요.

2 Likes

질문에 대한 정보가 부족하기 때문에 부정확한 답변을 드릴 수 밖에 없습니다.

질문 내용 그 자체만 놓고 보면 클라이언트에서 new byte[] { (byte)'1', (byte)'2', (byte)'3', } 과 같은 데이터를 보냈을 때, 서버 측에서 저렇게 들어온 데이터를 읽어 화면에 "456"이라는 문자열을 표시하려고 하는데, byte[] 타입의 데이터를 어떻게 읽어서 비교해야 좋을지 잘 모르겠다는 의미로 파악됩니다.

구현 방법은 다양하겠습니다만, 보통은 클라이언트와 서버 사이에 프로토콜을 정하는 것이 순서입니다. 가장 간단한 예를 들어, 양쪽 모두 주고 받는 바이트 배열을 UTF-8 인코딩을 써서 텍스트로 변환한 다음 처리하는 것을 생각해볼 수 있습니다.

Socket.Receive Method (System.Net.Sockets) | Microsoft Docs

위의 문서에 나와있는 코드를 발췌해보면,

// Displays sending with a connected socket
// using the overload that takes a buffer.
public static int SendReceiveTest1(Socket server)
{
    byte[] msg = Encoding.UTF8.GetBytes("This is a test");
    byte[] bytes = new byte[256];
    try
    {
        // Blocks until send returns.
        int i = server.Send(msg);
        Console.WriteLine("Sent {0} bytes.", i);

        // Get reply from the server.
        i = server.Receive(bytes);
        Console.WriteLine(Encoding.UTF8.GetString(bytes));
    }
    catch (SocketException e)
    {
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
        return (e.ErrorCode);
    }
    return 0;
}

256 바이트의 데이터를 서로 주고 받기로 약속한 상태에서, 들어온 바이트 배열 데이터를 Encoding.UTF8GetString 메서드를 사용하여 문자열로 변환하고 있습니다. 클라이언트가 "123"이라는 문자열을 UTF8 인코딩으로 제대로 보냈다면, 받을 때에도 "123"이라는 문자열을 볼 수 있어야 할 것입니다. 그 외에는 오류로 처리가 되어야겠죠.

네트워크 프로그래밍에서 중요한 부분이 바로 이 부분인데, 단순히 어떻게 코딩할 것인가 하는 방법 말고 프로토콜 규약을 정의하는 것이 필요합니다.

여기에 더해, 굳이 프로토콜을 새로 써내려가야 할 이유가 없다면 요즈음은 HTTP 프로토콜을 이용하는 웹 API를 설계하는 것이 여러모로 시간 절약에 도움이 됩니다.

3 Likes

byte 배열을 쉽게 처리하시려면, BitConverter 클래스 (System) | Microsoft Learn 추천드립니다.

2 Likes

답글이 늦었습니다. 다시 정리 해서 올리겠습니다 죄송합니다 모라자서 그렇습니다 이해해주세요 ㅠㅠ

1 Like

이제 댓글을 봤습니다. 답글 감사합니다.제가 질문의 요지를 제대로 못올린거 같습니다 정말죄송합니다 모자라서 그렇습니다 ㅠㅠ 다시 정리해서 다시올리겠습니다!! 댓글감사합니다.

1 Like

이제 댓글을 봤습니다. 답변 감사합니다 한번 시도해보겠습니다 감사합니다

1 Like