简单的socket例子使用
#服务端代码
import socket
#创建一个socket对象
ret = socket.socket()
#绑定一个IP加端口
ret.bind(("127.0.0.1",9999))
#因为socket就像打电话,一个人打进来,其他人就要等。而这里最多有五个人在排队等候,多过5个人的,直接不理会它。
ret.listen(5)
while True:
#获取到客户端的socket和客户端的ip和端口
connect,address = ret.accept()
print(connect,address)
1 import socket
2
3 client_test = socket.socket()
4 #连接服务端
5 client_test.connect(("127.0.0.1",9999))
6 #关闭socket
7 client_test.close()
socket的accet和rev这两个方法都是阻塞线程的。就是当执行了这两个方法,线程就会被阻塞,就不会再执行下面的代码
socket的sendall 和 rev
sendall 和sendto 都是发送信息。sendto可能只是发送一段信息的其中一些,就是你给信息他,他不一定帮你全部发送完。而sendall则是调用sendto多次,直到把消息发送完毕。
#服务端代码
import socket
ret = socket.socket()
ret.bind(("127.0.0.1",9999))
ret.listen(5)
while True:
connect,address = ret.accept()
#使用sendall往客户端发送字节的信息
connect.sendall(bytes("hello,you hao",encoding="utf-8"))
print(connect,address)
#客户端代码
import socket
client_test = socket.socket()
client_test.connect(("127.0.0.1",9999))
#rev接受服务端发送过来的内容,每次最大1024字节。接收到的都是字节来的,需要转为字符串
result = client_test.recv(1024)
print(str(result,encoding="utf-8"))
client_test.close()
客户端往服务端发送数据
1 import socket
2
3 ret = socket.socket()
4 ret.bind(("127.0.0.1",9999))
5 ret.listen(5)
6
7 while True:
8 connect,address = ret.accept()
9 connect.sendall(bytes("hello,you hao",encoding="utf-8"))
10 print(connect,address)
11 #加多一个循环
12 while True:
13 #接受客户端传过来的内容
14 result = connect.recv(1024)
15 #如果是q就退出
16 if result == 'q':
17 break
18 #如果不是则发送信息给客户端告诉他信息收到了
19 connect.sendall(bytes("shoudaole", encoding="utf-8"))
1 #客户端
2 import socket
3
4 client_test = socket.socket()
5 client_test.connect(("127.0.0.1",9999))
6 result = client_test.recv(1024)
7 print(str(result,encoding="utf-8"))
8
9 while True:
10 #输入要发送给服务端的内容
11 result = input("输入内容")
12 #如果是q,则推出循环
13 if result == "q":
14 client_test.send(bytes(result,encoding="utf-8"))
15 break
16 else :
17 #发送内容
18 client_test.sendall(bytes(result,encoding="utf-8"))
19 #接受服务端的收到信息的确定信号
20 ret = str(client_test.recv(1024),encoding="utf-8")
21 print(ret)
22 client_test.close()
客户端发送文件给服务端
1 #服务端代码
2 import socket
3
4 ret = socket.socket()
5 ret.bind(("127.0.0.1",9999))
6 ret.listen(5)
7
8 while True:
9 connect,address = ret.accept()
10 connect.sendall(bytes("hello,you hao",encoding="utf-8"))
11 print(connect,address)
12 #接受客户端发来的文件的大小
13 file_size = str(connect.recv(1024),encoding="utf-8")
14 #转为整形
15 total_size = int(file_size)
16 print(file_size)
17 #发送接收文件大小收到的信息
18 connect.sendall(bytes("recieve over",encoding="utf-8"))
19 has_recv = 0
20 f = open("timg.png","wb")
21
22 while True:
23 #不断接受发送过来的数据
24 if total_size == has_recv:
25 break
26 ret = connect.recv(1024)
27 #结算每次发送过来的数据
28 total_size += len(ret)
29 #写入到文件中
30 f.write(ret)
31
32 f.close()
客户端代码:
import os
import socket
client_test = socket.socket()
client_test.connect(("127.0.0.1",9999))
result = client_test.recv(1024)
print(str(result,encoding="utf-8"))
#获取文件的大小
size = os.stat("23.jpg").st_size
#发送文件的大小给服务端
client_test.sendall(bytes(str(size),encoding="utf-8"))
print(str(client_test.recv(1024),encoding="utf-8"))
#读取文件发送给服务端
with open("23.jpg","rb") as T:
#每次读取一行,生成器和迭代器的使用
for item in T:
client_test.sendall(item)
#关闭socket
client_test.close()
缓冲区的说明
服务端sendall数据会先发送到电脑的缓冲区,然后由电脑缓冲区决定什么时候才把这内容给发送出去。客户端那边也是。
所以只有当服务端发送一个消息过去给客户端,当客户端发送一个确认收到信息,服务端这边才再发送其他信息过去。
比如,服务端发送信息1 然后又发送信息2 可能信息1和信息2 都在电脑缓冲区里,缓冲区同一时刻把两者融合一起,发送给客户端,这样就乱了。
同时处理多个客户端连接的socketserver
socketserver可以同时接受多个客户端的请求
1 import socketserver
2 #创建一个继承于socketserver.BaseRequestHandler
3 class Mysocketserver(socketserver.BaseRequestHandler):
4 #要有handle这个方法
5 def handle(self):
6 conn = self.request
7 conn.sendall(bytes("connection",encoding="utf-8"))
8
9 while True:
10 get = str(conn.recv(1024),encoding="utf-8")
11 if get == "q":
12 break
13 conn.sendall(bytes("shoudaole,xiexie",encoding="utf-8"))
14
15 if __name__ == "__main__" :
16 server = socketserver.ThreadingTCPServer(("127.0.0.1",9999),Mysocketserver)
17 server.serve_forever()
1 #客户端代码
2 import socket
3
4 client_test = socket.socket()
5 client_test.connect(("127.0.0.1",9999))
6 result = client_test.recv(1024)
7 print(str(result,encoding="utf-8"))
8
9 while True:
10 ret = input("shuru")
11 client_test.sendall(bytes(ret, encoding="utf-8"))
12 print(str(client_test.recv(1024),encoding="utf-8"))
13
14 client_test.close