学python ing 没怎么更ctf相关的blog
udp发送数据
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('hello'.encode('utf-8'),("192.168.253.1",9090))
s.close()
sendto有两个参数,data:要发送的二进制数据;address:参数为元组,元组里有两个元素:目标ip和端口号
udp接收数据
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定端口号的ip地址
s.bind(('192.168.253.1',9090))
data,addr=s.recvfrom(1024)
print(data.decode('utf-8'),"\n",addr[0],"\n",addr[1])
s.close()
# 接收到的数据打印结果
hello
192.168.253.1
57398
综合一下
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('192.168.253.1',9001))
s.sendto('helloooo'.encode('gb18030'),("192.168.253.1",9000))
data,addr=s.recvfrom(1024)
print(data.decode('gb18030'),"\n",addr[0],"\n",addr[1])
s.close()
错误记录
一开始用的是utf-8编码,但是报错
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position 1: invalid continuation byte
网上查了下,编码改成:gb18030 可以收中文了
bind端口号的意义
如果不进行bind的话,会发现每次发送数据的端口是不一样的
TCP客户端建立
服务端如下:
客户端发送消息:
import socket
#基于TCP协议的socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# udp直接使用sendto发送数据,tcp:connect,send
# tcp在发送数据之前,必须先和服务器建立连接
s.connect(('192.168.253.1',9000))
s.send('hello'.encode('utf8'))
s.close()
TCP服务端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.253.1', 9000))
s.listen(128) # 把socket变成一个被动监听的socket;128是队列长度
client_socket,client_addr=s.accept()
data=client_socket.recv(1024)
print('接收到了{}客户端{}端口号发送的数据,内容是{}'.format(client_addr[0],client_addr[1],data.decode('gb18030')))
s.close()
# 打印:接收到了192.168.253.1客户端16862端口号发送的数据,内容是你好,hello
9月周报回顾
就当socket的小练习了
import socket
import hashlib
import re
HOST="49.235.47.62"
PORT=10000
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))
data=" "
data3=" "
num=0
data=s.recv(512)
print("获取服务器信息:\n",data.decode("utf-8"))
for num in range(0,201):
data3=s.recv(512)
data2=data3.decode()
data2= data2.replace('\n','')
d2=data2.encode()
print(d2)
res= hashlib.sha256(d2).hexdigest()
print("sha256加密结果:",res)
data1=""
for i in res:
if i in "0123456789":
data1=data1+i
print("提取数字:",data1)
num=num+1
data1+='\n'
s.sendall(data1.encode("utf-8"))
s.close
简易聊天
# udp版
import socket, threading
print("---欢迎来到简易聊天室---")
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
HOST = "192.168.253.1"
PORT = 9090
s.bind((HOST, PORT))
def send_msg():
name = input("请输入本机昵称:")
while True:
mes = input(name+':')
mes = name + ':' + mes + '\n'
with open("demo.txt", 'a') as file: # demo.txt为聊天记录
file.write(mes)
s.sendto(mes.encode('gb18030'), (HOST, 9000))
def recv_msg():
while True:
data, addr = s.recvfrom(1024)
with open("demo.txt", 'a') as file:
file.write("来自ip{} 端口号{}的消息:{}\n".format(addr[0], addr[1], data.decode('gb18030')))
# print("来自ip{} 端口号{}的消息:{}".format(addr[0],addr[1],data.decode('gb18030')))
t1 = threading.Thread(target=send_msg)
t2 = threading.Thread(target=recv_msg)
t1.start()
t2.start()