# 9. 怎么又是socket又是tcp

## 那么什么叫socket

有时候我们说搞socket编程, socket编程就是tcp的编程吗? tcp/udp是一种协议, 一种约定"我们俩怎么沟通"的约定, 一旦决定好怎么去沟通, 于是开始通信吧, 用的就是socket开始沟通

比如在Linux系统中socket是一种文件, 你可以打开/关闭一个socket, 也可以对socket进行读写. socket读/写的工作方式就是你选择的(tcp/udp). 正常来说"搞"socket分成以下几步:

* 服务端监听:&#x20;
  * 首先你要绑定(bind)这个端口: `net.Liten/ListenPacket`
  * 然后你接受(Accept)来访的链接: `conn = listener.Accept`
  * 然后你读取tcp字节流里的内容: `io.Read`
  * 然后把响应写到连接里去: `io.Write`
* 客户端请求: 先`net.Dial`, 然后直接`io.Write`

## 端口

无论是tcp还是udp都是需要端口号才能工作的, 理论上你有65535个端口用, 但实际上0\~1023被用作一些固定用途, 比如ssh, http等, 如果你尝试监听这些端口除非sudo否则不让你这么做. 而1024\~49151就给服务端绑定, 剩下来49152到65535一般用于临时端口, 也就是客户端向服务端发起请求的时候用的
