004---基于TCP的套接字
基于TCP的套接字
tcp是基于链接的,必须先启动服务端,然后再启动客户端去连接服务端。
之前实现的简单套接字就是基于TCP的,但是只能实现收发消息一次、服务器与客户端都断开了。不够过瘾。
通信循环版本
服务端
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01
import socket
ip_port = ('127.0.0.1', 8000)
buffer_size = 1024
service = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
service.bind(ip_port)
service.listen(5)
conn, addr = service.accept()
# 通信循环(c/s之间不只收发一次消息)
while 1:
msg = conn.recv(buffer_size)
print('客户端发来的消息:', msg.decode('utf-8'))
data = input('给客户端发的消息:')
conn.send(data.encode('utf-8'))
print('发生给客户端的消息成功:', data)
conn.close()
sk.close()
客户端
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01
import socket
ip_port = ('127.0.0.1', 8000)
buffer_size = 1024
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
client.connect(ip_port)
while 1:
msg = input('输入发给服务端的消息:').strip()
client.send(msg.encode('utf-8'))
data = client.recv(buffer_size)
print('服务端回复的消息:', data.decode('utf-8'))
client.close()
从图中可以看出有bug,当客户端强制端口连接,服务器那边会抛出异常。
还有就是客户端发送不了空消息(空格)。
小Bug修复
服务端
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01
import socket
ip_port = ('127.0.0.1', 8000)
buffer_size = 1024
service = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 有时候会出现端口占用的情况,加上下面代码
service.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
service.bind(ip_port)
service.listen(5)
conn, addr = service.accept()
# 通信循环(c/s之间不只收发一次消息)
while 1:
try:
msg = conn.recv(buffer_size)
if not msg:
print('客户端主动退出')
break
print('客户端发来的消息:', msg.decode('utf-8'))
data = input('给客户端发的消息:')
conn.send(data.encode('utf-8'))
print('发生给客户端的消息成功:', data)
except ConnectionResetError as con:
print('客户端强制退出')
break
conn.close()
service.close()
客户端
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01
import socket
ip_port = ('127.0.0.1', 8000)
buffer_size = 1024
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
client.connect(ip_port)
while 1:
msg = input('输入发给服务端的消息(q/Q退出):').strip()
if not msg:
print('不能发送空消息给服务器')
continue
if msg.upper() == 'Q':
print('正在主动退出')
break
client.send(msg.encode('utf-8'))
data = client.recv(buffer_size)
print('服务端回复的消息:', data.decode('utf-8'))
client.close()
print('exit ok')
连接循环版本
虽然没啥大问题。但是还有一个大问题,就是只能有一个客户端连接。客服端正常断开或者强制断开,服务器也会跟着断,并不能保证其他客户端来连接。
服务器
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01
import socket
ip_port = ('127.0.0.1', 8000)
buffer_size = 1024
service = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
# 有时候会出现端口占用的情况,加上下面代码
service.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
service.bind(ip_port)
service.listen(5)
while 1:
# 连接循环(客户端断开之后其他客户端还能连接。
conn, addr = service.accept()
while 1:
# 通信循环(c/s之间不只收发一次消息)
try:
msg = conn.recv(buffer_size)
if not msg:
print('客户端主动退出')
break
print('客户端发来的消息:', msg.decode('utf-8'))
data = input('给客户端发的消息:')
conn.send(data.encode('utf-8'))
print('发生给客户端的消息成功:', data)
except ConnectionResetError as con:
print('客户端强制退出')
break
conn.close()
service.close()
客户端
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "ziya"
# Date: 2019-02-01
import socket
ip_port = ('127.0.0.1', 8000)
buffer_size = 1024
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
client.connect(ip_port)
while 1:
msg = input('输入发给服务端的消息(q/Q退出):').strip()
if not msg:
print('不能发送空消息给服务器')
continue
if msg.upper() == 'Q':
print('正在主动退出')
break
client.send(msg.encode('utf-8'))
data = client.recv(buffer_size)
print('服务端回复的消息:', data.decode('utf-8'))
client.close()
print('exit ok')
004---基于TCP的套接字的更多相关文章
- Day9 基于TCP的套接字和基于UDP的套接字
服务端: ss=socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听套接字, inf_loop: #服务器无限循环 cs=ss.accept( ...
- 基于TCP的套接字
tcp服务端 1 ss = socket() #创建服务器套接字 2 ss.bind() #把地址绑定到套接字 3 ss.listen() #监听链接 4 inf_loop: #服务器无限循环 5 c ...
- 基于tcp的套接字编程
一,基础版服务器端客户端(一收一发,只有一个客户端链接) 服务器端: #Author : Kelvin #Date : 2019/1/28 22:10 from socket import * ser ...
- python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议
socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...
- 基于UDP的套接字、粘包问题
一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...
- 【Java】Java网络编程菜鸟进阶:TCP和套接字入门
Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protoco ...
- UDP,TCP的套接字编程的Python实现
UDP,TCP的套接字编程的Python实现 套接字:连接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识自己,然后通过套接字调用运输层为其服务,网络应用程序只能指定自己要使用的网络类型 ...
- Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信
一:基于多线程实现套接字 可添加多个客户端 from socket import * from threading import Thread def comunicate(conn): while ...
- python TCP socket套接字编程以及注意事项
TCPServer.py #coding:utf-8 import socket #s 等待链接 #c 实时通讯 s = socket.socket(socket.AF_INET,socket.SOC ...
随机推荐
- apache-实战(一)
Apache 1.html的完整格式 # vim /var/www/html/index.html<html><head><title>我要</title& ...
- 诊断GRID无法启动问题
诊断 Grid Infrastructure 启动问题 (文档 ID 1623340.1)
- 别跑了,看看脚下有木有money
别跑了,看看脚下有木有money 1.长大论坛 本来是想做个博客的,无奈级别不够,博客过于复杂,所以就做了这个类似于贴吧的东西.在这里,你可以发帖:可以吐槽学校.可以向他人寻求帮助.甚至可以 ...
- chrome不能用百度网盘极速上传插件的解决办法
进入chorme设置中,选择隐私设置中的内容设置,插件>自动运行,然后管理例外情况>添加“[*.]baidu.com”,后边当然选择允许,然后重启浏览器,OK了
- mxnet数据操作
# coding: utf-8 # In[2]: from mxnet import nd # In[3]: x = nd.arange(12) x # In[4]: x.shape,x.size # ...
- Educational Codeforces Round 10 D. Nested Segments 【树状数组区间更新 + 离散化 + stl】
任意门:http://codeforces.com/contest/652/problem/D D. Nested Segments time limit per test 2 seconds mem ...
- 2018.10.2 Eclipse中如何测地修改一个we项目步骤
找到项目的web.xml文件 大概的路径如下: 修改xml文件中的display-name 节点的值 下一步就是切换工作目录 显示的效果 打开最后一个文件修改 接下来找到这个文件 是部署的时候用的 运 ...
- 【luogu P4711 「化学」相对分子质量】 题解
题目链接:https://www.luogu.org/problemnew/show/P4711 要细心模拟 #include <cstdio> #include <algorith ...
- redis的安装和启动linux环境
启动客户端连接redis服务,redis-cli -p(端口) -h(登录的服务的ip地址);不添加任何参数和选项直接使用redis-cli将会默认登录6379,默认使用ip 127.0.0.1#re ...
- 虚拟局域网VLAN的配置实验
实验涉及命令以及知识补充 交换机的不同状态 switch: :交换机的ROM态 rommon> :路由器的R状态 switch > :用户模式 switch# :特权模式 switch(c ...