⼀、使用Golang创建⼀一个TCP连接
 
1.服务端处理理流程
  a.监听端口

   b.接受客户端的链接

  c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Goroutine⾮常简单)

  题外话:要是用Java、C#服务这边每⼀个请求都开⼀个线程处理的话,顶多⼏千个,但是Goroutine就⾮常简单。

package main

import (
"fmt"
"net"
) func main() {
//1.建立监听端口
listen, err := net.Listen("tcp", "0.0.0.0:20000")
if err != nil {
fmt.Println("listen failed, err:", err)
return
} fmt.Println("listen Start...:") for {
//2.接收客户端的链接
conn, err := listen.Accept()
if err != nil {
fmt.Printf("accept failed, err:%v\n", err)
continue
}
//3.开启一个Goroutine,处理链接
go process(conn)
}
} //处理请求,类型就是net.Conn
func process(conn net.Conn) { //处理结束后关闭链接
defer conn.Close()
for {
var buf [128]byte
n, err := conn.Read(buf[:])
if err != nil {
fmt.Printf("read from conn failed, err:%v", err)
break
}
fmt.Printf("recv from client, content:%v\n", string(buf[:n]))
} }

2.客户端处理流程

  a.和服务端建立一个链接
  b.进行数据的收发
  c.关闭链接 
package main

import (
"bufio"
"fmt"
"net"
"os"
"strings"
) func main() {
//1.建立一个链接(Dial拨号)
conn, err := net.Dial("tcp", "0.0.0.0:20000")
if err != nil {
fmt.Printf("dial failed, err:%v\n", err)
return
} fmt.Println("Conn Established...:") //读入输入的信息
reader := bufio.NewReader(os.Stdin)
for {
data, err := reader.ReadString('\n')
if err != nil {
fmt.Printf("read from console failed, err:%v\n", err)
break
} data = strings.TrimSpace(data)
//传输数据到服务端
_, err = conn.Write([]byte(data))
if err != nil {
fmt.Printf("write failed, err:%v\n", err)
break
}
}
}
执⾏⼀下:
客户端:
服务端: 

⼆、使用Golang创建⼀个HTTP连接
A.HTTP协议是基于TCP协议之上的⽂本协议。
B.每行⽂本使⽤\r\n结尾,当连续两个\r\n时,表示整个数据包结束。
package main

import (
"fmt"
"io"
"net"
) func main() {
conn, err := net.Dial("tcp", "www.baidu.com:80")
if err != nil {
fmt.Printf("dial failed, err:%v\n", err)
return
} data := "GET / HTTP/1.1\r\n"
data += "HOST: www.baidu.com\r\n"
data += "connection: close\r\n"
data += "\r\n\r\n" //写入数据
_, err = io.WriteString(conn, data)
if err != nil {
fmt.Printf("wirte string failed, err:%v\n", err)
return
} var buf [1024]byte
for {
//读取返回的数据
n, err := conn.Read(buf[:])
if err != nil || n == 0 {
break
} fmt.Println(string(buf[:n]))
}
}
 
三、使⽤用Golang创建⼀个UDP连接
1.服务流程,相比于TCP连接需要Accept一个链接,UDP不需要进⾏这步操作,服务端代码如下:
package main

import (
"fmt"
"net"
) func main() {
//建立一个UDP的监听,这里使用的是ListenUDP,并且地址是一个结构体
listen, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 8080,
})
if err != nil {
fmt.Printf("listen failed, err:%v\n", err)
return
} for {
var data [1024]byte
//读取UDP数据
count, addr, err := listen.ReadFromUDP(data[:])
if err != nil {
fmt.Printf("read udp failed, err:%v\n", err)
continue
} fmt.Printf("data:%s addr:%v count:%d\n", string(data[0:count]), addr, count)
//返回数据
_, err = listen.WriteToUDP([]byte("hello client"), addr)
if err != nil {
fmt.Printf("write udp failed, err:%v\n", err)
continue
}
}
}

2.客户端流程

package main

import (
"fmt"
"net"
) func main() {
// 创建连接
socket, err := net.DialUDP("udp4", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 8080,
})
if err != nil {
fmt.Println("连接失败!", err)
return
}
defer socket.Close()
// 发送数据
senddata := []byte("hello server!")
_, err = socket.Write(senddata)
if err != nil {
fmt.Println("发送数据失败!", err)
return
}
// 接收数据
data := make([]byte, 4096)
read, remoteAddr, err := socket.ReadFromUDP(data)
if err != nil {
fmt.Println("读取数据失败!", err)
return
}
fmt.Println(read, remoteAddr)
fmt.Printf("%s\n", data)
}

Go语言实现简单的TCP、UDP链接的更多相关文章

  1. TCP\UDP链接的异同

    简单的说TCP与UDP的区别是有无连接状态.TCP是有连接状态的,而UDP没有,所以TCP是一种比较安全的通讯协议,而UDP则比较方便 TCP 127.0.0.1:1026 0.0.0.0:0 LIS ...

  2. 最简单的Tcp Udp的例子

    //1.WinSock包含2个主要的版本,即WinSock1和WinSock2.前者需要包含头文件WinSock.h和库文件wsock32.lib,后者需要包含头文件WinSock2.h和库文件ws2 ...

  3. windows网络编程-C语言实现简单的TCP协议聊天

    TCP/IP协议(面向连接协议)类似于打电话时,对方一定在手机附近并且此刻都在和对方进行通话.一定保证双方都在线,才能进行数据传输.UDP/IP协议(无连接协议)就像邮箱,不保证对方一定在等你邮件且对 ...

  4. 谁说C语言很简单?

    前两天,Neo写了一篇<语言的歧义>其使用C语言讨论了一些语言的歧义.大家应该也顺便了解了一下C语言中的很多不可思异的东西,可能也是你从未注意到的东西. 是的,C语言并不简单,让我们来看看 ...

  5. TODO:Golang语言TCP/UDP协议重用地址端口

    TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...

  6. 为什么基于TCP UDP服务的一些简单服务端口号都是奇数

    TCP是有NCP(网络控制协议)派生出来的,NCP是单工的,通信需要两个链接,所以会预留奇偶端口号.当TCP/UDP成为传输层协议,每个程序只是用一个端口号,且使用奇端口号.

  7. [转][linux]简单的linux下的tcp/udp

    转自:https://blog.csdn.net/cabing2005/article/details/53068880 详细函数以及参数解释请看原链接. windows下的tcp/udp参考:htt ...

  8. python tcp,udp简单使用

    import socket host = '127.0.0.1' port = 9999 #创建一个tcp socket套接字 tcp_server = socket.socket(socket.AF ...

  9. 网络基础--简单理解什么是DNS? TCP? UDP? Http? Socket?

    什么是IP 协议?  协议就是为了实现网络通信而创建的一系列规范.  通常我们的网络模型从上到下共分为4层: 应用层, 传输层, 网络层 和数据链路层. IP协议属于网络层协议,它精确定义了网络通信中 ...

随机推荐

  1. div定位relative和absolute测试1

    div里的position定位也是比较常见的,relative是相对定位,absolute是绝对定位.如本文测试:body自带8px的margin,这里不对其进行清空.蓝色的div和红色的div分别设 ...

  2. 08点睛Spring MVC4.1-Spring MVC的配置(含自定义HttpMessageConverter)

    8.1 配置 Spring MVC的配置是通过继承WebMvcConfigurerAdapter类并重载其方法实现的; 前几个教程已做了得配置包括 01点睛Spring MVC 4.1-搭建环境 配置 ...

  3. Linux_高级用法

    LInux如何压缩和解压文件 文件压缩与解压主要讲zip和tar 安静模式和文件夹 zip -r -q -o test.zip 需要打包文件 查看打包文件 du -h test.zip 上节学过的fi ...

  4. ACL 实验

    一.环境准备 1. 软件:GNS3 2. 路由:c7200 二.实验操作 实验要求: 1. 掌握标准 ACL.扩展 ACL 的配置方法. 2. 掌握命名 ACL 的配置方法. 3. 掌握访问控制列表配 ...

  5. 《Mysql - Mysql 是如何保证高可用的?》

    一:为什么要进行主备切换? - 比如软件升级.主库所在机器按计划下线等.主动运维. - 比如主库所在机器掉电,为了保证服务的正常运行,而进行切换.可能是被动操作. - 流程图 -   二:什么是同步延 ...

  6. 转:Cesium 和 Webpack

    原文地址:https://www.jianshu.com/p/85917bcc023f 注意:webpack 和 webpack-cli 的安装参考 https://www.cnblogs.com/m ...

  7. spring boot配置文件application.properties配置JPA以及数据源

    1.application.properties配置jpa模板 spring.datasource.url=jdbc:mysql://localhost:3306/springboottest?use ...

  8. 剑指offer33:求按从小到大的顺序的第N个丑数。

    1 题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 2 ...

  9. WUSTOJ 1299: 结点选择(Java)

    题目链接:

  10. Linux or Mac 重启网络

    Mac sudo ifconfig en0 down sudo ifconfig en0 up Linux /etc/init.d/networking restart