[go]socket编程
socket特性
- 总是成对出现

- 是全双工的(同时支持收发)(两个channel绑在一起)

应用程序
- cs模式(客户端开发)
- bs模式(web开发)
net包api基础
都是客户端主动发数据(client request)

一共有3个soket。用于通信的有2个。另一个用于监听ip端口

// 服务端
import (
"net"
)
listener, err := net.Listen("tcp", "127.0.0.1:8000") //生成监听socket
defer listener.Close()
conn, err := listener.Accept() //[**阻塞] 生成读写socket
defer conn.Close()
buf := make([]byte, 4096)
n, err := conn.Read(buf) //[**阻塞]
//读客户端数据(client request)
conn.Write(buf[:n]) //写数据给客户端
//客户端
conn, err := net.Dial("tcp", "127.0.0.1:8000")
defer conn.Close()
conn.Write([]byte("Are you Ready?")) //写数据
buf := make([]byte, 4096) //读数据
n, err := conn.Read(buf)
fmt.Println("服务器回发:", string(buf[:n]))
实现conn复用: 循环读写
//server
func main() {
listener, _ := net.Listen("tcp", ":3000")
defer listener.Close()
conn, _ := listener.Accept()
defer conn.Close()
buf := make([]byte, 1024)
for {
n, _ := conn.Read(buf)
if n==0{ //客户端关闭时候server退出
return
}
fmt.Println(string(buf[:n]))
conn.Write([]byte("i am server"))
time.Sleep(time.Second / 3)
}
}
// client
func main() {
conn, _ := net.Dial("tcp", ":3000")
defer conn.Close()
buf := make([]byte, 1024)
for {
conn.Write([]byte("hi server"))
n, _ := conn.Read(buf)
fmt.Println(string(buf[:n]))
time.Sleep(time.Second/3)
}
}
server支持并发
// server
func main() {
listener, _ := net.Listen("tcp", ":3000")
defer listener.Close()
for {
conn, _ := listener.Accept()
go func(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 1024)
for {
n, _ := conn.Read(buf) //已关闭的chan中往出读数据会一直读出零值
if n == 0 {
return
}
fmt.Println(string(buf[:n]))
conn.Write([]byte("i am server"))
time.Sleep(time.Second / 3)
}
}(conn)
}
time.Sleep(time.Second * 1000)
}
//client
func main() {
conn, _ := net.Dial("tcp", ":3000")
defer conn.Close()
buf := make([]byte, 1024)
for {
conn.Write([]byte("hi server"))
n, _ := conn.Read(buf)
fmt.Println(string(buf[:n]))
time.Sleep(time.Second/3)
}
}
server并发-处理退出等.问题
// 并发版的server: 复用lisntner.Accept
package main
import (
"net"
"fmt"
"strings"
)
func HandlerConnect(conn net.Conn) {
defer conn.Close()
// 获取连接的客户端 Addr
addr := conn.RemoteAddr()
fmt.Println(addr, "客户端成功连接!")
// 循环读取客户端发送数据
buf := make([]byte, 4096)
for {
n, err := conn.Read(buf)
//fmt.Println(buf[:n])
if "exit\n" == string(buf[:n]) || "exit\r\n" == string(buf[:n]) {
fmt.Println("服务器接收的客户端退出请求,服务器关闭")
return
}
if n == 0 {
fmt.Println("服务器检测到客户端已关闭,断开连接!!!")
return
}
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
fmt.Println("服务器读到数据:", string(buf[:n])) // 使用数据
// 小写转大写,回发给客户端
conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
}
}
func main() {
// 创建监听套接字
//listener, err := net.Listen("tcp", "127.0.0.1:8001")
listener, err := net.Listen("tcp", "192.168.15.78:8001")
if err != nil {
fmt.Println("net.Listen err:", err)
return
}
defer listener.Close()
// 监听客户端连接请求
for {
fmt.Println("服务器等待客户端连接...")
conn, err := listener.Accept()
if err != nil {
fmt.Println("listener.Accept err:", err)
return
}
// 具体完成服务器和客户端的数据通信
go HandlerConnect(conn)
}
}
//并发版的客户端
package main
import (
"net"
"fmt"
"os"
)
func main() {
// 主动发起连接请求
conn, err := net.Dial("tcp", "192.168.15.78:8001")
if err != nil {
fmt.Println("net.Dial err:", err)
return
}
defer conn.Close()
// 获取用户键盘输入( stdin ),将输入数据发送给服务器
go func() {
str := make([]byte, 4096)
for {
n, err := os.Stdin.Read(str)
if err != nil {
fmt.Println("os.Stdin.Read err:", err)
continue
}
//写给服务器, 读多少,写多少!
conn.Write(str[:n])
}
}()
// 回显服务器回发的大写数据
buf := make([]byte, 4096)
for {
n, err := conn.Read(buf)
if n == 0 {
fmt.Println("检查到服务器关闭,客户端也关闭")
return
}
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
fmt.Println("客户端读到服务器回发:", string(buf[:n]))
}
}
[go]socket编程的更多相关文章
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- java socket编程(li)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Socket编程实践(2) Socket API 与 简单例程
在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程.该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端. socket()函 ...
- Socket编程实践(1) 基本概念
1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...
- [转]C语言SOCKET编程指南
1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...
随机推荐
- Spring Cloud(二)服务提供者 Eureka + 服务消费者(rest + Ribbon)
Ribbon是什么? Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起.Ribbon客户端组件提供一系列完善的配置项如连接超时 ...
- Win10 通过附加进程调试时出现“此任务要求应用程序具有提升的权限”
最近有新人在使用vs调试时出现了“此任务要求应用程序具有提升的权限”的提示,每次调试vs就会重启一次. 问到我时,我经过查了一番资料才给解决掉了. 其实,问题主要是因为直接启动vs项目时没有足够的权限 ...
- 交换机配置-----monitor session
目录 交换机配置-----monitor 1.前言 2.monitor session的作用 3.配置命令 4.使用 交换机配置-----monitor 1.前言 本文章适用于Dell Network ...
- idea仿eclipse的export导出功能
自从开发工具从eclipse切换到idea来之后,才知道什么叫做'真香'.idea强大的扩展功能极大的拓展了他的可用性,最近有个功能就是通过idea的扩展插件搞定的. 事情是这样的,朋友使用eclip ...
- vue2.0+webpack+vuerouter+vuex+axios构建项目基础
前言 本文讲解的是vue2.0+webpack+vuerouter+vuex+axios构建项目基础 步骤 1.全局安装webpack,命令 npm install webpack -g 注意,web ...
- C#中设置double类型数据的小数长度
如果double A=1.5321654:需要将其转换为3位小数,字符串的话A.tostring(".###")就可以,输出的是1.532: 也可以用A.ToString(&quo ...
- java——OOM内存泄漏
资料: 一.什么是OOM OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个erro ...
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
- okhttp拦截器之CallServerInterceptor解析
今天来学习OkHttp的最后一个拦截器,如下: 看一下它的javadoc说明: 其作用有两个:发起网络请求和接收服务器响应,下面具体来看一下它的intercept(): 下面具体来看一下: 接着就是读 ...
- sessionStorage 与 localStorage 重新认识?
之前写过一次关于 js存储的总结,但是今天在项目中遇到一个bug让我重新在认识 sessionStorage 与 localStorage.以下的介绍都是基于同源下进行的,仔细看下面的案例: a.ht ...