使用Go进行网络编程

4

我正在学习Go语言的网络编程。问题在于Go的文档过于简单。例如,我不知道何时使用net.DialTCP,何时使用TCPListener对象的AcceptTCP方法,它们之间有何区别?客户端如何与另一个客户端通信?而不是客户端与服务器。


2
请查看免费电子书"使用Go进行网络编程" - kostix
@kostix的电子书有很好的例子和非常详细的内容。我经常参考它。 - openwonk
2个回答

15

连接

在Go语言中,你可以使用net包中的Dial函数来连接远程计算机。

net.Dial("tcp","google.com:80")
net.Dial("udp","tracker.thepiratebay.org:6969")
net.Dial("ip","kremvax.su")
net.Dial("unix","/dev/log")

这会给你一个抽象的Conn对象,该对象表示刚刚建立的连接。 Conn实现了来自ioReadWriteCloser接口和其他几个函数。您可以使用此对象发送和接收数据。

监听

要进行监听,即打开端口,您可以使用net中的Listen函数。调用Listen将为您提供一个Listener对象。使用Accept接受传入的连接。 Accept返回另一个可以像上面那样使用的Conn对象。

ls, err := net.Listen("tcp",":1337")
if err != nil {
    // port probably blocked, insert error handling here
}

conn, err := ls.Accept()
if err != nil {
    // error handling
}

conn.Write("Hello, world!")

DialTCP和ListenTCP

这些函数给您更多对TCP连接的控制权。我建议仅在程序绝对需要时使用它们,因为DialListen更简单、更通用,并且可以轻松地让您将程序适应其他类型的网络连接。


2

net.DialTCP用于客户端创建与远程服务器的连接。

net.TCPListener.AcceptTCP用于服务器端接受新连接(可能由客户端使用net.DialTCP初始化)。请注意,侦听器可以逐个接受多个连接,从而同时为多个客户端提供服务(例如,每个在不同的goroutine中)。

根据您正在编写的是客户端还是服务器端应该分别使用net.DialTCPnet.TCPListener

也许您应该先了解一般的网络编程知识?然后我认为这些将更有意义。


那么如果一个客户端与另一个客户端进行通信(不是客户端-服务器模式),我可以使用net.DialTCP吗? - Pole_Zhang
1
@Pole_Zhang 当你使用网络时,你总是有一个侧面在听和一个侧面在连接。请查看我的回答以获取更多细节。 - fuz
@Pole_Zhang 我建议你在继续之前先阅读一份网络编程入门指南。 - fuz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接