Google GO与C#之间的TCP通信案例

我本人也才接触GO两个多月的历史,看了几本英文教程,读了些Github上面的源码,但已经被GO的语言的简洁和强大的并发能力所吸收,也打算继续深入的学习,并应用到自己的工作之中。GO语言目前主要适用于服务端的开发,我参考了一些网络上的教程,做了一些TCP服务端的小练习,其中服务端用GO语言开发,客户端采用C#。具体参考如下的代码:https://github.com/yfl8910/gotcpserver

效果图如下:

服务端代码:


  1. package main
  2. import (
  3. "net"
  4. "fmt"
  5. )
  6. var ( maxRead = 25
  7. msgStop = []byte("cmdStop")
  8. msgStart = []byte("cmdContinue")
  9. )
  10. func main() {
  11. hostAndPort := "localhost:54321"
  12. listener := initServer(hostAndPort)
  13. for {
  14. conn, err := listener.Accept()
  15. checkError(err, "Accept: ")
  16. go connectionHandler(conn)
  17. }
  18. }
  19. func initServer(hostAndPort string) *net.TCPListener {
  20. serverAddr, err := net.ResolveTCPAddr("tcp", hostAndPort)
  21. checkError(err, "Resolving address:port failed: '" + hostAndPort + "'")
  22. //listener, err := net.ListenTCP("tcp", serverAddr)
  23. listener, err := net.ListenTCP("tcp", serverAddr)
  24. checkError(err, "ListenTCP: ")
  25. println("Listening to: ", listener.Addr().String())
  26. return listener
  27. }
  28. func connectionHandler(conn net.Conn) {
  29. connFrom := conn.RemoteAddr().String()
  30. println("Connection from: ", connFrom)
  31. talktoclients(conn)
  32. for {
  33. var ibuf []byte = make([]byte, maxRead + 1)
  34. length, err := conn.Read(ibuf[0:maxRead])
  35. ibuf[maxRead] = 0 // to prevent overflow
  36. switch err {
  37. case nil:
  38. handleMsg(length, err, ibuf)
  39. default:
  40. goto DISCONNECT
  41. }
  42. }
  43. DISCONNECT:
  44. err := conn.Close()
  45. println("Closed connection:" , connFrom)
  46. checkError(err, "Close:" )
  47. }
  48. func talktoclients(to net.Conn) {
  49. wrote, err := to.Write(msgStart)
  50. checkError(err, "Write: wrote " + string(wrote) + " bytes.")
  51. }
  52. func handleMsg(length int, err error, msg []byte) {
  53. if length > 0 {
  54. for i := 0; ; i++ {
  55. if msg[i] == 0 {
  56. break
  57. }
  58. }
  59. fmt.Printf("Received data: %v", string(msg[0:length]))
  60. fmt.Println(" length:",length)
  61. }
  62. }
  63. func checkError(error error, info string) {
  64. if error != nil {
  65. panic("ERROR: " + info + " " + error.Error()) // terminate program
  66. }
  67. }

客户端代码:


  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.Net;
  9. using System.Net.Sockets;
  10. using System.Threading;
  11. namespace TcpClient
  12. {
  13. public partial class Form1 : Form
  14. {
  15. private IPAddress _ipServer; //服务器IP
  16. private IPEndPoint _myServer; //服务器终端
  17. private Socket _connectSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接套接字
  18. private int _port; //端口
  19. private Thread receiveThread = null;
  20. public Form1()
  21. {
  22. InitializeComponent();
  23. }
  24. private bool ValidateInfo() //检验所填信息是否合法
  25. {
  26. if (!IPAddress.TryParse(txtbxIP.Text, out _ipServer))
  27. {
  28. MessageBox.Show("IP地址不合法!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  29. return false;
  30. }
  31. if (!int.TryParse(txtbxPortNum.Text, out _port))
  32. {
  33. MessageBox.Show("端口号不合法!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  34. return false;
  35. }
  36. else
  37. {
  38. if (_port < 1024 || _port > 65535)
  39. {
  40. MessageBox.Show("端口号不合法!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  41. return false;
  42. }
  43. }
  44. return true;
  45. }
  46. private bool ConnectServer() //连接服务器
  47. {
  48. try
  49. {
  50. _connectSocket.Connect(_myServer);
  51. _connectSocket.Send(System.Text.Encoding.UTF8.GetBytes(txtbxUser.Text.ToString()));
  52. return true;
  53. }
  54. catch
  55. {
  56. MessageBox.Show("服务器连接异常", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  57. return false;
  58. }
  59. }
  60. private void button1_Click(object sender, EventArgs e)
  61. {
  62. try
  63. {
  64. _connectSocket.Send(System.Text.Encoding.UTF8.GetBytes(comboBox1.Text.ToString()));
  65. }
  66. catch
  67. {
  68. MessageBox.Show("服务器连接异常", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  69. }
  70. }
  71. private void button3_Click(object sender, EventArgs e)
  72. {
  73. if (!ValidateInfo())
  74. {
  75. return;
  76. }
  77. _myServer = new IPEndPoint(_ipServer, _port);
  78. if (ConnectServer() == true)
  79. {
  80. MessageBox.Show("连接成功!");
  81. }
  82. }
  83. private void button2_Click(object sender, EventArgs e)
  84. {
  85. this.Close();
  86. }
  87. private void button4_Click(object sender, EventArgs e)
  88. {
  89. for (int i = 0; i < 1000; i++) {
  90. Socket _connectSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  91. _connectSocket.Connect(_myServer);
  92. _connectSocket.Send(System.Text.Encoding.UTF8.GetBytes(comboBox1.Text.ToString()+i));
  93. Thread.Sleep(2);
  94. }
  95. }
  96. }
  97. }
时间: 2025-01-05 01:57:21

Google GO与C#之间的TCP通信案例的相关文章

.NET可复用TCP通信层之消息分派器组件

上一篇主要讲到了Tcp通信层中的核心组件――Tcp组件的实现,Tcp组件是整个通信层的消息驱动源,甚至,可以将Tcp组件看作是我们整个服务器系统的消息驱动源,消息处理过程从这里引发.类似的消息驱动源还有发布的WebService接口.Remoting接口等.今天我们需要关注的是Tcp通信层中的"中央"组件――消息分派器组件ITcpReqStreamDispatcher,大家已经从前文的组件关系图中看到了消息分派器的大致位置和作用了,它是Tcp通信组件和消息处理器之间的"桥梁&

.NET下可复用的TCP通信层实现之TCP组件

    2006年已经来临,回首刚走过的2005,心中感慨万千.在人生和生活的目标上,有了清晰明确的定位,终于知道了自己喜欢什么样的生活,喜欢什么样的生活方式:在技术上,成熟了不少,眼界也开阔的不少,从面向对象到组件.从.Net到J2EE.从微软到开源,颇有收获.特别值得一提的是,认识了Rod Johnson这个大牛人,也终于在自己的项目中正式使用Spring.net框架来开发了,这确实是一个优秀的框架.而在已经到来的2006年,我有一个主要目标就是B/S应用开发,来填补自己在企业级开发上的另一

socket-数据采集器与数据中心之间采用TCP连接方式进行交互问题

问题描述 数据采集器与数据中心之间采用TCP连接方式进行交互问题 各位,麻烦会的哥们指导一下.我的qq:574148104 刚接触各方面知识,现在搞不懂怎么将xml数据流通过socket进行封包(有包头的规则).虚心向学,有相关指导性书籍都可以推荐的.可以的话,帮忙给出一段代码参考下(数据封包方面的)谢谢~! 1概述 数据采集器与数据中心之间采用TCP连接方式进行交互,服务器地址:58.33.55.30,端口为1020.有效数据内容为经过AES(128位)加密后的XML数据. 本文档描述了通讯协

java tcp通信-JAVA TCP通信,客户端给服务器发送java对象时报错

问题描述 JAVA TCP通信,客户端给服务器发送java对象时报错 我在做JAVA TCP 编程时,我想实现客户端A与客户端B之间通过服务器C来通信,但是我通过客户端A给服务器发送消息时,我传送的是一个java对象MsgPackage类对象,我通过ObjectOutputStream.writeObject来传送,但是服务器去读取这个对象时报错了,没有能正确读取到客户端发送过来的对象,请各位大神指教一下.错误的消息是这样: java.lang.ClassNotFoundException: c

.NET平台下可复用的Tcp通信层实现(续)

     上一篇主要讲到了Tcp通信层中的核心组件――Tcp组件的实现,Tcp组件是整个通信层的消息驱动源,甚至,可以将Tcp组件看作是我们整个服务器系统的消息驱动源,消息处理过程从这里引发.类似的消息驱动源还有发布的WebService接口.Remoting接口等.今天我们需要关注的是Tcp通信层中的"中央"组件――消息分派器组件ITcpReqStreamDispatcher,大家已经从前文的组件关系图中看到了消息分派器的大致位置和作用了,它是Tcp通信组件和消息处理器之间的&quo

.NET平台下可复用的Tcp通信层实现

    2006年已经来临,回首刚走过的2005,心中感慨万千.在人生和生活的目标上,有了清晰明确的定位,终于知道了自己喜欢什么样的生活,喜欢什么样的生活方式:在技术上,成熟了不少,眼界也开阔的不少,从面向对象到组件.从.Net到J2EE.从微软到开源,颇有收获.特别值得一提的是,认识了Rod Johnson这个大牛人,也终于在自己的项目中正式使用Spring.net框架来开发了,这确实是一个优秀的框架.而在已经到来的2006年,我有一个主要目标就是B/S应用开发,来填补自己在企业级开发上的另一

连接-TCP通信的数据格式该怎么定义???

问题描述 TCP通信的数据格式该怎么定义??? 请问TCP长连接该怎么定义什么样的数据格式才不会粘包呢?大牛们请指教!谢谢! 解决方案 粘包没关系,只要能正确拆包就行.比如约定: 发送,先发4个字节表述数据的长度,再发数据. 接受,先接受4个取得长度,再按长度读取数据.剩下的就是下个包的. 解决方案二: 自己定义包的结构,里面定义字段定义包的长度等,收到数据后,根据协议解析数据包等

发送-delphi tcpserver 和tcpclient之间怎么互相通信

问题描述 delphi tcpserver 和tcpclient之间怎么互相通信 只写出了tcpclient向tcpserver发送消息 ,请大神 指导一下tcpserver 怎么向tcpclient 发送消息 解决方案 从服务器返回数据 如果需要从服务器返回数据的话,只需要在OnAccept中调用ClientSocket.Sendln方法即可.客户端需要做的就是在执行完TcpClient1.Sendln后,直接调用 TcpClient1.Receiveln即可.该方法会等待服务器传回的信息.当

android tcp通信如何做到心跳管理

问题描述 android tcp通信如何做到心跳管理 我想实现一个TCP通信:点击登陆后将用户名和密码打包(包为bytes)发送给服务器后,服务器发送包给客户端.登陆成功后还需要做两个动作:1.客户端没隔30S给客户端发送一次bytes :2.当服务器有数据过来时,客户端自动接收数据.现在的问题是我是做两个线程还是做一个线程呢.我做了两个线程,一个接一个发,但是我怎么实现第二点呢.哪位大神可以给我点详细的指点么.本人新手,菜鸟一个.跪求大神指点. 解决方案 获取输入流,用read方法返回值判断是