GO网络编程和Linux Socket API的关系

先展示一下简单的go程序,然后分析GO的API和Linux API的关系。像简单的socket概念等就不在这里介绍了,不懂的去百度一下。

server.go

package main

import "net"
import "fmt"
import "bufio"
import "strings" // only needed below for sample processing

func main() {

  fmt.Println("Launching server...")
  // 监听端口8081
  ln, _ := net.Listen("tcp", ":8081")
  // 接入
  conn, _ := ln.Accept()
  for {
    message, _ := bufio.NewReader(conn).ReadString(‘\n‘)
    fmt.Print("Message Received:", string(message))
    //处理一下收到的数据
    newmessage := strings.ToUpper(message)
    //写回到客户端
    conn.Write([]byte(newmessage + "\n"))
  }
}

client.c

package main

import "net"
import "fmt"
import "bufio"
import "os"

func main() {

  // 连接到服务器
  conn, _ := net.Dial("tcp", "127.0.0.1:8081")
  for {
    // 从标准的输入流中读取数据
    reader := bufio.NewReader(os.Stdin)
    fmt.Print("Text to send: ")
    text, _ := reader.ReadString(‘\n‘)
    // 发送给socket
    fmt.Fprintf(conn, text + "\n")
    // 监听服务端写回来的数据
    message, _ := bufio.NewReader(conn).ReadString(‘\n‘)
    if message == ""{
        fmt.Print("message from client is nil")
        break
    }
    fmt.Print("Message from server: "+message)
  }
}

使用go语言实现了一个简单的客户服务器之间的交流。左边是客户端,右边是服务端。

Linux Socket API和go API之间的联系

go语言写网络程序非常的简单,和C语言相比省略了许多的步骤,C语言从创建套接字-->填充相关的信息,再使用函数bind()绑定套接字--->再listen监听端口--->最后是使用accept接收连接。go语言省略了前面两个步骤,直接使用Listen()绑定了端口并且监听端口,再使用Accept()接收连接,那么go的Listen、Accept函数和C语言里面的bind、listen、accept有什么联系呢。

Listen

不说那么多废话,show the picture!

                        图1  go Listen函数和Linux Socket API的关系

图片凑活的看,可以看到其实go语言的Listen函数底层是直接调用了Linux网络编程API的socket()创建一个套接字,并且将数据绑定到这个套接字上,最后在这个端口上监听,可谓是一举完成了三件事情,真的是非常的方便。

在阅读代码和查看资料的时候,发现go是将socket使用epoll来进行异步通知的。说到这里,其实逻辑很清晰,go语言通过一步到位的方式使用Listen将创建套接字、绑定、监听都完成了,最后还顺便将socket加入到epoll的监听队列中,从而完成了异步网络编程。

Accept

                              图2 go Accept函数和Linux Socket API的关系

相比较我们上面讨论的Listen来说,Accept就简单很多了。在连接建立后,还是会将这个得到socket加入到咱们的epoll队列中,从而有事件到来的时候,异步的通知我们处理此socket的线程。

总结

  其实总的来说,不管是JAVA、PHP、还是我们讨论的GO语言,调用来调用去,封装来封装去,到最后还是调用操作系统提供的系统调用来完成我们的工作,而系统调用又需要调用网络驱动程序来完成对网卡或者其他硬件的读和写。套用一句很有名气的话,"计算机世界的所有问题,都可以通过向上一层进行抽象封装来解决"。如果有,那就两层解决。回想我们编程,也正是如此。我们一开始使用面向过程的编程思想,写函数,然后出现了高阶函数,又出现了面向对象的思想,这何尝不是一种我们应用程序员进行的封装呢?

原文地址:https://www.cnblogs.com/luhaipeng/p/11997639.html

时间: 2024-08-29 09:19:49

GO网络编程和Linux Socket API的关系的相关文章

【网络编程】——linux socket demo

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h> #if 0 #define UDP #else #define TCP #endif int sockfd; char* IP

通过基于java实现的网络聊天程序分析java中网络API和Linux Socket API关系

1. 引言 socket网络编程,可以指定不同的通信协议,在这里,我们使用TCP协议实现基于java的C/S模式下“hello/hi”网络聊天程序 2. 目标 1). 通过该网络聊天程序,了解java Socket API接口的基本用法 2). java Socket API简要介绍 3). linux socket API 简单分析 4). tcp协议的连接和终止 5). 探究java socket API 和 linux socket api之间的关系 3. linux socket API

Java Socket编程以及与Linux Socket API关系

Socket 编程(基于Linux) Socket独立于具体协议的网络编程接口,在ISO模型中,主要位于会话层和传输层之间:在通用的计算机网络五层模型中,主要位于应用层和传输层之间. Linux Socket 基本上就是BSD Socket 需要使用的头文件 数据类型:#include <sys/types.h> 函数定义:#include <sys/socket.h> Socket类型 套接字是一种通信机制,通信两方的一种约定,用套接字中的相关函数来完成通信过程.根据传输内容分为

python Socket编程-python API 与 Linux Socket API之间的关系

python socket编程 服务端 #!/usr/bin/env python # coding=utf-8 from socket import * HOST = '' PORT = 2345 BUFSIZE = 1024 ADDR = (HOST,PORT) #创建AF_INET地址族,TCP的套接字 with socket(AF_INET,SOCK_STREAM) as tcpSerSock: #绑定ip和端口 tcpSerSock.bind(ADDR) #监听端口,是否有请求 tcp

一个hello/hi的简单的网络聊天程序和python Socket API与Linux Socket API之间的关系

1.Socket概述 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网络套接字是IP地址与端口的组合. 套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点.通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到

从零开始学Python第八周:网络编程基础(socket)

Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可. 套接字是一个双向的通信信道的端点.套接字可能在沟通过程,进程之间在同一台机器上,或在不同的计算机之间的进程 要创建一个套接字,必须使用Socket模块的socket.socket()方法 在socket模块中的一般语法: s = socket.

C# 网络编程之通过豆瓣API获取书籍信息(一)

这篇文章主要是讲述如何通过豆瓣API获取书籍的信息,起初看到这个内容我最初的想法是在"C# 网络编程之网页简单下载实现"中通过HttpWebResponse类下载源码,再通过正则表达式分析获取结点标签得到信息.但后来发现可以通过豆瓣API提供的编程接口实现. 该文章仅是基础性C#网络编程文章,尝试测试了下豆瓣API,并没什么高深的内容.但希望对大家有所帮助,仅供学习. (警告:文章仅供参考,提供一种想法,否则访问多次-10次被403 forbidden莫怪.建议认证使用豆瓣API) 一

Linux 网络编程三(socket代码详解)

//网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>//htons()函数头文件 #include <ne

(50)LINUX应用编程和网络编程之五 Linux信号(进程间通信)

信号实现进程间的通信 3.5.1.什么是信号 3.5.1.1.信号是内容受限(只是一个int型的数字)的一种异步通信机制 (1)信号的目的:用来通信(进程与进程之间的通信) (2)信号是异步的(对比硬件中断),信号好像就是一种软件中断. (3)信号本质上是int型数字编号(事先定义好的) 3.5.1.2.信号由谁发出 (1)用户在终端按下按键 (2)硬件异常后由操作系统内核发出信号 (3)用户使用kill命令向其他进程发出信号 (4)某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生S