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

时间:2014-07-17 14:46:32

标签: c# networking tcp client

我写了一个在我的桌面上运行的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!"); 当我运行服务器并运行客户端时,服务器会检测到客户端,但会收到&#34; 104&#34;而不是&#34;你好&#34;。任何人都可以解释为什么会发生这种情况并提供问题的解决方案吗?

1 个答案:

答案 0 :(得分:2)

当你正在做clientStreamReader.Read()时,你只是从流中读取一个字符作为int。查看文档here。 这就是为什么你只得到一个数字。

您需要为每条消息指定一个分隔符以了解其结束位置 ,经常使用\r\n。 这是一个让您的服务器收到hello!字符串:

的示例

在您的客户代码

client.SendToServer("hello!" + "\r\n");

在您的服务器代码

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