2.5.3.1Python-TCP编程/UDP编程/socket套接字

总目录:https://www.jianshu.com/p/e406a9bc93a9

Python - 子目录:https://www.jianshu.com/p/50b432cb9460

socket在某种意义上为我们封装好了tcp/udp,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。


Socket套接字

socket编程离不开的就是socket()函数。我们要使用这个函数来创建套接字对象。

语法

socket.socket([family[, type[, proto]]])

mily: 套接字家族可以使AF_UNIX或者AF_INET

type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM

protocol: 一般不填默认为0.

服务器端常用方法

服务端套接字绑定IP端口:bind()

服务端套接字监听:listen()

服务端监听套接字同意连接:accept()


客户端端常用方法

客户端套接字连接服务器:connect()

connect()的扩展版本,出错时返回出错码,而不是抛出异常:connect_ex()


公用方法

套接字发送消息:send()

套接字接受消息:recv()

套接字关闭连接:close()

完整发送TCP数据:sendall()

接收UDP数据:recvfrom()

发送UDP数据:sendto()

返回连接套接字的远程地址:getpeername()

返回套接字自己的地址:getsockname()

设置套接字操作的超时期:s.settimeout()



我们来看一个TCP实例:

server.py

# 导入 socket模块

import socket


# 创建 socket 对象

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 获取本地主机名

host = socket.gethostname()

 # 设置端口号

port =8888


# 绑定端口号

serversocket.bind((host, port))

# 设置最大连接数,超过后排队

serversocket.listen(5)


while True:

    # 建立客户端连接

    clientsocket, addr = serversocket.accept()

    print("连接地址: %s" %str(addr))

    msg ='服务端发送的一条消息。' +"\r\n"

    clientsocket.send(msg.encode('utf-8'))

    msg = clientsocket.recv(1024)

    print(msg.decode("utf-8"))

    clientsocket.close()

client.py

# 导入 socket模块

import socket


# 创建 socket 对象

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


# 获取本地主机名

host = socket.gethostname()

# 设置端口号

port =8888


# 连接服务,指定主机和端口

s.connect((host, port))

# 接收小于 1024 字节的数据

msg = s.recv(1024)

s.send("客户端发来的消息。".encode('utf-8'))

s.close()

print (msg.decode('utf-8'))

server运行结构


client运行结果

UDP实例要简单一点

UDP的使用与TCP类似,但是不需要建立连接。此外,服务器绑定UDP端口和TCP端口互不冲突,也就是说,UDP的9999端口与TCP的9999端口可以各自绑定。

server.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定端口:

s.bind(('127.0.0.1', 9999))

print('Bind UDP on 9999...')

while True:

    # 接收数据:

    data, addr = s.recvfrom(1024)

    print('Received from %s:%s.' % addr)

    s.sendto(b'Hello, %s!' % data, addr)


client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

for datain [b'Michael', b'Tracy', b'Sarah']:

    # 发送数据:

    s.sendto(data, ('127.0.0.1', 9999))

    # 接收数据:

    print(s.recv(1024).decode('utf-8'))

s.close()


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354