Golang学习+深入(十五)-网络编程

目录

一、概述

1、网络编程

1.1、网络编程

1.2、服务器端+客户端


一、概述

1、网络编程

QQ、迅雷、百度网盘客户端等等。

Golang的主要设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端程序必不可少也是至关重要的一部分。

网络编程有两种:

  1. TCP socket编程,是网络编程的主流。之所以叫TCP socket编程,是因为底层是基于Tcp/ip协议的,比如QQ聊天
  2. B/S结构的http编程,我们使用浏览器去访问服务器时,使用的就是http协议,而http底层依旧是用tcp socket实现的。

端口(port):把IP比作一间房子,端口就是出入这间房子的门。IP地址的端口可以有65536(即:256x256)个之多!端口只有整数,范围是从0到65535(256X256-1)

端口分类: 0号是保留端口 1-1024是固定端口又叫又名端口,即被某些程序固定使用,一般程序员不使用 22:SSH远程登录协议 23:telnet使用 21:ftp使用 25:smtp服务使用 80:iis使用 7:echo服务

1025-65535是动态端口,这些端口,程序员可以使用。

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

1.1、网络编程

import "net":net包提供了可移植的网络I/O接口,包括TCP/IP、UDP、域名解析和Unix域socket。
func Listen(net, laddr string) (Listener, error):返回在一个本地网络地址
laddr上监听的Listener。网络类型参数net必须是面向流的网络:
"tcp"、"tcp4"、"tcp6"、"unix"或"unixpacket"。
type Listener interface {
    // Addr返回该接口的网络地址
    Addr() Addr
    // Accept等待并返回下一个连接到该接口的连接
    Accept() (c Conn, err error)
    // Close关闭该接口,并使任何阻塞的Accept操作都会不再阻塞并返回错误。
    Close() error
}
Example
// Listen on TCP port 2000 on all interfaces.
l, err := net.Listen("tcp", ":2000")
if err != nil {
    log.Fatal(err)
}
defer l.Close()
for {
    // Wait for a connection.
    conn, err := l.Accept()
    if err != nil {
        log.Fatal(err)
    }
    // Handle the connection in a new goroutine.
    // The loop then returns to accepting, so that
    // multiple connections may be served concurrently.
    go func(c net.Conn) {
        // Echo all incoming data.
        io.Copy(c, c)
        // Shut down the connection.
        c.Close()
    }(conn)
}

1.2、服务器端+客户端

服务端

package main
import (
	"fmt"
	"net"
)

func process(conn net.Conn) {
	defer conn.Close()
	for{
		buf := make([]byte,1024)
		//conn.Read(buf)
		//1.等待客户端通过conn发送信息
		//2.如果客户端没有write[发送],那么协程就阻塞在这里
		fmt.Printf("服务器在等待客户端 %s 发送信息\n",conn.RemoteAddr().String())
		n,err := conn.Read(buf)
		if err != nil {
			fmt.Println("客户端退出",err)
			return
		}
		//3.显示客户端发送的内容到服务器的终端
		fmt.Print(string(buf[:n]))
	}
}

func main(){
	fmt.Println("服务器开始监听...")
	//net.Listen("tcp", "0.0.0.0:8888")
	//1.tcp 表示使用网络协议是tcp
	//2.0.0.0.0:8888表示在本地监听8888端口
	listen, err := net.Listen("tcp", "0.0.0.0:8888")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer listen.Close()
	for {
		// Wait for a connection.
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println(err)
			return
		}else{
			fmt.Printf("conn=%v\n",conn)
		}
		go process(conn)
	}
}

客户端

package main
import (
	"fmt"
	"net"
	"bufio"
	"os"
	"strings"
)

func main(){
	conn, err := net.Dial("tcp", "127.0.0.1:8888")
	if err != nil {
		fmt.Println("client dial err=",err)
		return
	}
	fmt.Fprintf(conn, "GET / HTTP/1.0\r\n\r\n")
	//status, err := bufio.NewReader(conn).ReadString('\n')
	reader := bufio.NewReader(os.Stdin)
	for{
		line,err := reader.ReadString('\n')
		if err != nil {
			fmt.Println("ReadString err=",err)
			return
		}
		line = strings.Trim(line," \r\n")
		if line=="exit"{
			fmt.Println("客户端退出")
			break
		}
		_,err = conn.Write([]byte(line+"\n"))
		if err != nil {
			fmt.Println("conn.Write err=",err)
			return
		}
	}
}

客户端可循环从终端输入内容,直到输入exit退出客户端

Golang学习+深入(一)

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀神lwz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值