Tcp 服务器 | 学习笔记

简介: 快速学习 Tcp 服务器

开发者学堂课程【Python 入门 2020年版:Tcp 服务器 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10463


Tcp 服务器

内容介绍

一. 概念

二. 服务端代码及注释

三. 补充解释

四. TCP 注意事项

 

一.概念

TCP 服务端

在程序中,如果想要完成一个 tcp 服务器的功能,需要的流程如下:

1.socket 创建一个套接字

2.bind 绑定 ip 和 port

3.listen 使套接字变为可以被动链接

4.accept 等待客户端的链接

5.recv/send 接收发送数据

 

二.服务端代码及注释

1.代码

import socket

#创建一个 socket 连接

s=socket.socket(socket.AFINET,socket.SOCK_STREAM) s.bind(('192.168.31.199',9090))

s.listen(128) # 把 socket 变成一个被动监听的 socket

#<socket.socket fd=512,famiLy=AddressFamiLy.AF-INET, type=SocketKind.SOCK

_STREAM,proto=0,laddr=(‘192.168.31.199’ ,9090),raddr=('192.168.31.185’,38096)>('192.168.31.185', 38096))

#('192.168.31.185', 38096)

#接收到的结果是一个元组,元组里有两个元素

#第 0 个元素是客户端的 socket 连接,第 1 个元素是客户端的 ip 地址和端口号

#x=s.accept()#接收客户端的请求

client_socket,client_addr=s.accept()

#udp 里接收数据,使用的 recvfrom

data=client socket.recv(1024)# tcp 里使用 recv 获取数据

print('接收到了{}客户端{}端口号发送的数据,内容是:

{}'.format(client_addr[0],client_addr[1],data.decode(‘utf8’))

2.说明

 

三.补充解释

1.队列排队

s.listen(128) 这里的 128 相当于排队,达到服务器最大处理能力时,其他用户要在队列里面排队

当服务器的极限处理是 1000 时 有 1120 个时 120 个在排队

当服务器的极限处理是 1000 时 有 1130 个时 128 个在排队 多余的 2 个不能排队,显示连接失败

2. data=client socket.recv(1024)客户端发数据给服务器的网卡 recv(1024) 是每次读取网卡中 1024 个字节

3. 首先创建一个 socket 连接,然后写入监听功能,用 x=s.accept() 接收客户端的请求。

这时我们的 TCP 服务端是 windows,会不断等待连接,当有客户端连接时x=s.accept() 会接收到客户端的要求,接收到的结果是一个元组第 0 个元素是客户端的 socket 连接,第 1 个元素是客户端的ip地址和端口号可以把元组拆成两个变量 client_socket 表示客户端连接。

然后用 data=client socket.recv(1024)获取服务器网卡里的数据

 

四. TCP注意事项

1.tcp 服务器一般情况下都需要绑定,否则客户端找不到这个服务器。

2. tcp 客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的 ip、 port 等信息就好,本地客户端可以随机。

3. tcp 服务器中通过 listen 可以将 socket 创建出来的主动套接字变为被动的,这是做 tcp 服务器时必须要做的。

4. 当客户端需要链接服务器时,就需要使用 connect 进行链接,udp 是不需要链接的而是直接发送,但是 tcp 必须先链接,只有链接成功才能通信。

5. 当一个 tcp 客户端连接服务器时,服务器端会有 1 个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务。

6. listen 后的套接字是被动套接字,用来接收新的客户端的链接请求的,而 accept 返回的新套接字是标记这个新客户端的。

7.关闭 listen 后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。

8.关闭 accept 返回的套接字意味着这个客户端已经服务完毕

9.当客户端的套接字调用 close 后,服务器端会 recv 解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线。

相关文章
|
2月前
|
网络协议 安全 测试技术
手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
手撕测试tcp服务器效率工具——以epoll和io_uring对比为例
40 2
|
3月前
|
网络协议
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)(下)
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
35 2
|
1月前
|
网络协议 Java
【开源视频联动物联网平台】J2mod库写一个Modbus TCP 服务器
【开源视频联动物联网平台】J2mod库写一个Modbus TCP 服务器
63 0
|
2月前
|
网络协议 Java API
【JavaEE初阶】 TCP服务器与客户端的搭建
【JavaEE初阶】 TCP服务器与客户端的搭建
|
2月前
|
数据采集 网络协议 搜索推荐
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
52 0
|
3月前
|
网络协议 安全 Linux
腾讯三面:一台服务器,最大支持的TCP连接数是多少?
一个 TCP 对象占用的大小,等于它所包含的一些数据结构占用大小的总和,也是就把上面这些数据结构的大小累加起来,就是一个 TCP 连接占用的大小了。实际过程中的 TCP 连接,肯定不是静止状态的,还会进行发送数据和接收数据了,那么这些过程还是会额外消耗更多的内存资源的,8 GB 物理内存的服务器实际并发很难达到百万级别。
56 2
|
3月前
|
网络协议 安全 Go
TCP基础详解:Telnet回音服务器搭建
TCP基础详解:Telnet回音服务器搭建
30 0
|
3月前
|
网络协议 Linux
【Linux C TCP服务器端-epoll案例】
本文主要介绍了linux下Select的TCP通信流程,实现了客户端和服务器的通信,主要实现了消息的回发,即服务器将消息原封不动的回发给客户端。
25 0
|
3月前
|
网络协议 Linux
【Linux C TCP服务器端-poll案例】
本文主要介绍了linux下Select的TCP通信流程,实现了客户端和服务器的通信,主要实现了消息的回发,即服务器将消息原封不动的回发给客户端。
24 0
|
3月前
|
网络协议 Linux
Linux C TCP服务器端-select案例
本文主要介绍了linux下Select的TCP通信流程,实现了客户端和服务器的通信,主要实现了消息的回发,即服务器将消息原封不动的回发给客户端。
33 0