python+soket实现 TCP 协议的客户/服务端中文(自动回复)聊天程序

【吐槽】

网上的代码害死人,看着都写的言之凿凿,可运行就是有问题。

有些爱好代码、喜欢收藏代码的朋友,看到别人的代码就粘贴复制过来。可是起码你也试试运行看啊大哥

【正文】

昨日修改运行了UDP协议的C/S聊天程序,可是TCP协议的怎么都不行。各种试,各种坑。

做了下面几个修改后,终于可以了:

1、对发送、接收的信息,分别进行编码和解码

2、客户端的第13行bind改为connect(这真是个大坑!!)

(本文基于windows 7 + python 3.4)

完整代码如下(人头担保,本人亲测正常!):

 1 # tcp_server.py
 2 ‘‘‘服务器‘‘‘
 3
 4 from socket import *
 5 from time import ctime
 6
 7 HOST = ‘‘ #主机地址
 8 PORT = 23345 #端口号
 9 BUFSIZ = 2048 #缓存区大小,单位是字节,这里设定了2K的缓冲区
10 ADDR = (HOST, PORT) #链接地址
11
12 tcpSerSock = socket(AF_INET, SOCK_STREAM) #创建一个TCP套接字
13 tcpSerSock.bind(ADDR) #绑定地址
14 tcpSerSock.listen(5) #最大连接数为5
15
16 while True: #无限循环
17     print(‘尝试连接客户端。。。‘)
18     tcpCliSock, addr = tcpSerSock.accept() #等待接受连接
19     print(‘链接成功,客户端地址为:‘, addr)
20
21     while True:
22         data = tcpCliSock.recv(BUFSIZ) #接收数据,BUFSIZ是缓存区大小
23         if not data: break #如果data为空,则跳出循环
24         print(data.decode())
25
26         msg = ‘{} 服务器已接收 [自动回复]‘.format(ctime())
27         tcpCliSock.send(msg.encode())
28
29     tcpCliSock.close() #关闭连接
30
31 tcpSerSock.close() #关闭服务器
 1 # tcp_client.py
 2 ‘‘‘客户端‘‘‘
 3
 4 from socket import *
 5 from time import ctime
 6
 7 HOST = ‘localhost‘ #主机地址
 8 PORT = 23345 #端口号
 9 BUFSIZ = 2048 #缓存区大小,单位是字节,这里设定了2K的缓冲区
10 ADDR = (HOST, PORT) #链接地址
11
12 tcpCliSock = socket(AF_INET, SOCK_STREAM) #创建一个TCP套接字
13 #tcpCliSock.bind(ADDR) #绑定地址
14 tcpCliSock.connect(ADDR) #绑定地址
15
16 while True:
17     msg = input(‘请输入:‘) #输入数据
18     if not msg: break #如果 msg 为空,则跳出循环
19     tcpCliSock.send(msg.encode())
20
21     data = tcpCliSock.recv(BUFSIZ) #接收数据,BUFSIZ是缓存区大小
22     if not data: break #如果data为空,则跳出循环
23     print(data.decode())

【运行截图】

实验方法:先运行服务器端,然后运行客户端

然后就可以在客户端自由的与服务器端聊天了:

时间: 2024-08-06 07:51:18

python+soket实现 TCP 协议的客户/服务端中文(自动回复)聊天程序的相关文章

python+soket实现UDP协议的客户/服务端中文聊天程序

没什么特别的东西,网上烂大街的C/S框架.(基于windows 7 + python 3.4) 为了实现中文聊天,我加入了一点修改: msg.encode('utf-8') # msg 为输入(且将要发送出)的信息 data.decode('utf-8') # data 为接收的信息 这样做的原因是 sendto 函数只能发送ASCII字符,不支持发送中文(在 python3 中,中文默认是unicode编码). 所以,信息在送出之前要编码,在接收到信息之后要解码 完整的两个文件如下: #udp

TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q

TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q 一.TCP协议下的服务端并发 ''' 将不同的功能尽量拆分成不同的函数,拆分出来的功能可以被多个地方使用 TCP服务端实现并发 1.将连接循环和通信循环拆分成不同的函数 2.将通信循环做成多线程 ''' # 服务端 import socket from threading import Thread ''' 服务端 要有固定的IP和PORT 24小时不间断提供服务 能够支持并发 ''' server = sock

WCF 通过net tcp 协议 ,在服务端服务器和客户端服务器之间传输数据,注意配置事项

1. 特别注意  binding name="BindingBehaviorConfiguration" (名字可以随意取,但是必须要服务端和客户端保持一致) bindingConfiguration="BindingBehaviorConfiguration" 如何没有配置保持一致:出现:服务器已拒绝客户端凭据 如果没有配置:security mode="None", 出现的现象:服务器已拒绝客户端凭据 //----服务端配置实例: <?

python中基于tcp协议的通信(数据传输)

tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据链路层.物理层.可以说很多安全数据的传输通信都是基于tcp协议进行的. 为了让tcp通信更加方便需要引入一个socket模块(将网络层.数据链路层.物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作. 简单的tcp协议通信模板:(需要一个服务端和一个客户端) 服务端: fr

网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

UDP协议 (了解) 称之为数据包协议. 特点: 1) 不需要建立链接. 2) 不需要知道对方是否收到. 3) 数据不安全 4) 传输速度快 5)能支持并发 6) 不会粘包 7) 无需先启动服务端再启动客户端 优点: - 传输速度快 - 能支持并发 - 不会粘包 缺点: - 数据不安全, 容易丢失 应用场景: 早期的QQ聊天室. # server端 import socket # socket.SOCK_DGRAM ---> UPD协议 server = socket.socket(type=s

异步tcp通信——APM.Core 服务端概述

为什么使用异步 异步线程是由线程池负责管理,而多线程,我们可以自己控制,当然在多线程中我们也可以使用线程池.就拿网络扒虫而言,如果使用异步模式去实现,它使用线程池进行管理.异步操作执行时,会将操作丢给线程池中的某个工作线程来完成.当开始I/O操作的时候,异步会将工作线程还给线程池,这意味着获取网页的工作不会再占用任何CPU资源了.直到异步完成,即获取网页完毕,异步才会通过回调的方式通知线程池.可见,异步模式借助于线程池,极大地节约了CPU的资源. 注:DMA(Direct Memory Acce

TCP/IP异步通讯服务端实现方法

近期做了个TCP/IP异步通讯服务端实现方法,也是在网上胡乱搜索,然找了个自认为比较好的,然后封装一下,供后面自个使用,也供大家参考,如有不好的地方,欢迎指正,谢谢! 下面说一下这个方法里面的几个知识点: 1.托管 这个东西真心好用,虽然不知道具体怎么弄的,托管可以实现一个对象中的方法交由其他对象实现,而且可以同时触发多个方法,组件的触发函数就是由托管实现的,具体实现如下: 先声明一个托管的方法类型 public delegate void RecieveMsg(string IP_addr,

TCP协议与Web服务基础

TCP协议工作在OSI模型的传输层,提供一个可靠的面向连接的服务,其可靠性在于,通信的双方要建立一个端到端的虚电路,通过三次握手建立通信,断开通信需要四次握手.其连接模型如下: 1.建立连接协议(三次握手) (1)客户端发送一个带SYN标志的TCP报文到服务器.(报文1) (2) 服务器端回应客户端的一个同时带ACK标志和SYN标志的TCP报文.(报文2).表示对刚才客户端SYN报文的回应:同时又标志SYN给客户端,询问客户端是否准备好进行数据通讯. (3) 客户再次回应服务器端一个带ACK标志

python+soket实现UDP协议的局域网广播程序

1 # udp_gb_server.py 2 '''服务端(UDP协议局域网广播)''' 3 4 import socket 5 6 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 7 s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) 8 9 PORT = 1060 10 11 network = '<broadcast>' 12 s.sendto('Client broad