python scoket编程以及多线程
Socket 模块的类方法 (能直接通过类名调用)
Socket | 低层网络接口(每个 BSD API) |
---|
socket.socket(family, type) | 创建并返回一个新的 socket 对象 |
socket.getfqdn(name) | 将使用点号分隔的 IP 地址字符串转换成一个完整的域名 |
socket.gethostbyname(hostname) | 将主机名解析为一个使用点号分隔的 IP 地址字符串 |
socket.fromfd(fd, family, type) | 从现有的文件描述符创建一个 socket 对象 |
| |
Socket 模块的实例方法
sock.bind( (adrs, port) ) | 将 socket 绑定到一个地址和端口上 |
---|
sock.accept() | 返回一个客户机 socket(带有客户机端的地址信息) |
sock.listen(backlog) | 将 socket 设置成监听模式,能够监听 backlog 外来的连接请求 |
sock.connect( (adrs, port) ) | 将 socket 连接到定义的主机和端口上 |
sock.recv( buflen[, flags] ) | 从 socket 中接收数据,最多 buflen 个字符 |
sock.recvfrom( buflen[, flags] ) | 从 socket 中接收数据,最多 buflen 个字符,同时返回数据来源的远程主机和端口号 |
sock.send( data[, flags] ) | 通过 socket 发送数据 |
sock.sendto( data[, flags], addr ) | 通过 socket 发送数据 |
sock.close() | 关闭 socket |
| |
客户端(client)
import socket
import threading
import sys
true = 1
def rec(sock):
#将接收消息部分封装成一个函数,方便下面为其建立一个线程
global true #声明这里的true为全局变量,即是上面声明的true=1
#如果无数据报套接字则退出
if not sock:
sys.exit(-1)
while True:
#通过recvfrom函数接收数据
buf,address = sock.recvfrom(2048)
#接收到对面退出,则退出
if buf.decode() == 'q':
true = 'q'
break
#打印接收的数据
print("accept content: ", end='')
print(buf.decode())
return buf,address
<font color=red>#主程序</font>
if __name__ == '__main__':
#创建scoket,并判断是否创建成功
#数据报套接字是对于udp协议的,面向无连接的
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #数据报套接字
if not sock:
print('socket error')
#绑定套接字,指定端口(若不指定则使用默认9999端口)
port = input('port: ')
if port:
sock.bind(('localhost', int(port)))
# print('hello')
# print(sock.type)
else:
sock.bind(('localhost',9999))
#为接收消息开创一个线程
ser = threading.Thread(target=rec, args=(sock,))
ser.start()
while True:
if true == 'q':
break
#发送数据
try:
data = input('\nsending content: ')
#sendto函数向指定IP地址发送消息
sock.sendto(data.encode(),('localhost', 8001))
except socket.gaierror:
print ('Error connecting to server: %s')
sock.close() #关闭套接字
服务端(server)
# -*- coding: utf-8 -*-
import socket
import threading
import sys
true = 1
def rec(sock):
global true
#如果无数据报套接字则退出
if not sock:
sys.exit(-1)
while True:
#接收数据
buf,address = sock.recvfrom(2048)
#接收到对面退出,则退出
if buf.decode() == 'q':
true = 'q'
break
else:
print("accept content: ", end='')
print(buf.decode())
return buf,address
<font color=red>#主程序</font>
if __name__ == '__main__':
#创建scoket,并判断是否创建成功
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #数据报套接字
if not sock:
print('socket error')
#绑定套接字,指定端口(若不指定则使用默认8001端口)
port = input('port: ')
if port:
sock.bind(('localhost', int(port)))
else:
sock.bind(('localhost', 8001))
ser = threading.Thread(target=rec, args=(sock,))
ser.start()
while True:
if true == 'q':
break
#发送数据
data = input('\nsending content: ')
sock.sendto(data.encode(),('localhost', 9999))
sock.close() #关闭套接字
在.py文件目录下通过shift+鼠标右键打开powershell窗口
python client.py运行程序