python3网络编程菜鸟教程_python:socket网络编程

Socket

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket, 又称为“套接字”。

模块

1 import socket

创建套接字

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

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

type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM(基于TCP)或SOCK_DGRAM(基于UDP)

protocol: 一般不填默认为0.

常用函数

sk.bind(address)

s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址。

sk.listen(backlog)

开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。

backlog等于5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5

这个值不能无限大,因为要在内核中维护连接队列

sk.accept()

接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。

接收TCP 客户的连接(阻塞式)等待连接的到来

sk.connect(address)

连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

sk.close()

关闭套接字

sk.recv(bufsize[,flag])

接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

sk.send(string[,flag])

将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。即:可能未将指定内容全部发送。

单线程通信

该实例中,只能 client 发一句, server回一句(先启动server,后启动client)

server

1 #!/usr/bin/env python

2 #-*- coding:utf-8 -*-

3 #Author: jyroy

4

5 importsocket6

7 if __name__ == '__main__':8 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #ipv4, TCP

9 sock.bind(('0.0.0.0',5000)) #元组,相当于一个参数

10 sock.listen(10) #同时保持是十个人的连接

11 conn, addr =sock.accept()12 whileTrue:13 data = conn.recv(1024) #最多1K的数据

14 print(data)15 if data == 'bye':16 break

17 else:18 msg = raw_input(">>")19 conn.send(msg)20 sock.close()21 print('Bye!!')

client

1 #!/usr/bin/env python

2 #-*- coding:utf-8 -*-

3 #Author: jyroy

4

5 importsocket, time6

7 if __name__ == '__main__':8 sock =socket.socket(socket.AF_INET, socket.SOCK_STREAM)9 sock.connect(('localhost',5000))10 whileTrue:11 msg = raw_input(">>")12 if msg == "bye":13 sock.send(msg)14 sock.close()15 break

16 else:17 sock.send(msg)18 data = sock.recv(1024)

多线程通信

在该实例中可以自由发送和接收信息(先启动server,后启动client)

利用threading,多线程进行接受消息和发送消息

callback_recv函数负责接受信息的功能

callback_send函数负责发送信息的功能

server

1 #!/usr/bin/env python

2 #-*- coding:utf-8 -*-

3 #Author: jyroy

4

5 importsocket, threading, sys6

7

8 defcallback_send(conn):9 '''

10

11 :param sq:12 :return:13 '''

14 whileTrue: #为了维持持续的发送15 msg = raw_input(">>")16 conn.send(msg)17

18 defcallback_recv(conn):19 '''

20

21 :param sock:22 :return:23 '''

24 whileTrue: #为了维持持续的接收25 data = conn.recv(1024)26 print(data)27

28 if __name__ == '__main__':29 sock =socket.socket(socket.AF_INET, socket.SOCK_STREAM)30 sock.bind(('0.0.0.0',5000)) #元组,相当于一个参数

31 sock.listen(10) #同时保持是十个人的连接

32 conn, addr =sock.accept()33

34 thread_send = threading.Thread(target=callback_send, args=(conn, ))35 thread_recv = threading.Thread(target=callback_recv, args=(conn, ))36

37 thread_send.start()38 thread_recv.start()39

40 sock.close()

client

#!/usr/bin/env python#-*- coding:utf-8 -*-#Author: jyroy

importsocket, time, threading, sysdefcallback_send(sock):''':param sq:

:return:'''

whileTrue:

msg= raw_input(">>")

sock.send(msg)#if msg in ['bye', 'quit']:

#sock.close

#break

defcallback_recv(sock):''':param sock:

:return:'''

whileTrue:

data= sock.recv(1024)print(data)if __name__ == '__main__':

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

sock.connect(('localhost',5000))

thread_send= threading.Thread(target=callback_send, args=(sock, ))

thread_recv= threading.Thread(target=callback_recv, args=(sock, ))

thread_send.start()

thread_recv.start()whileTrue:passsock.close()

效果展示

1378215-20181014145234170-1428225663.png

1378215-20181014145315393-336377411.png

注意

一定要先server程序启动,只有server在等待client之后,client才能找到server进行通信。

我这个只是本机的调试,要和别人通信时,把client程序中,把connect的ip地址,从localhost换成要通信的ip地址

关于python网络编程的其他资料

菜鸟教程--http://www.runoob.com/python/python-socket.html

python官方--https://docs.python.org/3/library/socket.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值