Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中简单的客户机-服务器应用#_C#_Visual Studio_Sockets_Network Programming_Tcpclient - Fatal编程技术网

C# C语言中简单的客户机-服务器应用#

C# C语言中简单的客户机-服务器应用#,c#,visual-studio,sockets,network-programming,tcpclient,C#,Visual Studio,Sockets,Network Programming,Tcpclient,我正在尝试构建一个简单的客户机-服务器应用程序,在这个应用程序中,服务器不断侦听,客户机可以发送消息。我用它作为参考。但是,当我在client.exe的控制台上键入时,没有消息发送到服务器,程序挂起。我做错了什么。请给我一些建议 问候 这是我的服务器 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net; usi

我正在尝试构建一个简单的客户机-服务器应用程序,在这个应用程序中,服务器不断侦听,客户机可以发送消息。我用它作为参考。但是,当我在client.exe的控制台上键入时,没有消息发送到服务器,程序挂起。我做错了什么。请给我一些建议

问候

这是我的服务器

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);
                    }

                }
            }
        }
    }
}

我刚发完问题就想出来了……在开炮发问之前应该多花些时间……回复

发送消息后,您应该致电:


发送消息后,您应拨打:


我不知道你想用BufferedStream做什么,但是当你在networkStream上写东西时,它可以工作:

while (true)
{
    byte[] buffer = new byte[256];
    Console.WriteLine("Write Message");
    message = Console.ReadLine();
    var byteArray = msg2ByteArray(message, Encoding.ASCII);
    networkStream.Write(byteArray, 0, byteArray.Length);
}


我不知道你想用BufferedStream做什么,但是当你在networkStream上写东西时,它可以工作:

while (true)
{
    byte[] buffer = new byte[256];
    Console.WriteLine("Write Message");
    message = Console.ReadLine();
    var byteArray = msg2ByteArray(message, Encoding.ASCII);
    networkStream.Write(byteArray, 0, byteArray.Length);
}


你调试服务器代码了吗?它在哪里停止工作了?我发现了…缓冲区不清楚…我在发布问题后发现了…在开始发问之前应该花更多的时间…道歉你调试了你的服务器代码吗?它在哪里停止工作了?我发现了…缓冲区不清楚…我在发布问题后发现了…应该在跳枪和发布问题之前花更多的时间…道歉是的…谢谢…我在发布问题后也发现了…应该在跳枪和发布问题之前花更多的时间发布问题…道歉是的…谢谢…我在发布问题后也发现了…我应该在发问之前多花点时间发布问题…道歉谢谢你的回答。。我也会尝试使用网络流,谢谢你的回答。。我也会尝试使用网络流
if (!tryRead(networkStream, buffer, 0, 1))
{
    Console.WriteLine("No Message, process canceled.");
    break;
}
byte messageLen = buffer[0];
if (!tryRead(bufferedStream, buffer, 1, messageLen))
{
    Console.WriteLine("No Message, process canceled.");
    break;
}