1

サーバーがリッスンし続け、クライアントがメッセージを送信できる単純なクライアント サーバー アプリケーションを構築しようとしています。http://brunov.info/blog/2013/02/09/tcpip-client-server-application-exchange-with-string-messages/を参考にしています。ただし、client.exe のコンソールに入力すると、サーバーにメッセージが送信されず、プログラムがハングアップします。私は何を間違っていますか。ご意見をお聞かせください。

よろしく

これが私のServer.csです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ucSim1
{
    class Program
    {
        static void Main(string[] args)
        {
            var loaclAddress = IPAddress.Parse("127.0.0.1");
            var tcpListener = new TcpListener(loaclAddress, 81);
            tcpListener.Start();

            while (true)
            {
                Console.WriteLine("Waiting for a connection");

                var tcpClient = tcpListener.AcceptTcpClient();
                Console.WriteLine("Client Accepted");

                Thread thread = new Thread(() => ClientSession(tcpClient))
                {
                    IsBackground = true
                };

                thread.Start();
                Console.WriteLine( "Client Session thread started");

            }

        }

        private static bool tryRead(Stream stream, byte[] buffer, int offset, int count)
        {
            int bytesRead;
            while (count > 0 && (bytesRead = stream.Read(buffer, offset, count)) > 0)
            {
                offset += bytesRead;
                count -= bytesRead;
            }
            return count == 0;
        }



        private static void ClientSession(TcpClient tcpClient)
        {
            const int totalByteBuffer = 4096;
            byte[] buffer = new byte[256];

            using (var networkStream = tcpClient.GetStream())
            using (var bufferedStream = new BufferedStream(networkStream, totalByteBuffer))
                while (true)
                {
                    if (!tryRead(bufferedStream, buffer, 0, 1))
                    {
                        break;
                    }
                    byte messageLen = buffer[0];
                    if (!tryRead(bufferedStream, buffer, 1, messageLen))
                    {
                        break;
                    }
                    var message = Encoding.ASCII.GetString(buffer,1,messageLen);
                    Console.WriteLine("Message Recieved: {0}", message);

                }
        }
    }
}

これがClient.csです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;


namespace ucSim2
{
    class Program
    {
        private static byte[] msg2ByteArray(string message, Encoding enc)
        {
            var byteCount = enc.GetByteCount(message);
            if (byteCount > byte.MaxValue)
            {
                throw new ArgumentException("Message size is greater than 255 bytes in the provided encoding");
            }
            var byteArray = new byte[byteCount+1];
            byteArray[0] = (byte)byteCount;
            enc.GetBytes(message,0,message.Length,byteArray,1);
            return byteArray;
        }


        static void Main(string[] args)
        {
            String message;
            using (var tcpClient = new TcpClient())
            {
                tcpClient.Connect("127.0.0.1", 81);
                using (var networkStream = tcpClient.GetStream())
                using (var bufferedStream = new BufferedStream(networkStream))
                {
                    while (true)
                    {
                        byte[] buffer = new byte[256];
                        Console.WriteLine("Write Message");
                        message = Console.ReadLine();
                        var byteArray = msg2ByteArray(message, Encoding.ASCII);
                        bufferedStream.Write(byteArray, 0, byteArray.Length);
                    }

                }
            }
        }
    }
}

私は質問を投稿した直後にそれを理解しました...銃を飛ばして質問を投稿する前にもう少し時間を費やすべきでした...お詫び

4

2 に答える 2

2

メッセージを送信した後、次のFlush()メソッドを呼び出す必要があります。

bufferedStream.Write(byteArray, 0, byteArray.Length); 
bufferedStream.Flush(); // add this line
于 2013-08-02T08:19:00.053 に答える