小R科技-WIFI机器人网·机器人创意工作室

 找回密码
 立即注册
查看: 8868|回复: 4

socket 异步通信 回传数据

[复制链接]
发表于 2012-12-31 11:24:56 | 显示全部楼层 |阅读模式
本帖最后由 whble 于 2012-12-31 11:27 编辑

最近在做数据回传 老大说是采用的是socket 异步通信方式

就在最近这段时间去了解了 一下 在自己写的上位机上测试了 一下

发送数据是没有问题 但是接收数据有点不是很正常 求高手指点

首先申明
  1. SocketFunc socket;
  2. System.Action<string> ReceiveAction;
  3. System.Action AccessAction;
  4. public MainForm()
  5. {
  6. InitializeComponent();

  7. }
复制代码
然后mainform_load下注册进行数据回调
  1. private void MainForm_Load(object sender, EventArgs e)
  2. {
  3. GetIni();
  4. AccessAction = () =>
  5. {
  6. this.Invoke((MethodInvoker)delegate()
  7. {


  8. try
  9. {
  10. socket.Receive(ReceiveAction);
  11. }
  12. catch (Exception exp)
  13. {
  14. MessageBox.Show(exp.Message, "错误");
  15. }
  16. });

  17. };
  18. //异步接收消息回调
  19. ReceiveAction = msg =>
  20. {

  21. Temporary.Invoke((MethodInvoker)delegate()
  22. {

  23. Temporary.Text = msg;
  24. textBox1.Text = msg;
  25. });
  26. };
  27. NewClient();

  28. }
  29. void NewClient()
  30. {
  31. this.socket = new ClientSocket();
  32. try
  33. {
  34. this.socket.Access(ControlIp, this.AccessAction);
  35. }
  36. catch (Exception ecp)
  37. {
  38. MessageBox.Show(ecp.Message, "错误");
  39. }
  40. }
复制代码
SocketFunc这个类如下
  1. public abstract class SocketFunc
  2. {
  3. //建立连接后用这个Socket进行通信
  4. public Socket communicateSocket = null;

  5. //客户端建立连接的方式稍有不同, 子类会重载
  6. public abstract void Access(string IP, System.Action AccessAciton);

  7. public byte[] HexToByte(string hexString)
  8. {
  9. byte[] returnBytes = new byte[hexString.Length / 2];
  10. for (int i = 0; i < returnBytes.Length; i++)
  11. returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
  12. return returnBytes;
  13. }
  14. // 发送消息的函数
  15. public void Send(string message)
  16. {
  17. if (communicateSocket.Connected == false)
  18. {
  19. throw new Exception("还没有建立连接, 不能发送消息");
  20. }
  21. Byte[] msg = HexToByte(message);// Encoding.UTF8.GetBytes(message);
  22. communicateSocket.BeginSend(msg,0, msg.Length, SocketFlags.None,
  23. ar => {

  24. }, null);
  25. }

  26. //接受消息的函数
  27. public void Receive(System.Action<string> ReceiveAction)
  28. {
  29. //如果消息超过1024个字节, 收到的消息会分为(总字节长度/1024 +1)条显示
  30. Byte[] msg = new byte[64];
  31. //异步的接受消息
  32. communicateSocket.BeginReceive(msg, 0, msg.Length, SocketFlags.None,
  33. ar => {
  34. //对方断开连接时, 这里抛出Socket Exception
  35. //An existing connection was forcibly closed by the remote host
  36. communicateSocket.EndReceive(ar);
  37. ReceiveAction(Encoding.UTF8.GetString(msg).Trim('\0', ' '));
  38. // ReceiveAction = HexToByte(ReceiveAction);
  39. Receive(ReceiveAction);
  40. }, null);
  41. }
  42. }
  43. public class ClientSocket:SocketFunc
  44. {
  45. //客户端重载Access函数
  46. public override void Access(string IP, System.Action AccessAciton)
  47. {
  48. base.communicateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  49. base.communicateSocket.Bind(new IPEndPoint(IPAddress.Any, 2001));

  50. //服务器的IP和端口
  51. IPEndPoint serverIP;
  52. try
  53. {
  54. serverIP = new IPEndPoint(IPAddress.Parse(IP), 2001);
  55. }
  56. catch
  57. {
  58. throw new Exception(String.Format("{0}不是一个有效的IP地址!", IP));
  59. }

  60. //客户端只用来向指定的服务器发送信息,不需要绑定本机的IP和端口,不需要监听
  61. try
  62. {
  63. base.communicateSocket.BeginConnect(serverIP, ar =>
  64. {
  65. AccessAciton();
  66. }, null);
  67. }
  68. catch
  69. {
  70. throw new Exception(string.Format("尝试连接{0}不成功!", IP));
  71. }
  72. }
  73. }
复制代码
这样的话就可以进行数据的发送回传
只要在按钮事件中添加
socket.Send(CMD_GoBack);
就可以发送指令
而在异步接收消息回调,也就是在Mainform_load中把数据传回来
我这里是用
Temporary.Text = " "+msg;
textBox1.Text = msg;
来接收回来的

但是现在还有点小问题
如图
QQ截图20121231112202.png
QQ截图20121231111940.png
就是接收的数据都不显示第一个字符
请高手指点!!!
(⊙o⊙)…  水印挡住了 第一幅图串口发送123  上位机接收到23
第二幅图串口发12 上位机接收到2


回复

使用道具 举报

 楼主| 发表于 2012-12-31 11:28:49 | 显示全部楼层
比较纠结现在
回复 支持 反对

使用道具 举报

发表于 2013-4-18 14:24:32 | 显示全部楼层
后来是怎么解决的?
回复 支持 反对

使用道具 举报

发表于 2015-3-10 20:09:47 | 显示全部楼层
我的也是第一位收不到。。。。我是用的创建一个线程在后台不停接收,请问是怎么解决的?
回复 支持 反对

使用道具 举报

发表于 2015-4-3 16:26:44 | 显示全部楼层
最近在研究回传问题 留个qq 请教一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

新品特惠推荐上一条 /2 下一条

QQ|QQ技术咨询1|QQ技术咨询2|商务合作微信1:xiaorgeek001|商务合作微信2:XiaoRGEEK|诚聘英才|Archiver|手机版|小R科技-WIFI机器人网·机器人创意工作室 ( 粤ICP备15000788号-6 )

GMT+8, 2024-11-26 07:15 , Processed in 1.118411 second(s), 22 queries .

Powered by XiaoR GEEK X3.4

© 2014-2021 XiaoR GEEK

快速回复 返回顶部 返回列表