所以我试图连接到我的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;
}
}
}
答案 0 :(得分:2)
我相信你需要你的代码看起来更像这样:
message += Environment.NewLine;
byte[] messageBytes = Encoding.ASCII.GetBytes(message);
networkStream.Write(messageBytes, 0, messageBytes.Length);
即。如果你没有使用换行符终止密码,服务器不知道你输入了密码(TCP不是面向消息的,所以你没有继续发送字节的事实绝不提供任何密码表示您已完成发送密码。
另请注意,您应该使用从byte[]
返回的GetBytes()
的实际长度作为数据的长度。对于ASCII,您可以从消息长度中轻松计算字节数,但使用实际字节数是一个很好的习惯。您可能并不总是在网络代码中处理ASCII。
最后,我建议您通过以下几种方式更改代码:
NetworkStream
包裹在StreamReader
和StreamWriter
个实例中,以便更轻松地发送和接收文本(不要忘记为阅读器设置编码为Encoding.ASCII
作家)。StreamReader.ReadLineAsync()
以便在没有显式线程的情况下异步完成读取。如果你没有切换到StreamReader
,你仍然应该在另一个线程中读取(异步或非异步),并且不要忘记你需要一直读取缓冲区,作为通过对Read()
的单次调用,可能会或可能不会收到服务器的响应。