net模块
TCP
客户端
1. //客户端拨号
2. pub fn dial_tcp(address string) ?TcpConn
1. //返回tcp连接
2. pub struct TcpConn { //实现io.Reader,io.Writer接口
3. pub:
4. sock TcpSocket //Socket对象
6. mut:
7. write_deadline time.Time
8. read_deadline time.Time
10. read_timeout time.Duration
11. write_timeout time.Duration
12. }
1. //tcp socket对象
2. struct TcpSocket {
3. pub:
4. handle int //socket的文件描述符
5. }
客户端连接例子:
1. module main
3. import net
4. import io
6. fn main() {
7. mut client_conn := net.dial_tcp('baidu.com:80')?
8. defer {
9. client_conn.close()
10. }
11. client_conn.write_str('GET /index.html HTTP/1.0\r\n\r\n') ?
12. client_conn.set_read_timeout(net.infinite_timeout)
13. result := io.read_all(client_conn) ?
14. println(result.bytestr())
15. }
服务端
1. //服务端启动监听
2. pub fn listen_tcp(port int) ?TcpListener
1. //返回监听器/服务器对象
2. pub struct TcpListener {
3. sock TcpSocket
5. mut:
6. accept_timeout time.Duration
7. accept_deadline time.Time
8. }
1. //监听器/服务器对象,调用accept以后,开始监听,返回TcpConn对象
2. pub fn (l TcpListener) accept() ?TcpConn
服务端连接例子:
1. module main
3. import net
4. import time
6. const (
7. server_port = 22334
8. )
10. fn setup() (net.TcpListener, net.TcpConn, net.TcpConn) {
11. listener := net.listen_tcp(server_port) or {
12. panic(err)
13. }
14. mut client := net.dial_tcp('127.0.0.1:$server_port') or {
15. panic(err)
16. }
17. client.set_read_timeout(3 * time.second)
18. client.set_write_timeout(3 * time.second)
19. mut server := listener.accept() or {
20. panic(err)
21. }
22. server.set_read_timeout(3 * time.second)
23. server.set_write_timeout(3 * time.second)
24. return listener, client, server
25. }
27. fn cleanup(listener &net.TcpListener, client &net.TcpConn, server &net.TcpConn) {
28. listener.close() or { }
29. client.close() or { }
30. server.close() or { }
31. }
33. fn main() {
34. listener, client, server := setup()
35. defer {
36. cleanup(listener, client, server)
37. }
38. message := 'Hello World'
39. //server
40. server.write_str(message) ?
41. println('message send: $message')
42. println('server socket: $server.sock.handle')
43. //client
44. mut buf := []byte{len: 1024}
45. nbytes := client.read(mut buf) ?
46. received := buf[0..nbytes].bytestr()
47. println('message received: $received')
48. println('client socket: $client.sock.handle')
49. }
UDP
实现思路基本跟TCP一致
客户端
1. //客户端拨号
2. pub fn dial_udp(laddr string, raddr string) ?UdpConn
1. //返回udp连接
2. pub struct UdpConn { //实现io.Reader,io.Writer接口
3. sock UdpSocket //Socket对象
5. mut:
6. write_deadline time.Time
7. read_deadline time.Time
9. read_timeout time.Duration
10. write_timeout time.Duration
11. }
1. //udp socket对象
2. struct UdpSocket {
3. handle int //socket的文件描述符
5. l Addr //local addr
6. r ?Addr //remote addr
7. }
服务端
1. //服务端启动监听,返回udp连接,udp不需要accept,直接开始
2. pub fn listen_udp(port int) ?UdpConn
服务端连接例子:
1. import net
2. import time
4. fn echo_server(_c net.UdpConn) {
5. mut c := _c
6. c.set_read_timeout(10 * time.second)
7. c.set_write_timeout(10 * time.second)
8. for { //无限循环监听,接收数据后,原样返回给客户端
9. mut buf := []byte{len: 100, init: 0}
10. read, addr := c.read(mut buf) or {
11. continue
12. }
13. c.write_to(addr, buf[..read]) or {
14. println('Server: connection dropped')
15. return
16. }
17. }
18. }
20. fn echo() ? {
21. //客户端拨号
22. mut c := net.dial_udp('127.0.0.1:40003', '127.0.0.1:40001') ?
23. defer {
24. c.close() or { }
25. }
26. c.set_read_timeout(10 * time.second)
27. c.set_write_timeout(10 * time.second)
28. data := 'Hello from vlib/net!'
29. c.write_str(data) ?
30. mut buf := []byte{len: 100, init: 0}
31. read, addr := c.read(mut buf) ?
32. assert read == data.len
33. println('Got address $addr')
34. for i := 0; i < read; i++ {
35. assert buf[i] == data[i]
36. }
37. println('Got "$buf.bytestr()"')
38. c.close() ?
39. return none
40. }
42. fn test_udp() {
43. l := net.listen_udp(40001) or { //服务端启动udp监听
44. println(err)
45. panic('')
46. }
47. go echo_server(l)
48. echo() or {
49. println(err)
50. }
51. l.close() or { }
52. }
54. fn main() {
55. test_udp()
56. }
websocket
目前websocket包放在试验性的x模块中,具体参考:x模块章节
附录:TCP网络连接示意图

