目 录
1. 套接字
1.1 套接字介绍
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口。
有两套套接字,一套是在同一台机器上的,即所谓的进程间通信 IPC(Inter Process Communication ),它是基于文件的,由文件系统来支持同一台机器上多个进程之间的共享常量。AF_UNIX 又叫 AF_LOCAL,是历史上第一个套接字家族。
另外一套是在不同主机上进行的,是面向网络的,由自己的家族名字 AF_INET,AD_INET6是用于 IPV6 寻址的。
AF_NETLINK 家族(无连接)允许使用标准的 BSD 套接字接口进行用户级别和内核级别代码之间的IPC,它新添加了系统调用、/proc支持等。
Python 只支持 AF_UNIX、AF_NETLINK、AF_TIPC 和 AF_INET。
1.2 套接字地址
套接字地址由两部分组成:IP 地址、端口号。
1.3 面向连接的套接字与无连接的套接字
后续的 AF_INET 套接字家族示例,支持两种主流协议:
1)面向连接的套接字,即面向 TCP 协议(传输控制协议)的套接字,使用 SOCKET_STREAM类型的套接字。
2)面向无连接的套接字,即面向 UDP 协议(用户数据报协议)的套接字,使用 SOCKET_DGRAM 类型的套接字。
2.创建 TCP 服务器和客户端相互通讯
2.1 服务器端代码实现
from socket import *
from time import ctime
HOST=''
PORT=21567
BUFSIZE=1024
ADDR=(HOST,PORT)
tcpSerSocket=socket(AF_INET,SOCK_STREAM)
tcpSerSocket.bind(ADDR)
tcpSerSocket.listen(5)
while True:
print("waiting for connection....")
tcpClientSock,addr=tcpSerSocket.accept()
print("connecting from client:",addr)
while True:
data=tcpClientSock.recv(BUFSIZE)
if not data:
break
tcpClientSock.send(bytes("Current time is {0}".format(ctime()),'utf-8'))
tcpClientSock.close()
tcpSerSocket.close()
2.2 客户端代码实现
from socket import *
HOST="localhost"
PORT=21567
BUFSIZE=1024
ADDR=(HOST,PORT)
tcpClientSocket=socket(AF_INET,SOCK_STREAM)
tcpClientSocket.connect(ADDR)
while True:
data=input("Please input your words!")
if not data:
break
tcpClientSocket.send(bytes(data,"utf-8"))
data=tcpClientSocket.recv(BUFSIZE)
if not data:
break
print(data)
tcpClientSocket.close()
2.3 运行结果
服务器端:
客户端端:
'''
要是大家觉得写得还行,麻烦点个赞或者收藏吧,想个博客涨涨人气,非常感谢!
更欢迎大家一起来讨论,共同学习进步!
'''