基于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. 【Spring实战】—— 9 AOP环绕通知

    假如有这么一个场景,需要统计某个方法执行的时间,如何做呢? 典型的会想到在方法执行前记录时间,方法执行后再次记录,得出运行的时间. 如果采用Spring的AOP,仅仅使用前置和后置方法是无法做到的,因 ...

  2. 用AutoHotkey调整Windows音量

    我用了[右Alt]+方向键来调整音量:Alt+上下键,音量调整幅度为5,如果再增加个右Ctrl,音量调整幅度为1. Alt+左键为静音,Alt+右键为最大音量. >!Up:: ;音量+ < ...

  3. vs2010开发链接服务器出现错误(SourceSafe)

    用vs2010开发项目链接服务器时出现 之前是因为权限问题,每次打开项目文件时 ,都要先直接进服务器然后打开项目. 用了两天,又不行了.就这个问题已经问了了老大不下3次了. 其实很是不想再麻烦他老人家 ...

  4. Haskell 与范畴论-函子、态射、函数

    范畴论基本概念 如果你是第一次听说范畴论(category theory),看到这高大上的名字估计心里就会一咯噔,到底数学威力巨大,光是高等数学就能让很多人噩梦连连.和搞编程的一样,数学家喜欢将问题不 ...

  5. 2019.03.19 ZJOI2019模拟赛 解题报告

    得分: \(100+10+45=155\)(\(T1\)又是水题,\(T2\)写暴力,\(T3\)大力\(STL\)乱搞) \(T1\):哈夫曼树 首先,根据题目中给出的式子,可以发现,我们要求的其实 ...

  6. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 && 离散化】

    任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...

  7. 2018.11.15 Nginx服务器的使用

    Nginx简单教程 1.什么是Nginx? Nginx(engine x)是一款轻量级的Web服务器.反向代理服务器及电子邮件(IMAP/POP3)代理服务器 什么是反向代理服务器? 反向代理方式是指 ...

  8. webstorm识别php代码

    在 setting --editor--filetype---找到html 在下面的框里点右边加好,添加*.php

  9. 二、IntelliJ IDEA 安装目录的核心文件讲解

    首先,咱们回顾一下前两篇关于 IntelliJ IDEA 的博文的内容: 在“在 Windows 系统下安装 IntelliJ IDEA 的方法”中,咱们知道了在 Windows 系统下如何下载并安装 ...

  10. Dependency Injection in ASP.NET Web API 2 (在web api2 中使用依赖注入)

    原文:http://www.asp.net/web-api/overview/advanced/dependency-injection 1 什么是依赖注入(Dependency Injection) ...