import socket
host = '' #表示本地的所有地址
port = 12345 #端口应该大于1024
addr = (host,port)
s = socket.socket() #默认值是基于TCP的网络套接字
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #设置选项,程序结束之后可以立即载运行,否则要等60秒
s.bind(addr) #绑定地址到套接字
s.listen(1) #启动侦听进程
cli_sock,cli_addr = s.accept() #等待客户连接
print('client connect from:',cli_addr)
print(cli_sock.recv(1024)) #一次最多读1024字节
cli_sock.send(b'I 4 c u\r\n') #发送的数据要求是bytes类型
cli_sock.close()
s.close()
#测试使用telnet telnet 127.0.0.1 12345
# 可重用的TCP服务器
# TCP服务器流程中,TCP服务器只能一个客户端连接,
# 客户端也只能发送一条消息。本例允许客户端发送多条消息,输入end结束。
# 客户端退出后,服务器程序不再退出,可以为下一个客户端提供服务:
import socket
host = ''
port = 12345
addr = (host,port)
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(addr)
s.listen(1)
while True:
cli_sock,cli_addr = s.accept()
print('client connect from:',cli_addr)
while True:
data = cli_sock.recv(1024)
if data.strip() == b'end':
break
print(data.decode('utf8')) #bytes类型转为string类型
data = input('>') + '\r\n' #获得的是string类型
cli_sock.send(data.encode('utf8')) #转成bytes类型发送
cli_sock.close()
s.close()
#简单而完整的TCP服务器
# 客户端可以通过telnet 127.0.0.1 12345来访问。
# 每发送一段文字,将会收到加上当前时间的文字。
import socket
from time import strftime
class TcoTimeServer:
def __init__(self,host='',port=12345):
self.addr = (host,port)
self.serv = socket.socket()
self.serv.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.serv.bind(self.addr)
self.serv.listen(1)
def chat(self,c_sock):
while True:
data = c_sock.recv(1024)
if data.strip() == b'quit':
break
data = '[%s] %s' % (strftime('%Y-%m-%d %H:%M:%S'),data.decode('utf8'))
c_sock.send(data.encode('utf8'))
c_sock.close()
def mainloop(self):
while True:
cli_sock,cli_addr = self.serv.accept()
self.chat(cli_sock)
self.serv.close()
if __name__ == '__main__':
s = TcpTimeServer()
s.mainloop()
#简单的TCP客户端
import socket
host = '192.168.4.254' #服务器IP地址
port = 12345 #服务器端口
addr = (host,port)
c = socket.socket()
c.connect(addr)
while True:
data = input('>') + '\r\n'
c.send(data.encode('utf8')) #先发送消息
if data.strip() == 'end': #后再进行判断
break
data = c.recv(1024)
print(data.decode('utf8'))
c.close()
#简单的UDP服务器流程
# UDP是非面向连接的,不用listen、不用accept。
# UDP不区分客户端,就算是同一客户端发来的多个数据包,udp服务器也不区分,
# 与处理多个客户端发来的数据包等同对待。
import socket
from time import strftime
host = ''
port = 12345
addr = (host,port)
s = socket.socket(type=socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind(addr)
while True:
data,cli_addr = s.recvfrom(1024)
clock = strftime('%H:%M:%S')
data = data.decode('utf8')
data = '[%s] %s' % (clock,data)
s.sendto(data.encode('utf8'),cli_addr)
s.close()
#简单的UDP客户端流程
#UDP客户端非常简单,只要把数据发送到服务器就可以了
import socket
host = '192.168.4.254'
port = 12345
addr = (host,port)
c = socket.socket(type=socket.SOCK_DGRAM)
while True:
data = input('>')
if data.strip() == 'quit':
break
c.sendto(data.encode('utf8'),addr)
print(c.recvfrom(1024)[0].decode('utf8'))
#print(c.recvfrom(1024))
c.close()
python-socket(95)
最新推荐文章于 2024-12-11 16:23:47 发布