网络知识
127.0.0.1是自己电脑上两个程序要通信可以采用的ip地址
套接字可以发也可以收数据,发过去的时候等于堵塞在对方程序中等待发的内容
单工:收音机(只能收或者发)
半双工:对讲机(可收可发,但不可同时进行)
全双工:打电话(收发同时进行
socket套接字是全双工
tcp通信、步骤
此外使用udp没有tcp安全udp会出现丢包现象(譬如写一封信,信在途中丢了也不知道)
但是tcp对方接收出现乱码现象会使得对方重发一遍(tcp是打电话模型,发送信息之前先保证两个端口之间网络连通(即通信之前必须先建立连接))
tcp发送信息给对方 接收者回应会回送数据给发送者。如果接收者在一定时间内没有发送则发送者超时重传重新发送
cp有错误校验(在发送前有一份发送清单,接收者拿到后根据发货清单来看货物,如果出错说明货物丢失,要求发送者重新发送)
流量阻塞(发送者发送5g文件,为了避免路上丢失,拆分成五份1g,当接收者受到1g东西时接收者说受到了在继续发下一份。此外如果要发送的内容大小为50g但是对方端口程序只能处理5g左右,一次性发送过大数据导致接收者端口卡死。所以流量堵塞很有必要)
tcp和udp不同,udp有发送和接收数据,但是tcp严格区分客户端和服务器。像qq就是客户端,而腾讯服务器为发送数据者
tcp通信大概
- 建立连接
- 发送数据
- 解除连接
tcp客户端通信步骤:
创建套接字
与udp不同tcp是SOCK_STREAM
连接服务器
收发数据
关闭套接字
tcp服务端步骤
创建套接字(服务器有两个套接字,一个是accept来监听大家的需求,接听到后立马产生新的套接字为监听到的对象服务)
bind绑定ip和port
listen使得套接字变为可以被动连接
accept等待客户端连接
接发数据
有存在一个客户多次服务的状况的时候不能立即关闭第二个套接字,反而是判断ta是否还需要服务
当客户点界面上的关闭的时recv收到一个空的数据给定义变量recv_data 此时判断如果recv_data为空时怎可关闭套接字
注意图中recv解堵塞的问题:
客户端发回数据
客户端调用close
import socket
2
3 def main():
4 tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
5 tcp_server_socket.bind(("",32230))
6 tcp_server_socket.listen(128)
7 print("------1----")
8 print("等待一个客户端")
9 while True:
10 # 可以实现一直监听直到其关闭的时候才close
11 new_client_socket,client_addr = tcp_server_socket.accept()
12 print("--------2----------")
13 print(client_addr)
14 while True:
15 recv_data = new_client_socket.recv(1024)
16 print(recv_data)
17 new_client_socket.send("hahahahok".encode("utf-8"))
18 new_client_socket.close()
19 print("这次服务到此结束")
20 tcp_server_socket.close()
21
22 if __name__ == "__main__":
23 main()
~
~
~
~
~
以上为最后完整代码
需要提示:代码逻辑
此次编写代码为python语言模拟服务器端 网络调试助手为客户端
功能为服务器接受客户端发送的数据
所以运行前先保证服务器的开着的(既代码先运行
运行后可以看到命令行处堵塞等待客户端发送数据。
此时网络调试助手点连接网络才可以连的上
同时向服务器发送数据
同时服务器收到客户端发送数据