Go语言之Go语言网络编程

GO 语言网络编程

Go 语言Socket编程

TCP Socket

Go语言的 net 包中有一个 TCPConn 类型,可以用来建立 TCP 客户端和 TCP 服务器端间的通信通道,TCPConn 类型里有两个主要的函数:

func (c *TCPConn) Write(b []byte) (n int, err os.Error)
func (c *TCPConn) Read(b []byte) (n int, err os.Error)

CPConn 可以用在客户端和服务器端来读写数据。

还有我们需要知道一个 TCPAddr 类型,它表示一个 TCP 的地址信息,其定义如下:

type TCPAddr struct {
    IP IP
    Port int
}

在Go语言中通过 ResolveTCPAddr 可以获取一个 TCPAddr 类型,ResolveTCPAddr 的函数定义如下:

func ResolveTCPAddr(net, addr string) (*TCPAddr, os.Error)

参数说明如下:

  • net 参数是 "tcp4"、"tcp6"、"tcp" 中的任意一个,分别表示 TCP(IPv4-only),TCP(IPv6-only) 或者 TCP(IPv4,IPv6) 中的任意一个;
  • addr 表示域名或者 IP 地址,例如 "c.biancheng.net:80" 或者 "127.0.0.1:22"。

TCP server

我们可以通过 net 包来创建一个服务器端程序,在服务器端我们需要绑定服务到指定的非激活端口,并监听此端口,当有客户端请求到达的时候可以接收到来自客户端连接的请求。

net 包中有相应功能的函数,函数定义如下

func ListenTCP(net string, laddr *TCPAddr) (l *TCPListener, err os.Error)
func (l *TCPListener) Accept() (c Conn, err os.Error)

ListenTCP 函数会在本地 TCP 地址 laddr 上声明并返回一个 *TCPListener,net 参数必须是 "tcp"、"tcp4"、"tcp6",如果 laddr 的端口字段为 0,函数将选择一个当前可用的端口,可以用 Listener 的 Addr 方法获得该端口。

案列:

server

package main

import (
	"fmt"
	"net"
)

func echo(c *net.TCPConn) {
	defer c.Close()
	for {
		fmt.Printf("服务器再等待客户端%s发送信息\n", c.RemoteAddr().String())
		buf := make([]byte, 1024)
		n, err := c.Read(buf)
		if err != nil {
			fmt.Printf("读取数据失败,%v\n", err)
			return
		}
		fmt.Printf("读取字节数为%d\n", n)
		fmt.Printf(string(buf[:n]))
	}
}

// Server 表示服务器端函数
func Server() {
	address := net.TCPAddr{
		IP:   net.ParseIP("127.0.0.1"),
		Port: 8000,
	}
	listener, err := net.ListenTCP("tcp4", &address)
	if err != nil {
		fmt.Println("错误")
	}
	defer listener.Close()
	for {
		conn, err := listener.AcceptTCP()
		if err != nil {
			fmt.Println("报错")
		}
		fmt.Printf("客户端ip地址为:%v ", conn.RemoteAddr().String())
		go echo(conn)
	}

}

func main() {
	Server()
}

client

package main

import (
	"bufio"
	"fmt"
	"log"
	"net"
	"os"
	"strings"
)

// Client 表示客户端函数
func Client() {
	conn, err := net.Dial("tcp4", "127.0.0.1:8000")
	if err != nil {
		fmt.Printf("错误  %v\n", err)
	}
	reader := bufio.NewReader(os.Stdin) //os.Stdin 代表标准输入[终端]
	for {
		line, err := reader.ReadString(‘\n‘)
		if err != nil {
			fmt.Println("读取终端数据错误")
			return
		}
		line = strings.Trim(line, "\r\n")
		if line == "exit" {
			fmt.Println("用户退出客户端")
			break
		}
		conent, err := conn.Write([]byte(line + "\n"))
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("客户端发送了 %d 字节的数据到服务端\n", conent)
	}
}

func main() {
	Client()
}

原文地址:https://www.cnblogs.com/heych/p/12579623.html

时间: 2024-10-11 12:46:38

Go语言之Go语言网络编程的相关文章

好消息:《Java网络编程核心技术详解》出版

2019年5月从美国回到上海,由于一切都不安定,先在旅馆里宅了4个多月,写完<精通JPA与Hibernate:Java对象持久化技术详解>,就开始写这本书.现在,正是新冠病毒疫情还没结束之际,本书克服种种困难,如期和读者见面了. 我们一不小心,就会被一种潜在的观念暗示:只要忙过了这一阵,将来就能过上高枕无忧的生活.实际上,生活中总是有各种意外的事情发生,小到个人家庭的琐事,大到国家社会的暂时的不安定.为了能随遇而安,就得常常給自己洗脑,不要以为忙过了这一阵,就会有永远太平安宁的出头之日. 戒骄

GO语言练习:网络编程 ICMP 示例

1.代码 2.编译及运行 1.Go语言网络编程:ICMP示例代码 icmptest.go 1 package main 2 3 import ( 4 "fmt" 5 "net" 6 "os" 7 "io" 8 "bytes" 9 ) 10 11 func main() { 12 if len(os.Args) != 2 { 13 fmt.Println("Usage : ", os.Ar

给PHP扩展/C语言/网络编程初学者推荐的几本书

Linux/Unix系统 深入理解计算机系统 UNIX环境高级编程 深入理解Linux内核 网络通信编程 UNIX网络编程 TCP/IP详解 Linux多线程服务端编程 数据结构与算法 算法导论 <数据结构>(C语言版) C程序设计语言 给PHP扩展/C语言/网络编程初学者推荐的几本书

网络编程TCP总结及实践-C语言

网络变成首先要注意IP和端口的转换,现在电脑基本上是主机字节序,存储按照小端方式,而在网络中传输统一使用大端方式,所以网络变成首先要注意字节序的转换. 一个常用的ip转换程序的实现: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #define CHIP(ip) (ip&0xff)<<24 |(ip&(0xff<&

TCP 、UDP网络编程作业代写、代写C 语言 TCP程序 Network Programming using C

TCP .UDP网络编程作业代写.代写C 语言 TCP程序Network Programming using COverview? This homework is due by 11:59:59 PM on Thursday, April 26, 2018.? This homework will count as 8% of your final course grade.? This homework is to be completed individually. Do not shar

《Go语言网络编程》第一章:体系

原书地址:http://tumregels.github.io/Network-Programming-with-Go 如果不知道想要构建什么,是不可能创建一个系统的.而且如果不知道它工作的环境,也同样无法构建. GUI程序不同于批处理程序:游戏程序不同于商业程序:分布式程序不同于单机程序. 他们都有自己的方法.一般模式和问题,都有各自的常见问题和常见解决方案. 本章讨论分布式系统高层架构层面的一些内容.有多种方式看待这样的系统,而且其中的许多问题已经被解决. 协议层 分布式系统很难!其中涉及到

Go语言基础之网络编程

现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其实是一个很庞大的领域,本文只是简单的演示了如何使用net包进行TCP和UDP通信.如需了解更详细的网络编程请自行检索和阅读专业资料. 互联网协议介绍 互联网的核心是一系列协议,总称为"互联网协议"(Internet Protocol Suite),正是这一些协议规定了电脑如何连接和组网.我们理解了这些协议,就理解

linux下C语言socket网络编程简例

转自:http://blog.csdn.net/kikilizhm/article/details/7858405 这里给出在linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后打印出来,然后关闭.程序里有详细的说明,其中对具体的结构体和函数的实现可以参考其他资料. 程序说明: 这里服务器的端口号和ip地址使用固定的设置,移植时可以根据具体情况更改,可以改写为参数传递更好,这里为了方便,使用固定的. 移

GO语言练习:网络编程 TCP 示例

1.代码 2.编译及运行 1.网络编程 TCP 示例 simplehttp.go 代码 1 package main 2 3 import ( 4 "net" 5 "os" 6 "io" 7 "bytes" 8 "fmt" 9 ) 10 11 func main() { 12 if len(os.Args) != 2 { 13 fmt.Fprintf(os.Stderr, "Usage : %s