目录

  • TCP/IP协议介绍
  • GO快速实现TCP服务端
  • GO快速实现TCP客户端
  • UDP协议介绍
  • UDP编程实例

TCP/IP协议介绍

1、互联网起源

A. 起源于美国五角大楼,它的前身是美国国防部高级研究计划局主持研制的ARPAnet。
B. 互联网的基础是TCP/IP协议
C. TCP/IP 是供已连接因特网的计算机进行通信的通信协议。

2、TCP/IP协议

A. TCP (传输控制协议) - 应用程序之间通信。
B. UDP (用户数据包协议) - 应用程序之间的简单通信
C. IP (网际协议) - 计算机之间的通信。
D. DHCP (动态主机配置协议) - 针对动态寻址。

3、TCP协议

A. 面向连接的协议
B. 可靠传输,发送的数据保证对方能够收到。
C. 保证时序,发送的数据按发送的顺序到达。
D. 全双工的。

4、IP协议

A. 用于计算机之间进行通信,是TCP/UDP协议的底层
B. IP是无连接的,负责把数据包路由到目的地。

5、 TCP/IP协议图解

6、 TCP协议基础

A. 通过IP和端口进行计算机之间进行访问
B. 域名和知名端口,http:80,https:443,ssl:22端口等

7、Tcp服务端编程模型

GO快速实现TCP服务端

1、服务端处理流程

package main

import (
"fmt"
"net"
) func main(){
listen, err := net.Listen("tcp", "0.0.0.0:20000") if err != nil {
fmt.Println("listen failed, err:", err)
} for {
conn, err := listen.Accept()
if err !=nil {
fmt.Printf("accept failed, err:%v\n", err)
continue
}
go process(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 form conn failed, err:%v", err)
break;
} str := string(buf[:n])
fmt.Printf("recv from client, data:%v\n", str)
}
}

  

GO快速实现TCP客户端

1、客户端编程模式

package main

import (
"bufio"
"fmt"
"net"
"os"
"strings"
) func main(){
conn, err := net.Dial("tcp", "0.0.0.0:20000")
if err != nil {
fmt.Printf("dial failed, err:%v\n", err)
return
} reader := bufio.NewReader(os.Stdin)
for {
data,err := reader.ReadString('\n')
if err != nil {
fmt.Printf("read from console failed, err:%v\n", err)
} data = strings.TrimSpace(data)
_, err =conn.Write([]byte(data))
if err != nil {
fmt.Printf("write failed, err%v\n", err)
}
}
}

  

2、发送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]))
}
}

  

UDP协议介绍

1、UDP协议

A. 用户数据库报协议
B. 无连接,直接进行数据发送
C. 不可靠、没有时序
D. 实时性比较好,通常用于视频直播相关领域。

UDP编程实例

1、服务端代码

package main
import (
"fmt"
"net"
)
func main() {
// 创建监听
socket, err := net.ListenUDP("udp4", &net.UDPAddr{
IP: net.IPv4(0, 0, 0, 0),
Port: 8080,
})
if err != nil {
fmt.Println("监听失败!", err)
return
}
defer socket.Close()
for {
// 读取数据
data := make([]byte, 4096)
read, remoteAddr, err := socket.ReadFromUDP(data)
if err != nil {
fmt.Println("读取数据失败!", err)
continue
}
fmt.Println(read, remoteAddr)
fmt.Printf("%s\n\n", data)
// 发送数据
senddata := []byte("hello client!")
_, err = socket.WriteToUDP(senddata, remoteAddr)
if err != nil {
return
fmt.Println("发送数据失败!", err)
}
}
}

  

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语言学习(二十二)网络编程的更多相关文章

  1. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  2. 【原创】go语言学习(十二)struct介绍1

    目录: struct声明和定义 struct的内存布局以及构造函数 匿名字段和struct嵌套 struct与tag应用 struct声明和定义 1.Go中面向对象是通过struct来实现的, str ...

  3. Python学习日记(二十九) 网络编程

    早期的计算机通信需要有一个中间件,A要给B传东西,A必须要把信息传给中间件,B再把从中间件中拿到信息 由于不同机器之间需要通信就产生了网络 软件开发的架构 1.C/S架构 服务器-客户机,即Clien ...

  4. GO语言学习(十二)Go 语言函数

    Go 语言函数 函数是基本的代码块,用于执行一个任务. Go 语言最少有个 main() 函数. 你可以通过函数来划分不同功能,逻辑上每个函数执行的是指定的任务. 函数声明告诉了编译器函数的名称,返回 ...

  5. Java笔记(二十九)……网络编程

    概述 网络模型 网络通讯的要素 ip地址:网络中设备的标识符 端口:用于标识同一台设备上不同的进程,有效端口:0~65535,其中0~1024是系统使用端口或者保留端口 TCP与UDP UDP特点: ...

  6. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  7. 学习笔记:CentOS7学习之二十二: 结构化命令case和for、while循环

    目录 学习笔记:CentOS7学习之二十二: 结构化命令case和for.while循环 22.1 流程控制语句:case 22.2 循环语句 22.1.2 for-do-done 22.3 whil ...

  8. (C/C++学习笔记) 二十二. 标准模板库

    二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...

  9. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  10. Tensorflow深度学习之十二:基础图像处理之二

    Tensorflow深度学习之十二:基础图像处理之二 from:https://blog.csdn.net/davincil/article/details/76598474   首先放出原始图像: ...

随机推荐

  1. prometheus环境搭建

    1. 下载文件 wget https://dl.grafana.com/oss/release/grafana-6.2.4.linux-amd64.tar.gz tar -zxvf grafana-. ...

  2. 腾讯域名使用百度CDN加速配置

    1.百度CDN资源包购买 购买地址 https://console.bce.baidu.com/cdn/#/cdn/package/create 我比较穷所以买的是18块100G的资源包. 2.添加域 ...

  3. win7用驱动精灵安装了bcm94352ac蓝牙驱动后还是不能用蓝牙的解决方法

    驱动精灵安装了驱动后,设备管理器处显示Bluetooth USB,但是没法用蓝牙,找不到蓝牙图标,后来在华硕官方下载了win7的Broadcom 蓝牙驱动程序装上之后就好了

  4. iOS开发微信支付的介绍与实现

    1.前期准备 1) 到微信开放平台注册账号 需要登录邮箱验证 填写您的商户信息 2) 进入管理中心 --- 移动应用 --- 创建移动应用 --- 根据页面完善应用资料 3) 审核过后,通过应用详情页 ...

  5. MySQL常见问题集锦及注意事项

    一.表设计上的坑 1.字段设计 1.1 字段类型设计 尽量使用整型表示字符串: `INET_ATON(str)`,address to number `INET_NTOA(number)`,numbe ...

  6. Vue指令之事件修饰符

    事件修饰符: + .stop 阻止冒泡 + .prevent 阻止默认事件 + .capture 添加事件侦听器时使用事件捕获模式 + .self 只当事件在该元素本身(比如不是子元素)触发时触发回调 ...

  7. c# 虚属性

  8. Django组件之用户认证

    auth模块 1 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenticate( ...

  9. mysql的2种备份mysqldump 和 Xtrabackup

    mysqldump备份方式 备份 mysqldump -uroot -p 数据库名 > 备份的文件名 恢复(先关闭数据库) mysql -uroot -p 数据库名 < 备份的文件名 Xt ...

  10. IDEA快捷键之关闭标签页和选定单词

    下面所说的快捷键仅作为演示使用,个人可根据喜好自行设置 使用Alt + W 选中某个单词 点击IDEA左上角的File 打开Settings 在左侧点击KeyMap 打开右侧的Editor Actio ...