【问题标题】:Connecting to telnet server and send/recieve data连接到 telnet 服务器并发送/接收数据
【发布时间】:2015-03-31 22:03:13
【问题描述】:

所以我正在尝试连接到我的 telnet 服务器,它可以工作。它从服务器接收第一批数据,要求我们输入密码进行连接。但是当我输入密码时,它什么也不做,收到的任何东西都不会打印到我的控制台上。

输出示例如下:

Connected to server.
Please enter password:
Response: MYPASSHERE
__BLANK RESPONSE FROM SERVER__
Response:

我目前正在使用此代码

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

namespace _7DaysServerManager
{
    public class ServerSocket
    {
        private TcpClient client;
        private Thread readWriteThread;
        private NetworkStream networkStream;
        private string password;

        public ServerSocket(string ip, int port)
        {
            try
            {
                client = new TcpClient(ip, port);
                Console.WriteLine("Connected to server.");
            } 
            catch (SocketException)
            {
                Console.WriteLine("Failed to connect to server");
                return;
            }

            //Assign networkstream
            networkStream = client.GetStream();

            //start socket read/write thread
            readWriteThread = new Thread(readWrite);
            readWriteThread.Start();
        }

        private void readWrite()
        {
            string command, recieved;

            //Read first thing givent o us
            recieved = read();
            Console.WriteLine(recieved);

            //Set up connection loop
            while (true) 
            {
                Console.Write("Response: ");
                command = Console.ReadLine();

                if (command == "exit")
                    break;

                write(command);
                recieved = read();

                Console.WriteLine(recieved);
            }

            Console.WriteLine("Disconnected from server");
            networkStream.Close();
            client.Close();
        }

        public void write(string message)
        {
            networkStream.Write(Encoding.ASCII.GetBytes(message), 0, message.Length);
            networkStream.Flush();
        }

        public string read()
        {
            byte[] data = new byte[1024];
            string recieved = "";

            int size = networkStream.Read(data, 0, data.Length);
            recieved = Encoding.ASCII.GetString(data, 0, size);

            return recieved;
        }
    }
}

【问题讨论】:

    标签: c# telnet tcpclient


    【解决方案1】:

    我相信你需要你的代码看起来更像这样:

    message += Environment.NewLine;
    byte[] messageBytes = Encoding.ASCII.GetBytes(message);
    networkStream.Write(messageBytes, 0, messageBytes.Length);
    

    即如果您不使用换行符终止密码,则服务器不知道您已完成输入密码(TCP 不是面向消息的,因此您没有继续发送字节的事实绝不提供任何指示您已完成发送密码)。

    还要注意,您应该使用从GetBytes() 返回的byte[] 的实际长度作为数据的长度。对于 ASCII,确实可以从消息长度中简单地计算字节数,但是使用 actual 字节数是一个很好的习惯。您可能并不总是在网络代码中处理 ASCII。

    最后,我建议您通过以下几种方式更改代码:

    1. NetworkStream 包装在StreamReaderStreamWriter 实例中,以便更轻松地发送和接收文本(不要忘记将编码设置为Encoding.ASCII 以供阅读器和作者使用)。
    2. 在不同的线程中读取和写入。或者更好的是,使用StreamReader.ReadLineAsync() 以便在没有显式线程的情况下异步完成读取。

    如果你不切换到StreamReader,你仍然应该在不同的线程中读取(异步或非异步),并且不要忘记你需要一直从缓冲区读取,作为来自的响应对Read() 的一次调用可能会或可能不会收到服务器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多