C# 通过tcp协议向硬件发送命令,networkstream read 读取返回信息时卡死。 150

我有一个机器是可以通过PUTTY的TCP端口连接进去的。只要输入IP和3002端口就可以进到命令行,输入命令。每当我输入一个错误的信息的时候,它都会feedback一个错... 我有一个机器是可以通过PUTTY的TCP端口连接进去的。
只要输入IP和3002端口就可以进到命令行,输入命令。

每当我输入一个错误的信息的时候,它都会feedback一个错误的command。

我现在界面之类的全都做好了,我也通过TcpClient 和 networkstream 成功用write 传了命令进去。

问题是现在我试图用stream.read()来获取它返回的信息,每次运行到read这个方法的时候都会卡死。
(在网上查过,说是read方法会等待feedback的信息,没等到就一直等待。可是这个返回的信息是在我一开始传命令进去的时候就立刻传回来了)。
代码如下。

try
{
//通过Nerworkstream 来获得连接得到的流数据,再进行feedback的读写。
NetworkStream stream = tcpClientA.GetStream();
//输入命令的方法
ASCIIEncoding encoder = new ASCIIEncoding();
byte[] buffer = encoder.GetBytes("(CLI 1 MicroTiles!)");
stream.Write(buffer, 0, buffer.Length);
stream.Flush();
/* ---------------------------以上为传命令-----------------------------*/

byte[] buffer2 = new byte[1024];
if (stream.CanRead) { MessageBox.Show("可读"); }

/* ---------------------------以下为卡死语句-----------------------------*/
int BL = stream.Read(buffer2, 0, buffer2.Length);
/* --------------------------——————-卡死语句-----————------------------------*/
string meg2 = Encoding.ASCII.GetString(buffer2, 0, buffer2.Length);
MessageBox.Show(meg2);

我想实现的就是,我传了一个命令过去,然后同时在我的程序的UI上显示传回来的命令行。
求大神解决。
完美决绝的话本账号分数全送

邮箱:oo44@vip.qq.com
展开
 我来答
百度网友cfe4d0f
2014-07-18 · TA获得超过1502个赞
知道小有建树答主
回答量:937
采纳率:100%
帮助的人:867万
展开全部

你使用的是telnet协议连接的设备

telnet并不是一个传输层协议 而是一个应用层协议 它是有一些格式上的规定的

比如 在交流前需要互相握手 会发送一些控制字符


你可以使用一些网络包监测工具(比如微软的network monitor)

或者自己创建一个模拟telnet服务器来研究这个包头:

void Main()
{
TcpListener server = new TcpListener(IPAddress.Loopback, 10010);
server.Start();

var client = server.AcceptSocket();
byte[] buffer = new byte[4096];
client.Send(new byte[1]);
while(true) {
int len = client.Receive(buffer);
if (len > 0)
Console.WriteLine("receive byte[{0}] {{{1}}}", len, string.Join(",", buffer.Take(len)));
else
break;
}

server.Stop();
}

在我的机器上 使用putty连接这个服务器 收到的第一个串为

receive byte[21] 
{255,251,31,255,251,32,255,251,24,255,251,39,255,253,1,255,251,3,255,253,3}

你可以查看一些资料来了解这个串的含义

http://tools.ietf.org/html/rfc1572

http://en.wikipedia.org/wiki/Telnet

或者看看这篇blog

http://xu.xue.yi.blog.163.com/blog/static/957382482010582594065/


当进行初始化配置后 才可以进行telnet命令发送阶段。


=======================

一句话。。你连接后少发了个包头_(:з」∠)_

匿名用户
2014-07-17
展开全部
我建议你增加一个线程专门用来读取

首先创建一个method
void read()
{
int BL = stream.Read(buffer2, 0, buffer2.Length);
string meg2 = Encoding.ASCII.GetString(buffer2, 0, buffer2.Length);
MessageBox.Show(meg2);
}
然后在原来的地方将卡死语句替换成

Thread thr = new Thread(read);
thr.Start();

当然了,buffer2 这个你要放到外面去定义,并且是public类型的
追问
void read(object st)
{
NetworkStream str1 = (NetworkStream)st;
int BL = str1.Read(buffer2, 0, buffer2.Length);
MessageBox.Show("2");
}
还是运行不到box2
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
异光录屏
2014-07-18 · TA获得超过158个赞
知道答主
回答量:122
采纳率:100%
帮助的人:36.1万
展开全部
            TcpClient client = new TcpClient();

            try

            {

                client.Connect(hostIp, port);

                NetworkStream ns = client.GetStream();

                ns.ReadTimeout = 3000;

                ns.WriteTimeout = 3000;

                byte[] bs = Encoding.Default.GetBytes(strInfo);

                ns.Write(bs, 0, bs.Length);

                byte[] bytes = new byte[1024];

                int length = ns.Read(bytes, 0, bytes.Length);

                string data = System.Text.Encoding.Default.GetString(bytes, 0, length);

                recData = data;

                client.Close();

                ns.Close();

            }

            catch (Exception ex)

            {

                client.Close();

                recData = ex.Message;

            }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
笨笨小香猪
2014-07-19 · TA获得超过129个赞
知道小有建树答主
回答量:268
采纳率:0%
帮助的人:149万
展开全部
一般这个多线程问题。使用多线程处理。你使用单线程,就一直UI无响应。等待方法结束。
子线程不能控制UI。要想控制UI。需要UI做操作,允许子线程操作UI。上面代码messbox。show(“222”)在线程里是弹不出的。直接报错。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
vidorlee
2014-07-18
知道答主
回答量:15
采纳率:0%
帮助的人:5.1万
展开全部
使用线程等待,增加超时处理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式