TCP和并发服务器

与UDP不同的是,他是一个面向连接的,可靠的数据传输协议

TCP通信比较复杂

先写一个TCP服务器,一般步骤如下:

1、首先是要创建一个socket套接字:socket()

2、服务器一般是需要一个固定的IP地址和固定端口号,服务器就要绑定这个IP地址和端口号:bind()

3、客户端连接服务器是是有一定的数量(允许最大连接数)的,而这个数量是服务器设定的:listen()

4、上面3步是做被连接的准备,这一步是来接受客户端的数据,在接受数据之前,服务器还是需要接受客户端的socket套接字和IP地址:accept()

5、只有服务器和客户端绑定相同的IP地址,服务器和客户端才可以互相接收数据和发送数据,常理来想,服务器是一只被开启的,也是一直接受数据,所以在接受数据的过程中,我们需要无限循环:recv()

6、如果我们要发送数据给客户端,客户端也需要绑定上面的地址,然后需要调用相应的函数send()

import socket

# TCP
# 创建一个服务器socket套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 服务器的IP地址和端口号
address = ("127.0.0.1", 9999)
# 服务器绑定地址
server_socket.bind(address)
# 设置服务器的最大连接数
server_socket.listen(1)
# 创建一个等待连接的客户端socket套接字,accept()函数会返回两个值,可以自行打印
client_socket, address = server_socket.accept()
# 服务器需要不停的接受客户端的发来的数据
while True:
"""
以防客户端连接失败,需要检测异常
无论是接受数据还是发送数据,我们需要将数据统一编码和解码
"""
try:
data = client_socket.recv(2048).decode("UTF-8")
# 数据处理
print("服务器接受的数据:", data) # 服务器接受的数据:我是一个客户端
client_socket.send("我是一个服务器".encode("UTF-8"))
except:
break

再写一个TCP客户端,一般步骤如下:

1、首先是要创建一个socket套接字:socket()

2、客户端一般是不需要一个固定的IP地址和固定端口号,连接服务器的时候系统会自动分配端口号

3、客户端连接服务器必须先知道服务器的IP地址和端口号,然后在连接服务器:connect()

4、上面3步是做连接的准备,这一步是来发送客户端的数据:send()

5、客户端也可以一直接受服务器发来的数据,所以在接受数据的过程中,我们需要无限循环:recv()

import socket

# 客户端需要创建一个套接字
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 客户端需要连接服务器,必须先知道服务器的IP地址和端口号
address = ("127.0.0.1", 9999) # 连接服务器
client_socket.connect(address) # 这个数据是将要发送的数据
data = "我是一个客户端"
client_socket.send(data.encode("UTF-8"))
while True:
"""
以防服务器中断退出,需要检测异常
无论是接受数据还是发送数据,我们需要将数据统一编码和解码
"""
try:
data = client_socket.recv(2048).decode("UTF-8")
# 数据处理,这里打印出来并且将数据发回客户端
print("客户端接受的数据:", data)
except:
break

并发服务器,这里我只介绍多线程服务器,进程和线程是差不多的)

  在TCP服务器的原有基础上增加一个线程,再将监听数增加为5,就可以允许5个客户端线程同时访问,并且可同时发送和接受数据

import socket
from threading import Thread # TCP
# 创建一个服务器socket套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 服务器的IP地址和端口号
address = ("127.0.0.1", 9999) def net_connect():
try:
# 服务器绑定地址
server_socket.bind(address)
# 设置服务器的最大连接数
server_socket.listen(5)
except:
return
# 创建线程
th = Thread(target=recv_data)
th.start() def recv_data():
# 服务器需要不停的接受客户端的发来的数据
while True:
"""
以防客户端连接失败,需要检测异常
无论是接受数据还是发送数据,我们需要将数据统一编码和解码
"""
# 创建一个等待连接的客户端socket套接字,accept()函数会返回两个值,可以自行打印
client_socket, address = server_socket.accept()try:
data = client_socket.recv(2048).decode("UTF-8")
# 数据处理
print("服务器接受的数据:", data)
client_socket.send("我是一个服务器".encode("UTF-8"))
except:
break net_connect()

在TCP客户端上也增加一个线程,然后同时运行多次这个客户端程序:

import socket

# 客户端需要创建一个套接字
from threading import Thread client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 客户端需要连接服务器,必须先知道服务器的IP地址和端口号
address = ("127.0.0.1", 9999) def net_connect():
try:
# 连接服务器
client_socket.connect(address)
except:
return
th = Thread(target=recv_data)
# th.setDaemon(True)
th.start() def recv_data():
# 这个数据是将要发送的数据
data = "我是一个客户端"
client_socket.send(data.encode("UTF-8")) while True:
"""
以防服务器中断退出,需要检测异常
无论是接受数据还是发送数据,我们需要将数据统一编码和解码
"""
try:
data = client_socket.recv(2048).decode("UTF-8")
# 数据处理,这里打印出来并且将数据发回客户端
print("客户端接受的数据:", data)
except:
break net_connect()

python高级编程——网络编程(三)的更多相关文章

  1. python高级之网络编程

    python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及其源码分析 1.网络通信概念 说 ...

  2. 第六篇:python高级之网络编程

    python高级之网络编程   python高级之网络编程 本节内容 网络通信概念 socket编程 socket模块一些方法 聊天socket实现 远程执行命令及上传文件 socketserver及 ...

  3. python语法基础-网络编程-TCP协议和UDP协议

    ###############    网络编程    ############## """ 网络编程 学习了Python基础之后,包括函数,面向对象等,你就可以开发了,你 ...

  4. Python之路 - 网络编程之粘包

    Python之路 - 网络编程之粘包 粘包

  5. Python之路 - 网络编程初识

    Python之路 - 网络编程初识 前言

  6. Python中级 —— 04网络编程

    网络编程 网络编程对所有开发语言都是一样的,Python也不例外.用Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信. TCP编程 TCP建立可靠连 ...

  7. python高级编程——网络编程(一)

    计算机网络基础 概念:计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的通信.而网络编程就是开发计算机网络应用程序 计算机的通信协议 概念:计 ...

  8. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  9. 【循序渐进学Python】15.网络编程

    Python 内置封装了很多常见的网络协议的库,因此Python成为了一个强大的网络编程工具,这里是对Python的网络方面编程的一个简单描述. 1. 常用的网络设计模块 在标准库中有很多网络设计相关 ...

  10. python 之socket 网络编程

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Un ...

随机推荐

  1. Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来,layer.load延迟)

    今天想做一个点击地市用ajax重新获取数据刷新页面功能,因为ajax属于耗时操作,想在获取数据且加载页面时显示加载遮罩层,结果发现了ajax的好多坑. 例如如上栗子,我想点击按钮让遮罩层显示,ajax ...

  2. 【洛谷P5331】 [SNOI2019]通信

    洛谷 题意: \(n\)个哨站排成一列,第\(i\)个哨站的频段为\(a_i\). 现在每个哨站可以选择: 直接连接到中心,代价为\(w\): 连接到前面某个哨站\(j(j<i)\),代价为\( ...

  3. lf 前后端分离 (2) 课程数据获取,Serializer的返回

    一.关于课程数据的返回 在进行前后端分离时,会通过def 进行前后端传值, 本质上遵循rest 网址规范  增删改查查 get,post,put,del get(\d+) 1.在从数据库获取数据后,进 ...

  4. JS高阶---定时器相关

    首先看几个问题: [主体] (1)定时器真的时定时执行的吗? 顺序验证: 测试结果: 接下来对上述代码做下修改,增加一个长时间工作的消耗,此时再来验证下定时器运行的精准度 结果如下: (2)定时器回调 ...

  5. vue-router路由传参之query和params

    首先简单来说明一下$router和$route的区别 //$router : 是路由操作对象,只写对象 //$route : 路由信息对象,只读对象 //操作 路由跳转 this.$router.pu ...

  6. 201871010108-高文利《面向对象程序设计(java)》第十二周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...

  7. nginx 配置使用index.php作为目录的默认加载文件

    配置如下: 在server增加一行: index index.php index.html index.htm default.php default.htm default.html 增加后如下: ...

  8. node端console.log输出不同颜色文字

    我们知道console.log直接输出是按着终端的默认颜色来显示的, console.log('message') 那么如何指定他们的颜色显示呢?很简单,直接再加一个参数就可以了,例如: consol ...

  9. <BackTracking> dfs: 39 40

    39. Combination Sum Combination,组合问题用DFS罗列全部的答案. class Solution { public List<List<Integer> ...

  10. Educational Codeforces Round 57 (Rated for Div. 2) D dp

    https://codeforces.com/contest/1096/problem/D 题意 给一个串s,删掉一个字符的代价为a[i],问使得s的子串不含"hard"的最小代价 ...