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 ...
随机推荐
- 2.安装 Android SDK
安装Android SDK Android SDK(Software Development Kit,软件开发工具包)提供了 Android API 库和开发工具构建,测试和调试应用程序.简单来讲,A ...
- ZT在谷歌上班感受如何?
在谷歌上班感受如何? 2013-11-05 作者:腾讯科技 出处: 互联网 责编:zlu 在谷歌这家全球最大最有抱负的技术公司工作将是怎样的情景呢?是天堂般的享受,还是地狱般的折磨呢?下面看一 ...
- 关于SessionFactory的不同实现类分别通过getCurrentSession()方法 和 openSession() 方法获取的Session对象在保存对象时的一些区别
一.单向多对一关联关系 一).使用LocalSessionFactoryBean类,即在applicationContext中配置的 <!-- 配置SessionFactory 使用LocalS ...
- HDU 5687 Problem C 【字典树删除】
传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...
- 解决 Database Configuration Assistannt安装oracle实例使的 警告
在创建到85%的时候报错,错误如下: 解决办法: 经过查看警告中给出的日志文件F:\develop\oracle_data\app\Administrator\cfgtoollogs\dbca\tes ...
- Android学习笔记_13_网络通信之多个上传文件
一.获取HTTP协议: 建立一个Web项目,建立一个如下所示的jsp界面,用IE捕获表单提交信息. <%@ page language="java" contentType= ...
- 【题解】UVA11584 Partitioning by Palindromes
UVA11584 https://www.luogu.org/problemnew/show/UVA11584 暑假开始刷lrj紫/蓝书DP题 这几天做的一道 思路 预处理出所有的回文串是否存在 前提 ...
- 12java基础继承
26.定义类Human,具有若干属性和功能:定义其子类Man.Woman: 在主类Test中分别创建子类.父类和上转型对象,并测试其特性. package com.hry.test; public ...
- U盘空间释放
U盘做成启动盘后,怎么释放空间,恢复到原来的容量.这里有个帖子,我觉得很方便,不用安装什么东西,简单直接. http://blog.sina.com.cn/s/blog_68f6e8a901014cv ...
- Android中得到布局文件对象有三种方式
Android中得到布局文件对象有三种方式 第一种,通过Activity对象 View view = Activity对象.getLayoutInflater().inflater(R.layout. ...