网络编程: 套接字基于TCP的应用/设置端口可立即重用(一)
1、模拟通信,进行消息收发
【1】初版server端【一】
from socket import *
# 1、创建套接字对象
sock = socket(family = AF_INET,type = SOCK_STREAM,proto = 0)
# 2、绑定地址
sock.bind(("127.0.0.1",8989))
# 3、设置监听
sock.listen(5)
#4、等待连接
print("等待客户端连接...")
connd,addr = sock.accept()
print("已有客户端连接:",addr)
#5、消息收发
#接收消息
data = connd.recv(1024)
print("服务器收到的消息:",data.decode())
#给连接的客户端回复消息,
#给连接的客户端回复消息,
# send方法的参数必须为字节串,【1】【2】两种方式均可以
#【1】对消息进行编码,转换为字节串
#使用【2】的话,不能使用中文,只能为ASCII编码
# sed = connd.send("The server accepted your msg.".encode()) # 【1】
sed = connd.send(b"The server accepted your msg.") #【2】
print("send %d bytes"%sed)
#6、关闭套接字
connd.close()
sock.close()
【二】
from socket import *
s = socket()
#设置端口可立即重用
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
print("getsockopt==>",s.getsockopt(SOL_SOCKET,SO_REUSEADDR))
#获取套接字类型
print("type==>",s.type)
#获取地址类型
print("famliy==>",s.family)
#文件描述符
print("fileno==>",s.fileno())
#绑定地址
s.bind(('192.168.1.4',9999))
#获取套接字绑定的地址
print("getsockname==>",s.getsockname())
s.listen(5)
#等待连接
c,addr = s.accept()
#获取连接的套接字的客户端地址
print("getpeername==>",c.getpeername())
print("addr:",addr)
data = c.recv(1024)
print("接收到的数据:",data)
c.close()
s.close()
【1】初版client端
import socket
# 1、创建套接字对象
sock = socket.socket()
#-------------------
# import导入方式导入socket的话,socket方法不能添加参数,server也一样。
# from import *方式导入时可以添加参数 #python版本:3.7.6
#sock = socket.socket(sock_family = AF_INET, sock_type = SOCK_STREAM,proto = 0)
# Traceback (most recent call last):
# File "D:/python_program/TCP/tcp-client.py", line 4, in <module>
# sock = socket.socket(sock_family = AF_INET, sock_type = SOCK_STREAM,proto = 0)
# NameError: name 'AF_INET' is not defined
#------------------
#2 、发起连接
sock.connect(("127.0.0.1",8989))
#3、消息收发
#输入要发送的消息
msg = input("请输入要发送的消息:Msg>>>")
#发送消息
#-----
#sed=sock.send(msg.encode())
#print("send %d bytes"%sed)
#----
sock.send(msg.encode())
# 接收消息
data = sock.recv(1024)
print("收到服务器回复的消息:",data.decode())
#4、关闭套接字
sock.close()
#===========================================================================#
【2】第二版server,循环发送消息
from socket import *
#创建套接字
sock = socket(AF_INET,SOCK_STREAM)
#绑定地址
sock.bind(('127.0.0.1',9999))
#设置监听
sock.listen(5)
while True:
#等待客户端连接
print("Waiting for connect...")
connfd,addr = sock.accept()
print("Connect from",addr)
while True:
#消息收发
data = connfd.recv(1024)
if not data:
break
print("Receive:",data.decode())
n = connfd.send(b"Receive your message")
print("send %d bytes"%n)
#关闭套接字
connfd.close()
sock.close()
【2】第二版client,循环发送消息
from socket import *
#创建套接字
sock = socket()
#发起连接
sock.connect(('127.0.0.1',9999))
while True:
#消息收发
msg = input("Msg>>")
if not msg:
break
sock.sendall(msg.encode())
data = sock.recv(1024)
print(data.decode())
sock.close()