C# TCP客户端和服务器消息

3

我编写了一个运行在我的台式机上的C# TCP服务器,同时我在我的Windows手机上运行客户端。它很好用,客户端可以连接到服务器。但是我试图让服务器能够接收来自客户端的消息。当我运行时,服务器只会接收到数字而不是字符串。

这是我的服务器代码。

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

namespace TCPServer
{
    class Server
    {
        private TcpListener tcpListener;
        private Thread listenThread;

        public Server()
        {
            this.tcpListener = new TcpListener(IPAddress.Any, 80);
            this.listenThread = new Thread(new ThreadStart(ListenForClients));
            this.listenThread.Start();
        }

        private void ListenForClients()
        {
            this.tcpListener.Start();

            while (true)
            {
                TcpClient client = this.tcpListener.AcceptTcpClient();
                Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                clientThread.Start(client);
            }
        }

        private void HandleClientComm(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream clientStream = tcpClient.GetStream();
            Console.WriteLine("Got connection");
            StreamReader clientStreamReader = new StreamReader(clientStream);
            Console.WriteLine(clientStreamReader.Read());
        }

    }
}

以下是客户端代码:

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

namespace NetworkingTesting
{
    class Client
    {
        Socket socket = null;
        static ManualResetEvent clientDone = new ManualResetEvent(false);
        const int TIMEOUT_MILLISECONDS = 5000;
        const int MAX_BUFFER_SIZE = 2048;
        DnsEndPoint hostEntry;

        public string Connect(string hostName, int portNumber)
        {
            string result = string.Empty;
            hostEntry = new DnsEndPoint(hostName, portNumber);
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.RemoteEndPoint = hostEntry;

            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
            {
                result = e.SocketError.ToString();
                clientDone.Set();
            });

            clientDone.Reset();
            socket.ConnectAsync(socketEventArg);
            clientDone.WaitOne(TIMEOUT_MILLISECONDS);

            return result;
        }

        public void SendToServer(string message)
        {
            SocketAsyncEventArgs asyncEvent = new SocketAsyncEventArgs { RemoteEndPoint = hostEntry};

            Byte[] buffer = Encoding.UTF8.GetBytes(message + Environment.NewLine);
            asyncEvent.SetBuffer(buffer, 0, buffer.Length);

            socket.SendAsync(asyncEvent);
        }
    }
}

在我的主客户端类中,我有:client.SendToServer("hello!");当我运行服务器并运行客户端时,服务器检测到客户端,但接收到的是“104”,而不是“Hello”。有人可以解释一下为什么会出现这种情况,也许可以提供解决问题的方法吗?

StreamReader.Read() 返回一个 int - Daniel Kelley
1个回答

2
当您执行clientStreamReader.Read()时,您只是从流中读取一个字符作为整数。在此处检查文档here
这就是为什么您只得到一个数字的原因。 您需要使用分隔符来确定每个消息的结束位置,通常使用\r\n。下面是一个示例,用于使您的服务器接收hello!字符串:
在您的客户端代码中:
client.SendToServer("hello!" + "\r\n");

在您的服务器代码中

Console.WriteLine(clientStreamReader.ReadLine()); // Which should print hello!

谢谢!哈哈,非常感谢。太棒了。给你10000个网络积分。 - Aido
我必须等待几分钟,因为某种原因才能将其标记为被接受的答案,但值得等待。 - Aido
我刚刚注意到我只能发送一条消息。如果我尝试两次调用SendToServer方法,服务器就无法接收第二条消息。有任何想法为什么会发生这种情况吗? - Aido

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接