为什么用telnet只能发送一个字符

takpod 2016-01-17 11:14:43
以下代码作为服务器,当用telnet来连接时,只按下一个字符(不用按回车)就发送了,而且以后再也发不了了,
请问是telnet设置的问题还是代码的问题?

            
TcpClient client = null;
NetworkStream stream = null;
byte[] buffer = null;
string receiveString = null;
IPAddress localIP = IPAddress.Parse("127.0.0.1");
int localPort = 23;
TcpListener listener = new TcpListener(localIP, localPort);//用本地IP和端口实例化Listener
listener.Start();//开始监听
while (true)
{
client = listener.AcceptTcpClient();//接受一个Client
buffer = new byte[client.ReceiveBufferSize];
stream = client.GetStream();//获取网络流
stream.Read(buffer, 0, buffer.Length);//读取网络流中的数据
receiveString = Encoding.Default.GetString(buffer).Trim('\0');//转换成字符串
Console.WriteLine(receiveString);
}
stream.Close();//这个没用上
client.Close();//这个没用上

...全文
863 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
takpod 2016-01-19
  • 打赏
  • 举报
回复
引用 10 楼 jiangsheng 的回复:
怎么用的是Encoding.Default.GetString? 你不知道服务器发的是什么编码吗?
这个不重要
Anymore 2016-01-18
  • 打赏
  • 举报
回复
首先还是明白监听原理、处理流程好点 C#使用TcpClient实现telnet功能 http://blog.csdn.net/foart/article/details/7010217
蒋晟 2016-01-18
  • 打赏
  • 举报
回复
怎么用的是Encoding.Default.GetString? 你不知道服务器发的是什么编码吗?
江南小鱼 2016-01-17
  • 打赏
  • 举报
回复
6#,撸主这代码明显不是支撑成千上万客户端连接的服务器端代码 我觉得仅仅是一个学习网络编程的一个小例子嘛 错误太多,罄竹难书,言重了
  • 打赏
  • 举报
回复
在一个真正的服务器软件中,服务器端要同时接入成千上万个客户端连接,那么它就要有成千上万个 buffer(而不是一个)。你的程序为每一个 Accept 都用同一个 buffer 变量来引用其读缓冲区,这也是逻辑错误。 总之,错误太多了,罄竹难书啊。
  • 打赏
  • 举报
回复
如果你自己不通过调试而得知服务器端停在哪里,仅仅静态地死记硬背别人的答案,这是一个很不好的学习习惯。
xuzuning 2016-01-17
  • 打赏
  • 举报
回复
你没有按其协议进行会话
  • 打赏
  • 举报
回复
你为什么不调试呢?如果你单步跟踪流程就会发现,你的服务器端阻塞在 listener.AcceptTcpClient 上,无法执行 Stream.Read。 另外,你的代码有基本的知识问题。 stream.Read 返回的是实际读取到的字节数,例如返回1。它表示 buffer 中有效字节有多少。例如前一次buffer中有100个有效字节,下一次 Read 如果返回99,那么你就不能把第100个字节也算在这次 Read 中的。
takpod 2016-01-17
  • 打赏
  • 举报
回复
引用 1 楼 lovelj2012 的回复:
单独看这段代码的话,看不出有什么问题。
namespace TcpCol
{
    class Program
    {
        static void Main(string[] args)
        {

            TcpClient client = null;
            NetworkStream stream = null;
            byte[] buffer = null;
            string receiveString = null;

            IPAddress localIP = IPAddress.Parse("127.0.0.1");
            int localPort = 23;
            TcpListener listener = new TcpListener(localIP, localPort);//用本地IP和端口实例化Listener  
            listener.Start();//开始监听  
            while (true)
            {
                client = listener.AcceptTcpClient();//接受一个Client 
                buffer = new byte[client.ReceiveBufferSize];
                stream = client.GetStream();//获取网络流  
                stream.Read(buffer, 0, buffer.Length);//读取网络流中的数据  
                receiveString = Encoding.Default.GetString(buffer).Trim('\0');//转换成字符串
                Console.WriteLine(receiveString);
            }
            stream.Close();//这个没用上
            client.Close();//这个没用上
            
             
        }
    }
}
江南小鱼 2016-01-17
  • 打赏
  • 举报
回复
单独看这段代码的话,看不出有什么问题。
takpod 2016-01-17
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:
你没有按其协议进行会话
那么其会话协议是怎么样的呢?网上有太多例子,但我不知哪一个是对的,希望能推荐一个用tcpclient写的而不是socket 另外想问一下 阻塞在 listener.AcceptTcpClient 上和阻塞在 stream.Read(buffer, 0, buffer.Length);上是什么意思?
takpod 2016-01-17
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
在一个真正的服务器软件中,服务器端要同时接入成千上万个客户端连接,那么它就要有成千上万个 buffer(而不是一个)。你的程序为每一个 Accept 都用同一个 buffer 变量来引用其读缓冲区,这也是逻辑错误。 总之,错误太多了,罄竹难书啊。
引用 7 楼 lovelj2012 的回复:
6#,撸主这代码明显不是支撑成千上万客户端连接的服务器端代码 我觉得仅仅是一个学习网络编程的一个小例子嘛 错误太多,罄竹难书,言重了
谢谢你们的热心指导,这的确是一个网上抄来的例子,目的是为了学习一下网络通信知识

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧