go-TCP编程

网路编程知识(端口)

0号是保留端口

1-1024是固定端口(22:SSH远程连接;23:telnet使用;21:ftp使用;25:smtp服务使用; 80:iis使用; 7:echo使用)

端口注意事项

  1. 在计算机(尤其是服务器)要尽量少开端口
  2. 一个端口只能被一个程序监听
  3. 如果使用netstat -an可以查看本机有哪些端口在监听
  4. 可以使用netstat -anb来查看监听端口的pid,再结合任务管理器关闭不安全的端口

tcp socket编程的客户端和服务器端

tcp是长期连接

服务端的处理流程

  1. 监听端口8888
  2. 接收客户端的tcp链接,建立客户端和服务器端的连接
  3. 创建goroutine(协程),处理该连接的请求(通常客户端会通过链接发送请求包)

客户端的处理流程

  1. 建立与服务器的链接
  2. 发送请求数据,接收服务器端返回的结果数据
  3. 关闭连接

服务器监听

//采用的包
package net

go-TCP编程_第1张图片
go-TCP编程_第2张图片

我们使用的API是``
go-TCP编程_第3张图片

//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

go-TCP编程_第4张图片

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
go-TCP编程_第5张图片
连接成功后会一直判断连接

准备协程,为客户端

telnet www.bilibili,com 80

‘telnet’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

go-TCP编程_第6张图片
go-TCP编程_第7张图片
go-TCP编程_第8张图片

重启电脑

完整代码

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())
		}
	}

	
}

客户端信息

go-TCP编程_第9张图片

你可能感兴趣的:(golang,tcp/ip,服务器,网络)