基于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的套接字的更多相关文章

  1. Day9 基于TCP的套接字和基于UDP的套接字

    服务端: ss=socket() #创建服务器套接字 ss.bind() #把地址绑定到套接字 ss.listen() #监听套接字, inf_loop: #服务器无限循环 cs=ss.accept( ...

  2. 基于TCP的套接字

    tcp服务端 1 ss = socket() #创建服务器套接字 2 ss.bind() #把地址绑定到套接字 3 ss.listen() #监听链接 4 inf_loop: #服务器无限循环 5 c ...

  3. 基于tcp的套接字编程

    一,基础版服务器端客户端(一收一发,只有一个客户端链接) 服务器端: #Author : Kelvin #Date : 2019/1/28 22:10 from socket import * ser ...

  4. python笔记8 socket(TCP) subprocess模块 粘包现象 struct模块 基于UDP的套接字协议

    socket 基于tcp协议socket 服务端 import socket phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 买 ...

  5. 基于UDP的套接字、粘包问题

    一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...

  6. 【Java】Java网络编程菜鸟进阶:TCP和套接字入门

    Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protoco ...

  7. UDP,TCP的套接字编程的Python实现

    UDP,TCP的套接字编程的Python实现 套接字:连接应用层和运输层,应用层的网络应用程序使用IP地址+端口号来标识自己,然后通过套接字调用运输层为其服务,网络应用程序只能指定自己要使用的网络类型 ...

  8. Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信

    一:基于多线程实现套接字 可添加多个客户端 from socket import * from threading import Thread def comunicate(conn): while ...

  9. python TCP socket套接字编程以及注意事项

    TCPServer.py #coding:utf-8 import socket #s 等待链接 #c 实时通讯 s = socket.socket(socket.AF_INET,socket.SOC ...

随机推荐

  1. Selenium2学习(七)-- 定位一组元素find_elements

    前言 前面的几篇都是讲如何定位一个元素,有时候一个页面上有多个对象需要操作,如果一个个去定位的话,比较繁琐,这时候就可以定位一组对象. webdriver 提供了定位一组元素的方法,跟前面八种定位方式 ...

  2. 【java开发系列】—— 嵌套类与内部类

    嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法. 嵌套类与内部类的结构如下图 静态嵌套类 静态嵌套类,是一种在类之外声明的嵌套类,由于是静态的,所以不经过初 ...

  3. ORACLE不使用工具的情况下获取对象DDL

    set line 200set pagesize 0set long 99999set feedback offset echo off获得表.索引.视图.存储过程.函数的DDL:select dbm ...

  4. March 10 2017 Week 10 Friday

    If you love life, life will love you back. 爱生活,生活也会爱你. Love life, and it will love you back. All thi ...

  5. 我的HTML总结之表单

    表单是Web中实现交互的重要方法,用于收集用户信息并提交给服务器.   表单中的9大控件 <input type="text" name="key" va ...

  6. 【Unity3D】【NGUI】UIRect的Anchor的使用

    NGUI版本号:3.6.5 以以下的图,解释下主要的Anchors的使用(能够通过官方的Anchor和Chat样例进行深入学习) Target不是一定要是Sprite.能够是随意的UIRect(UIS ...

  7. 动态规划(DP),递推,最大子段和,POJ(2479,2593)

    题目链接:http://poj.org/problem?id=2479 解题报告: 1.再求left[i]的时候,先没有考虑a[i]的正负,先把a[i]放到left[i]中,然后left=max(le ...

  8. AFN 切换BaseUrl

    在某个特定的接口需要修改baseurl时: 直接使用kvc: [_sessionManager setValue:[NSURL URLWithString:NEW_BASE_URL] forKey:@ ...

  9. Intellij IDEA中Maven解决依赖失效

    最近在折腾Maven和Sonatype的Nexus, 倒霉催的国内和公司网络... Nexus配合finalspeed或者kcptun倒是很给力,  但是Intellij就经常出问题, 出现红字也不动 ...

  10. html或jsp页面自动提交,无需每次重启服务

    从eclipse转到idea遇到各种问题,之前eclipse可以自动保存页面内容无需重启服务,但是idea不可以,网上找了n种办法也没用,可能版本不一样吧,把我的解决方法纪录一下,方便以后有人遇到这个 ...