NetworkStream 의 Read 부분에서 함수에서 빠져 나오지를 않습니다.

TcpListener 를 이용하여 간단한 Client/Server 관련 통신을 하려고 합니다.
서버 관련 코딩을 먼저 진행하고 테스트 중인데 클라이언트에서 메시지롤 보내면 NetworkStream 의 객체를 StreamReader 로 맵핑후 들어온 데이타를 읽으려고 합니다.
그런데 데이타가 들어온걸 인지해서 reader.ReadLine() 함수까지는 실행을 하는데 이 함수안에서 빠져 나오지 못하고 있습니다. 클라이언트 에서 접속을 해지하면 그제야 ReadLine() 함수에서 빠져 나와 데이타를 String 변수에 저장을 합니다.

서버쪽에서 클라이언트 쪽으로 전송은 잘 됩니다.

인터넷에서 관련된 코드를 찾아 보아도 다들 비슷하게 코딩을 해 놓았던데 왜 제가 만든 코드에서만 이런 동작을 하는지 모르겠습니다.

    private void ReceiveClientData()
    {
        string receiveData;

        while (true)
        {
            if (networkstream!.DataAvailable)
            {
                receiveData = streamReader.ReadLine();  <= 이 부분에서 빠져 나오지를 못하다가 클라인트 접속이 끊어지면 그제야 빠져 나와서 들어온 데이타를 처리 합니다. 

                if (OnDataReceived is not null)
                {
                    OnDataReceived(this, new ServerEventArgs(receiveData));
                }
            }
        }
    }

어떤 문제가 있는 것일까요??

2 Likes

뉴라인이 도달하지 않아 생기는 문제입니다. 클라이언트에서 뉴라인(설정에 따라 “\n” 또는 “\r\n”)을 보내는지 확인 바랄께요.

3 Likes

일단 CR 을 넣으니 응답이 들어오기는 합니다. 감사합니다.
그런데 한가지 의문이 있는것이 제가 지금 테스트 하고 있는 클라이언트 프로그램은 ezTerm 이라는 프로그램인데 이게 어떤 업체에서 테스트 용으로 만들어진 프로그램인듯 합니다. 그런데 이 프로그램에서는 따로 CR 을 사용하지 않아도 두개 프로그램을 서버/클라이언트로 각각 설정하고 테스트 하면 주고 받고 잘하는데 streamReader.ReadLine() 함수는 꼭 CR 이 있어야만 하는지 의문입니다.

더블어 CR 을 사용하지 않고 송수신을 할수 있는 방법은 뭐가 있을까요??

2 Likes

일단 readline은 이름 그대로의 기능을 합니다.
한줄을 읽는 기능이죠.

나머지는 여기 참고하시면 됩니다.

4 Likes

데이터를 읽을때
StreamReader.ReadLine() 으로 한줄씩 읽지 않고,

NetworkStream 을 사용한다면 수신할 데이터 길이가 0일때 까지 계속 Read하면서 버퍼에 쌓아서 처리하면 됩니다.

5 Likes