【问题标题】:C# TCP Client to Server messagesC# TCP 客户端到服务器消息
【发布时间】:2014-09-08 12:17:55
【问题描述】:

我编写了一个在我的桌面上运行的 C# TCP 服务器,而我在我的 windows phone 上运行了一个客户端。它工作得很好,客户端可以连接到服务器。但我正在努力做到这一点,以便服务器可以接收来自客户端的消息。当我运行它时,服务器只会在我发送字符串时收到一个数字。 这是我的服务器代码。

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”。任何人都可以解释为什么会发生这种情况并可能提供解决问题的方法吗?

【问题讨论】:

标签: c# networking tcp client


【解决方案1】:

当您执行clientStreamReader.Read() 时,您只是从流中读取一个字符作为整数。检查文档here。 这就是为什么你只得到一个数字。

您需要为每条消息添加一个分隔符以了解其结束位置,经常使用\r\n。 这里有一个示例,让您的服务器接收您的 hello! 字符串:

在您的客户端代码中

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

在你的服务器代码中

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

【讨论】:

  • 谢谢!哈哈非常感谢。好东西。为您提供 10000 个互联网积分。
  • 出于某种原因,我必须等待几分钟才能将其标记为已接受的答案,但值得等待。
  • 我刚刚注意到我只能发送一条消息。如果我尝试两次调用 SendToServer 方法,则服务器不会收到第二条消息。知道为什么会这样吗?
猜你喜欢
  • 2020-08-07
  • 2018-06-05
  • 2013-04-29
  • 2019-10-01
  • 2019-02-26
  • 2017-09-02
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多