最近一直忙于实验,偶尔有机会练习了久久未接触到的Socket,以前学习的时候都是在.Net下,不过所有的Socket原理都是一样的,附上自己的代码(网上down的,自己调试而成)
服务器端:
# -*- coding: cp936 -*- ##tcp响应服务器,当与客户端建立连接后,服务器显示客户端ip和端口,同时将接收的客户端信息和'I get it!'传给客户端,此时等待输入一个新的信息传给客户端。 ##@小五义 import socket,traceback host='' port=12345 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) s.bind((host,port)) s.listen(1) while 1: try: clientsock,clientaddr=s.accept() except KeyboardInterrupt: raise except: traceback.print_exc() continue try: print("连接来自:",clientsock.getpeername()) while 1: data=clientsock.recv(4096).decode() if not len(data): break print(clientsock.getpeername()[0]+':'+str(data)) clientsock.sendall(data.encode()) clientsock.sendall(("\nI get it!\n").encode()) t=input('input the word:') clientsock.sendall(t.encode()) except (KeyboardInterrupt,SystemExit): raise except: traceback.print_exc() try: clientsock.close() except KeyboardInterrupt: raise except: traceback.print_exc()
客户端:
import socket,sys port=12345 host=input('输入服务器ip:') data=input('输入要发送的信息:') s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) try: s.connect((host,port)) except: print('连接错误!') s.send(data.encode()) s.shutdown(1) print('发送完成。') while 1: buf=s.recv(4096).decode() if not len(buf): break sys.stdout.write(buf)
现在说说遇到的几个小问题:
1、跟其他的编译环境一样需要两个进程来分别执行服务器和客户端,也就是打开两个shell脚本
2、编码方式的问题。Socket发送的都是byte编码方式,而Python3使用的是Unicode编码方式,所以需要使用decode和encode函数转换
3、这个例子只是一个介绍函数作用的基础例子,实际用的时候肯定要进行功能扩展,把面向对象那一部分添加进去。
时间: 2024-10-10 20:14:57