【问题标题】:Sending data from client to server works but Server to client does not将数据从客户端发送到服务器有效,但服务器到客户端不
【发布时间】:2012-05-30 20:32:04
【问题描述】:

我知道在网络流上执行Flush 操作无济于事,

这就是为什么我定义了StreamWriter,它将网络流作为构造函数参数,然后我试图向客户端发送信S,告诉他他的连接成功。

private StreamReader srReceiver;
private StreamWriter swSender;

// Occures when a new client is accepted
private void AcceptClient()
{
    srReceiver = new System.IO.StreamReader(TcpClient.GetStream());
    swSender = new System.IO.StreamWriter(TcpClient.GetStream());

    if (TcpClient.Available > 0)
    {
            char [] buff0 = new char[TcpClient.Available];

            // Read the account information from the client
            srReceiver.Read(buff0, 0, TcpClient.Available);

            sUserNumber = new string(buff0);

            // We got a response from the client
            if (!string.IsNullOrEmpty(sUserNumber))
            {
                OraEntities Ent = new OraEntities();

                var user = Ent.USERS.FirstOrDefault(usr => usr.USER_NUMBER == sUserNumber);

                // Check user validity
                if (user == null)
                {
                    Console.WriteLine("No user has this number: " + sUserNumber);
                    return;
                }
                else
                {
                    // Add the user to Active Users List and start listening for messages from him
                    Server.AddUser(this, sUserNumber);

                    // S means connected successfully
                    swSender.WriteLine("S");
                    swSender.Flush();

                    // Start the new tread that hosts the listener
                    thrReceive = new Thread(HandleInput);
                    thrReceive.Start();
                }
            }
            else
            {
                CloseConnection();
                return;
            }
    }
}

但是网络上没有发送任何内容(没有运行时异常)。

我错过了什么?

【问题讨论】:

  • 尝试在每一行之后添加一个 CRLF (\r\n):swSender.WriteLine("S\r\n");
  • @DarrenDavies 试过了,没用。
  • @Gavin 试过了,现在我得到了异常The operation is not allowed on non-connected sockets,因为当我使用using 时,发生了网络流的处理。

标签: c# sockets chat tcpclient


【解决方案1】:

这是我的测试代码,显示它有效:

服务器:

namespace SocketTestServer
{
    class Program
    {
        static void Main(string[] args)
        {
            TcpListener lis = new TcpListener(IPAddress.Parse("127.0.0.1"), 2509);
            lis.Start();
            lis.BeginAcceptTcpClient(new AsyncCallback(acceptClient), lis);
            Console.ReadKey();
        }

        private static void acceptClient(IAsyncResult ar)
        {
            TcpListener lis = ar.AsyncState as TcpListener;
            using (TcpClient cli = lis.EndAcceptTcpClient(ar))
            {
                using (NetworkStream ns = cli.GetStream())
                {
                    byte[] toSend = Encoding.ASCII.GetBytes("S\r\n");
                    ns.Write(toSend, 0, toSend.Length);
                    Console.WriteLine("Client connected");
                }
            }
        }
    }
}

客户:

namespace SocketTestClient
{
    class Program
    {
        static void Main(string[] args)
        {
            using (TcpClient client = new TcpClient())
            {
                client.Connect(IPAddress.Parse("127.0.0.1"), 2509);
                using (NetworkStream ns = client.GetStream())
                {
                    StreamReader sr = new StreamReader(ns);
                    Console.WriteLine(sr.ReadLine());
                    Console.ReadLine();
                }
            }

        }
    }
}

下面的截图显示工作正常:

【讨论】:

    【解决方案2】:

    我昨天遇到了类似的问题。下面是问题 Read data from socket, send response and close.

    这是最后一个答案,虽然我需要等待2天,但无法接受。

    希望这会有所帮助

    【讨论】:

    • 我的问题是'如果我关闭了网络流(以便可以发送数据),我该如何重新连接 TcpClient?'。因为,当我再次尝试使用 NetworkStream 时,我收到 InvalidOperationException 我无法访问已处置的对象。
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2020-08-17
    • 2021-01-26
    • 2022-01-12
    相关资源
    最近更新 更多