python3网络编程

1,TCP编程

1,客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import socket

'''
客户端:创建TCP连接时,主动发起连接的叫做客户端,
服务端:接收客户端的连接
'''
#1、创建一个socket
#参数1:指定协议 AF_INET 或AF_INET6
#参数2:SOCK_STREAM执行使用面向流的TCP协议
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#2、建立连接
#参数:是一个元组,第一个元素为要连接的服务器的IP地址,第二个参数为端口
sk.connect(("www.sina.com.cn",80))

sk.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')

#等待接收数据
data =[]
while True:
#每次接收1k的数据
tempData = sk.recv(1024)
if tempData:
data.append(tempData)
else:
break


dataStr = (b''.join(data)).decode("utf-8")

#断开连接
sk.close()
#print(dataStr)

headers, HTML =dataStr.split('\r\n\r\n',1)
#print(headers)
print(HTML)

2,客户端与服务器间的数据交互

1,服务端,server.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import socket,sys

#创建一个socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定IP端口,一元组的形式
server.bind(('192.168.1.123',8080))

#监听
server.listen(5)
print("服务器启动成功......")

#等待连接
clientSocket,clientAddress = server.accept()

print("%s -- %s 连接成功" % (str(clientSocket),clientAddress))
while True:

data = clientSocket.recv(1024)
#print("收到" + str(clientSocket) + "的数据:" + data.decode("utf-8"))
print("客户端说:" + data.decode("utf-8"))
sendData = input("请回复: ")
clientSocket.send(sendData.encode("utf-8"))

2,客户端,client.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import socket,sys

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect(('192.168.1.123',8080))


while True:

data =input("请输入给服务器发送的数据\n")
client.send(data.encode("utf-8"))
info = client.recv(1024)

print("服务器说:",info.decode("utf-8"))
if data == "quit":
sys.exit()

2,UDP编程

1,冒充飞Q

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26


'''
TCP 是建立可靠的连接,并且通行双方都可以以流的形式发送数据。
相对于TCP,UDP则是面向无连接的协议

使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以发送数据包。但是能不能到达就不知道了。

虽然UDP传输数据不可靠,但是他的优点是和TCP比,速度快,对于要求 不高的数据可以使用UDP


'''

import socket
import time
udp = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp.connect(('192.168.1.123',2425))
str ="1_lbt4_10#32899#002481627512#0#0#0:1289671407:a:b:288:hello world yichen"
udp.send(str.encode("utf-8"))

udp.close()
'''
while True:
udp.send(str.encode("utf-8"))
time.sleep(0.5)
'''

2,客户端与服务器间的数据交互

1,服务端server.py

1
2
3
4
5
6
7
8
9
10
import socket
udpServer = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udpServer.bind(("192.168.1.123",2426))
print("服务器启动成功......")
while True:
data,addr =udpServer.recvfrom(1024)
print("客户端说: ", data.decode("utf-8"))

info = input("请输入数据: ")
udpServer.sendto(info.encode("utf-8"),addr)

2,客户端client.py

1
2
3
4
5
6
7
8
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

while True:
data = input("请输入数据 ")
client.sendto(data.encode("utf-8"),("192.168.1.123",2426))
info = client.recv(1024).decode("utf-8")
print ("服务器说: ",info)

3,QQ聊天

1,server端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/python3
import socket,sys
import threading

#创建一个socket
#server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定IP端口,一元组的形式
#server.bind(('192.168.1.123',8080))

#监听
#server.listen(5)
#print("服务器启动成功...等待客户端连接")

users = {}
def run(ck,ca):
userName = ck.recv(1024)
users[userName.decode("utf-8")] = ck
printStr = userName.decode("utf-8") + "连接成功\n"
print(printStr)

print(users)


while True:
rData = ck.recv(1024)
dataStr = rData.decode("utf-8")

infolist = dataStr.split(":")
users[infolist[0]].send((userName.decode("utf-8")+ "说:\n" +infolist[1]).encode("utf-8"))

def start():

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP端口,一元组的形式
server.bind(('192.168.1.123',8080))
server.listen(10)
printStr = "服务器启动成功\n"
print(printStr)
while True:
# 等待连接
ck, ca = server.accept()

print("%s -- %s 连接成功" % (str(ck), ca))
t = threading.Thread(target=run, args=(ck, ca))
t.start()


def startServer():

s = threading.Thread(target=start)
s.start()

startServer()

2,client端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import tkinter
import socket,sys
import threading
#创建主窗口
win = tkinter.Tk()

#设置标题
win.title("QQ客户端")
#设置大小和位置
win.geometry("400x400+200+30")

ck = None


def getInfo():
while True:
data = ck.recv(1024)
text.insert(tkinter.INSERT,data.decode("utf-8"))

def connectServer():
global ck

ipStr = eip.get()
portStr = eport.get()
userStr = euser.get()

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect((ipStr, int(portStr)))
client.send(userStr.encode("utf-8"))
ck = client
#等待接收数据
t= threading.Thread(target=getInfo)
t.start()
def sendMail():
friend = efriend.get()
sendStr = esend.get()
sendStr = friend + ":" + sendStr
ck.send(sendStr.encode("utf-8"))

labelUser = tkinter.Label(win,text= "userName" ).grid(row = 0,column = 0)
euser = tkinter.Variable()
entryUser = tkinter.Entry(win, textvariable= euser ).grid(row = 0,column = 1)

labelIp = tkinter.Label(win,text= "ip" ).grid(row = 1,column = 0)
eip = tkinter.Variable()
entryIp = tkinter.Entry(win, textvariable= eip ).grid(row = 1,column = 1)


labelPort = tkinter.Label(win,text= "port" ).grid(row = 2,column = 0)
eport = tkinter.Variable()
entryPort = tkinter.Entry(win, textvariable= eport ).grid(row = 2,column = 1)

button1 = tkinter.Button(win, text ="连接",
command=connectServer).grid(row = 3,column = 0)


#显示出来
text = tkinter.Text(win, width = 30, height = 5)
text.grid(row = 4,column = 0)

esend = tkinter.Variable()

entrySend = tkinter.Entry(win, textvariable= esend,width =40,).grid(row = 6,column = 0)
labelsend = tkinter.Label(win,text= "要发送的消息" ).grid(row = 7,column = 0)
efriend = tkinter.Variable()
entryFriend = tkinter.Entry(win, textvariable= efriend ).grid(row = 8,column = 0)

labelfriend = tkinter.Label(win,text= "好友名字" ).grid(row = 9,column = 0)
button2 = tkinter.Button(win, text ="发送",
command=sendMail).grid(row = 10,column = 0)
win.mainloop()

评论


:D 一言句子获取中...

加载中,最新评论有1分钟缓存...