简单的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()

 缓冲区的说明

python使用socket python的socket用法_python使用socket

服务端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