go-TCP编程
Posted yasinawolaopo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go-TCP编程相关的知识,希望对你有一定的参考价值。
网路编程知识(端口)
0号是保留端口
1-1024是固定端口(
22
:SSH远程连接;23
:telnet使用;21
:ftp使用;25
:smtp服务使用;80
:iis使用;7
:echo使用)
端口注意事项
- 在计算机(尤其是服务器)要尽量少开端口
- 一个端口只能被一个程序监听
- 如果使用
netstat -an
可以查看本机有哪些端口在监听 - 可以使用
netstat -anb
来查看监听端口的pid,再结合任务管理器关闭不安全的端口
tcp socket编程的客户端和服务器端
tcp是长期连接
服务端的处理流程
- 监听端口8888
- 接收客户端的tcp链接,建立客户端和服务器端的连接
- 创建goroutine(协程),处理该连接的请求(通常客户端会通过链接发送请求包)
客户端的处理流程
- 建立与服务器的链接
- 发送请求数据,接收服务器端返回的结果数据
- 关闭连接
服务器监听
//采用的包
package net
我们使用的API是``
//0.0.0.0:8888:这样写IPV4和IPV6都支持
listen,err := net.Listen("tcp","127.0.0.1:8888")
if err != nil
fmt.Printf("listen err=%v\\n",err)
return
fmt.Printf("listen success = %v\\n",listen)
Accept
Read()
,Write
,Close()
,LocalAddr()
,RemoteAddr()
用的特别多;
//循环等待客户端来连接
for
//等待客户端来连接
fmt.Println("等待客户端连接...")
conn,err :=listen.Accept()
if err != nil
fmt.Println("Accept() error")
else
fmt.Printf("Accept() success = %v\\n",conn)
我们访问127.0.0.1:8888
连接成功后会一直判断连接
准备协程,为客户端
telnet www.bilibili,com 80
‘telnet’ 不是内部或外部命令,也不是可运行的程序或批处理文件。
重启电脑
完整代码
package main
import (
"fmt"
"net" //做网络socket开发时
)
func main()
fmt.Println("服务器开始监听...")
//0.0.0.0:8888:这样写IPV4和IPV6都支持
listen,err := net.Listen("tcp","127.0.0.1:8888")
if err != nil
fmt.Printf("listen err=%v\\n",err)
return
fmt.Printf("listen success = %v\\n",listen)
defer listen.Close()//延时关闭连接
//循环等待客户端来连接
for
//等待客户端来连接
fmt.Println("等待客户端连接...")
conn,err :=listen.Accept()
if err != nil
fmt.Println("Accept() error")
else
fmt.Printf("Accept() success = %v\\n",conn)
//准备协程,为客户端
服务器接收客户端消息
客户端
package main
import (
"fmt"
"net"
)
func Link()
conn,err := net.Dial("tcp","127.0.0.1:8888")
if err != nil
fmt.Println("connect error")
return
fmt.Printf("connect success = %v",conn)
func main()
Link()
服务端
package main
import (
"fmt"
"net" //做网络socket开发时
)
func main()
fmt.Println("服务器开始监听...")
//0.0.0.0:8888:这样写IPV4和IPV6都支持
listen,err := net.Listen("tcp","127.0.0.1:8888")
if err != nil
fmt.Printf("listen err=%v\\n",err)
return
fmt.Printf("listen success = %v\\n",listen)
defer listen.Close()//延时关闭连接
//循环等待客户端来连接
for
//等待客户端来连接
fmt.Println("等待客户端连接...")
conn,err :=listen.Accept()
if err != nil
fmt.Println("Accept() error")
else
//查看客户端的ip地址
fmt.Printf("Accept() success = %v,客户端ip地址=%v\\n",conn,conn.RemoteAddr())
面向对象编程面向组件编程面向方面编程面向服务编程
1、什么是面向对象编程(Object-Oriented Programming)?
面向对象编程 (Object-Oriented Programming)简称OOP技术,是开发计算机应用程序的一种新方法、新思想。过去的面向过程编程常常会导致所有的代码都包含在几个模块中,使程 序难以阅读和维护。在做一些修改时常常牵一动百,使以后的开发和维护难以为继。而使用OOP技术,常常要使用许多代码模块,每个模块都只提供特定的功能, 它们是彼此独立的,这样就增大了代码重用的几率,更加有利于软件的开发、维护和升级。
在面向对象中,算法与数据结构被看做是一个整体,称作对象,现实世界中任何类的对象都具有一定的属性和操作,也总能用数据结构与算法两者合一地来描述,所以可以用下面的等式来定义对象和程序:
对象=(算法+数据结构),程序=(对象+对象+……)。
从上面的等式可以看出,程序就是许多对象在计算机中相继表现自己,而对象则是一个个程序实体。
2、什么是面向组件编程(Component-Oriented Programming)?
组 件不是一个新的概念,Java中的javaBean规范和EJB规范都是典型的组件。组件的特点在于他定义了一种通用的处理方式。例如,JavaBean 拥有内视的特性,这样就可以通过工具来实现JavaBean的可视化。而EJB规范定义了企业服务中的一些特性,使得EJB容器能够为符合EJB规范的代 码增添企业计算所需要的能力,例如事务、持久化、池等。
所以,组件比起对象来的进步就在于通用的规范的引入。通用规范往往能够为组件添加新的能力(就像上面所讨论的),但也给组件添加了限制,例如你需要实现EJB的一些接口
COP比OOP更进一步。通常OOP将数据对象组织到实体中。这种方法具有很多优点。但是,OOP有一个大的限制:对象之间的相互依赖关系。去掉这个限制的一个好的想法就是组件。组件和一般对象之间的关键区别是组件是可以替代的。
3、什么是面向方面编程(Aspect-Oriented Programming)?
将通用需求功能从不相关类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。
AOP就是这种实现分散关注的编程方法,它将“关注”封装在“方面”中。
4、什么是面向服务编程(Service-Oriented Programming)?
SOP是一种体系结构,目标是在软件代理交互中获得松散耦合。一个服务是一个服务提供者为一个服务消费者获得其想要的最终结果的一个工作单元。服务者与消费者都以软件代理代表他们自己的角色。
这听起来有些太抽象,但是SOP确实无处不在。让我们在你的住房中找到一个SOP的例子。例如播放一个CD,你可以将要播放的CD放入CD机中,CD机将 为你播放这张CD,CD机提供了一个CD播放服务。这里的好处就是你可以用不同的CD机去播放同一张CD。他们能提供同样的CD播放服务,但是服务质量是 不同的。
SOP的思想明显不同于面向对象的编程,面向对象编程强烈的建议你应该将数据与其操作绑定。因此在面向对象编程风格中,每张CD 有它自己的CD播放机,他们之间不能被拆开。这听起来很奇怪,但是这就是我们建立许多已存软件系统的方式。
而SOP就不一样了,为了减少异构性、互操作性和不断改变的要求的问题,这样的体系结构应该提供平台来构建具有下列特征的应用程序服务:
松散耦合、位置透明、协议独立
基于这样的面向服务的体系结构,服务使用者甚至不必关心与之通信的特定服务,因为底层基础设施或服务“总线”将代表使用者做出适当的选择。基础设施对请求 者隐藏了尽可能多的技术。特别地,来自不同实现技术(如 J2EE 或 .NET)的技术规范不应该影响 SOP用户。如果已经存在一个服务实现,我们就还应该重新考虑用一个“更好”的服务实现来代替,新的服务实现必须具有更好的服务质量。
以上是关于go-TCP编程的主要内容,如果未能解决你的问题,请参考以下文章