标题:发送接收问题!
只看楼主
luochen601
Rank: 1
等 级:新手上路
帖 子:31
专家分:0
注 册:2006-10-23
 问题点数:0 回复次数:2 
发送接收问题!
做了一个与三菱PLC通讯的程序,使用TCP协议,我是用流来发送和接收的。通讯的具体规则如下:当PLC发送一个数据给计算机后,计算机必须发回一个 “响应”(十六进制的E0),然后PLC才接着发送下一个数据;当计算机给PLC发送数据,PLC接收完后会自动给计算机发回一个“响应”(十六进制的 00);我现在是写的程序是同步接收和发送,用了一个线程负责接收,可以顺利接收到从PLC发过来的数据;用一个button_click事件来发送数 据,但却不能实现;请问这是什么原因?一定要用异步发送和接收吗?同步和异步到底有什么区别?
private void Form1_Load(object sender, EventArgs e)
{
int port = 8000;
listener = new TcpListener(port);
listener.Start();
threadlisten = new Thread(new ThreadStart(startlisten));
threadlisten.Start();
}
private void startlisten()
{
while (true)
{
client = listener.AcceptTcpClient();
threadreceive = new Thread(new ThreadStart(receive));
threadreceive.Start();
}
}
public void receive()
{
while (true)
{
ns=client .GetStream ();
byte[] rec = new byte[20];
int i = ns.Read(rec, 0, rec.Length);
if (i != 0)
{
if (rec[0] == 0x60)
{
//数据处理过程
}
ns.Write(msg, 0, msg.Length);
}
}
}
private void button2_Click(object sender, EventArgs e)
{
byte[] snd = { 0x60, 0x00, 0x00, 0x01, 0x00,0x0F };
client.streamSend(snd);
ns.Write(snd, 0, snd.Length);
ns.Flush();
}
这是我编的程序,可以正常接收,但按下button2既不能发送连接收也不行了,然后过了一会儿显示出错,强制关闭了连接,麻烦大家看看这个程序到底出了什么问题?应该怎样修改?
搜索更多相关主题的帖子: PLC 计算机 三菱 数据 十六进制 
2006-11-06 18:12
月夜枫华
Rank: 4
等 级:贵宾
威 望:12
帖 子:437
专家分:42
注 册:2006-1-2
得分:0 
byte[] snd = new send{ 0x60, 0x00, 0x00, 0x01, 0x00,0x0F };

2006-11-07 09:52
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
我也碰到过类似问题。
如果你有界面的话,比如点击Button开始监听,那么界面会停滞。因为一般都是单线程的program。在Server没有收到连接的时候,它是会一直不停的检测的吧。这个时候如果没有收到Client的Connect,program是没有反映的,其它上面的什么按钮都无法用。界面就固定住了。

这就是同步的弊端。 你可以开两个exe,用你的Client去连接似乎死掉的Server,如果program没有错的话,界面的凝滞就会消失,进行下一步的通讯。
但是同步比较方便。

异步的话,就是多线程的program。主线程控制界面,Server新开一个线程去Listen,即使没有connect过来也不会死掉。因为主界面的主线程一直在运行。
处理起来会麻烦一些。



2006-11-07 11:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-101128-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.818455 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved