2.Python网络编程_TCP(简略版)

TCP监听套接字:
当新的客户端请求连接时,服务器端监听套接字收到消息,会分配一个新的套接字对应于客户端(新socket包括四部分:源IP、源端口号、目的IP、目的端口号)用于接收客户端的消息,仔细观察可以看出对于不同的客户端每个新产生的套接字的源IP和源端口号都是一样的,目的IP和目的端口号则不同,说明四元组只要其中一个不相同,这个socket就是不一样的.

#tcp客户端
import socket def cilent():
#1.创建TCP套接字
# socket.AF_INET:IPV4 socket.SOCK_STREAM:TCP
socket_tcp_cilent=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #客户端一般不绑定(bind)ip和port
#2.连接服务器
server_ip='192.168.1.103'
server_port=5566
server_addr=(server_ip,server_port)
socket_tcp_cilent.connect(server_addr) while True:
#3.发送数据/接收数据
send_data=input("请输入要发送的数据: ")
if send_data=='exit':
print("客户端关闭!")
break
socket_tcp_cilent.send(send_data.encode('utf-8'))
recv_data,recv_ip_port=socket_tcp_cilent.recvfrom(1024)
print("服务器端回送的消息%s"%(recv_data.decode('gbk'))) #4.关闭TCP连接
socket_tcp_cilent.close() if __name__=='__main__':
cilent();
#TCP服务器端
import socket def server():
num=1
#1.创建套接字
socket_tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #2.绑定本地信息 bind(ip,port)
server_ip=''
server_port=5566
server_addr=(server_ip,server_port)
socket_tcp_server.bind(server_addr) #3.让默认的套接字由主动变为被动 listen
#监听套接字:负责等待新的各个客户端进行连接
socket_tcp_server.listen(128) #4.等待客户端的连接 accept
# 程序执行的到这里默认阻塞,当客户端连接服务端时,解阻塞
# accept 返回一个二元元组,第一个是新的套接字,第二个是客户端
# accept 负责产生新的套接字为客户端服务
while True:
print('等待一个新的客户端的到来...')
new_cilent_socket,cilent_addr=socket_tcp_server.accept()
#accept返回的新socket包括四部分:源IP、源端口号、目的IP、目的端口号,这个四元组确定一个套接字
#仔细观察可以发现对应于每个客户端的新分配的socket的源IP和源端口号是一样的,目的IP和目的端口号是不一样的
#四元组一个不一样,就是一个不同的socket
#具体见 https://blog.csdn.net/woxiaohahaa/article/details/78038442
print('新分配的套接字: ',new_cilent_socket)
print('一个新的客户端已经到来%s'%str(cilent_addr))
while True: #循坏多次,为同一个客户端服务多次
#使用新分配的套接字,接收客户端发送过来的请求
#如果recv阻塞,两种方式解阻塞:
#1.客户端发送过来数据
#2.客户端调用close导致
try:
recv_data=new_cilent_socket.recv(1024) #接收到普通数据
except:
break
print('客户端发送过来的请求是:%s'%recv_data.decode('utf-8'))
#如果客户机不需要服务了,当客户端socket.close()执行时,服务器套接字的消息会为空(recv解阻塞)
#回送部分数据给客户端
new_cilent_socket.send('-------ok-------'.encode('utf-8'))
#关闭套接字
new_cilent_socket.close()
print('%d号客户机已经服务完毕!'%num)
num+=1
#关闭套接字
socket_tcp_server.close() if __name__=='__main__':
server()
2.Python网络编程_TCP(简略版)的更多相关文章
- 1.Python网络编程_UDP(简略版)
# -*- coding: utf-8 -*- #2019-11-24 import socket def recv(): udp_socket=socket.socket(socket.AF_INE ...
- python 网络编程第四版
使用SocketServer 模块来完成服务端编程 1.服务端代码如下: #!/usr/bin/python #!coding:utf-8 import SocketServer as sockets ...
- python 网络编程第三版
为服务端增加多线程解决方案 1.服务端代码如下: ***这个版本并没有真正的起到多线程的作用,主要原因在于t.join():以后的版本会改进这个问题*** #!/usr/bin/python #!co ...
- Python网络编程基础 PDF 完整超清版|网盘链接内附提取码下载|
点此获取下载地址提取码:y9u5 Python网络编程最好新手入门书籍!175个详细案例,事实胜于雄辩,Sockets.DNS.Web Service.FTP.Email.SMTP.POP.IMAP. ...
- Python网络编程基础pdf
Python网络编程基础(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1VGwGtMSZbE0bSZe-MBl6qA 提取码:mert 复制这段内容后打开百度网盘手 ...
- python网络聊天器多线程版
在之前的一篇文章(python网络编程-udp)中实现了一个简单的udp聊天器,只能在单线程下进行收发数据,在学习完多线程之后,实现一个能同时收发数据的udp聊天器. 说明: 编写一个有2个线程的程序 ...
- Python网络编程(一)
最近在啃<python核心编程(第三版)>,感觉这本书并不是特别的友好,虽然有基于python3提出的改进代码:但是整书的基准感觉还是在python2.7.所以python3的代码中还是有 ...
- 28、Python网络编程
一.基于TCP协议的socket套接字编程 1.套接字工作流程 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 ...
- 图解Python网络编程
返回目录 本篇索引 (1)基本原理 (2)socket模块 (3)select模块 (4)asyncore模块 (5)asynchat模块 (6)socketserver模块 (1)基本原理 本篇指的 ...
随机推荐
- Thread <number> cannot allocate new log, sequence <number>浅析
有时候,你会在ORACLE数据库的告警日志中发现"Thread <number> cannot allocate new log, sequence <number> ...
- Linux:nginx服务器的搭建
搭建nginx网站服务器 安装nginx yum install nginx 启动服务 安装完成后启动服务 systemctl start nginx 通过浏览器测试 地址栏输入localhost 不 ...
- 程序运行时间测试 - 使用系统函数 getrusage 获取程序运行时间
https://github.com/yaowenxu/Workplace/blob/master/timer/getrusagetimer.c 关键结构体: struct rusage { stru ...
- 【转载】C++:switch红色下划线,Error:控制传输跳过的实例化解决办法
转载链接:https://blog.csdn.net/figoleon/article/details/50072029
- java(二)变量
基础数据类型: 数值型:整型(byte.short.int.long).浮点型(float.double)java各整数类型有固定的表数范围和字段长度,不受具体os的影响,以保持java的可移植性:j ...
- npm 被墙怎么办
npm install typescript --registry=http://registry.npm.taobao.org 使用下面的命令.
- php 压缩字符串
压缩字符串: base64_encode(gzcompress(serialize($data))) 解压字符串: unserialize(gzuncompress(base64_decode($se ...
- 1+x 证书 Web 前端开发中级理论考试(试卷 6 )
1+x 证书 Web 前端开发中级理论考试(试卷 6 ) 官方QQ群 1+x 证书 web 前端开发初级对应课程分析 http://blog.zh66.club/index.php/archives/ ...
- vue中的父子组件相互调用
vue中的父子组件相互调用: 1.vue子组件调用父组件方法:子组件:this.$emit('xx'); 父组件:定义yy方法,并在引用子组件时传参,如@xx="yy" 2.vue ...
- SPU和SKU介绍及区别
一.spu概念 SPU = Standard Product Unit (标准化产品单元) SPU是商品信息聚合的最小单位,是一组可复用.易检索的标准化信息的集合,该集合描述了一个产品的特性.通俗点讲 ...