伪代码:
ss = socket() #创建服务器套接字
ss.bind() #把地址绑定到套接字上
ss.listen() #监听连接(最大连接数)
info_loop: #服务器无限循环
cs = ss.accept() #接受客户端连接
comm_loop: #通信循环
cs.recv()/cs.send() #对话(接收/发送)
cs.close() #关闭客户端套接字
ss.close() #关闭服务器
所有的套接字都用socket.socket()函数来创建,服务器需要“坐在某个端口上“等待请求”所以它们必须要“绑定”到一个本地地址上,
由于TCP是一个面向连接的通信系统,在TCP服务器开始工作之前,要先完成一些设置,TCP服务器必须“监听”连接,设置完成之后服务器
就可以进入无限循环了。
一个简单的“单线程”服务器会调用accept()函数等待连接的到来,默认情况下accept()函数是阻塞的,即程序在连接到来之前会处于挂起状态,
套接字也支持非阻塞模式。
一旦接收到一个连接,accept()函数就会返回一个单独的客户端套接字用于后续的通信。
简单的TCP服务器
代码如下
#!/usr/bin/env python3 #-*- coding:utf-8 -*- from socket import * from time import ctime host = ‘‘ port = 12345 buffsize = 2048 ADDR = (host,port) tctime = socket(AF_INET,SOCK_STREAM) tctime.bind(ADDR) tctime.listen(3) while True: print(‘Wait for connection ...‘) tctimeClient,addr = tctime.accept() print("Connection from :",addr) while True: data = tctimeClient.recv(buffsize).decode() if not data: break tctimeClient.send((‘[%s] %s‘ % (ctime(),data)).encode()) tctimeClient.close() tctimeClient.close()
TCP客户端代码:
#!/usr/bin/env python3 #-*- coding:utf-8 -*- from socket import * HOST =‘localhost‘ PORT = 12345 BUFFSIZE=2048 ADDR = (HOST,PORT) tctimeClient = socket(AF_INET,SOCK_STREAM) tctimeClient.connect(ADDR) while True: data = input(">") if not data: break tctimeClient.send(data.encode()) data = tctimeClient.recv(BUFFSIZE).decode() if not data: break print(data) tctimeClient.close()
note:
如果实在ubuntu下面做练习,需要在防火墙上添加allow条目,具体命令是
ufw allow 12345/tcp
也可以直接关闭防火:
ufw disable
时间: 2024-11-05 16:08:41