python socket编程

计算机网络的基础知识不再叙述。
Python的socket包已经把网络连接的方式包装的非常好,涉及的报文握手等,都不需要自己再设计。

部分函数及功能

socket(family,type,[,protocal]):构造socket对象。
family参数

  • AF_UNIX:unix本机之间进行通信

  • AF_INET:使用IPv4

  • AF_INET6:使用IPv6
    type参数

  • SOCK_STREAM :TCP套接字

  • SOCK_DGRAM:UDP套接字

s.bind(address):将socket对象s绑定到指定地址,地址以元组(host,port)形式表示。
s.listen(backlog):开始监听TCP连接,backlog指定在拒绝连接之前,可以刮起的最大连接数量。
s.accept():接受来自客户端的TCP连接请求,并返回元组(conn,address),其中conn是socket对象,address是客户端的地址。
s.connect(address):客户端向服务器发起连接请求,address为服务器地址和端口组的元组(hostname,port),如果连接出错,则返回socket.error错误。
s.connect_ex(address):功能与connect相同,但是成功返回0,失败返回error的值。
s.recv(bufsize[,flag]):通过TCP接受字符串形式的数据,bufsize指定要接受的最大数据量,flag指定其他设置。
s.send(string[,flag]):通过TCP发送string中的数据,返回实际发送的数据字节大小。
s.sendall(string[,flag]):通过TCP尝试发送所有数据,成功返回None,失败则抛出异常。
s.recvfrom(bufsize[,flag]):通过UDP接受数据,参数与recv()类似,返回值为元组(data,address),其中,data为接收的字符串数据,address是发送数据端的地址。
s.sendto(string[,flag],address):通过UDP发送数据string,address为数据接收端地址元组(host,port),返回值是发送的字节数。
s.close():关闭连接
下面展示示例

TCP服务器端

TCP的服务器端,需要通过bind()绑定address,方法listen()来设置最大监听数,accept()方法接受来自客户端的请求,send()方法向客户端发送string中的数据。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip=socket.gethostname() 
port=9999
s.bind((ip, port))
s.listen(5)
print( 'Wait for connecting..')
(conn, addr)=s.accept()
print('conn=',conn)
print('addr =',addr)
str1=conn.recv(1024)
str2=str(str1,encoding= 'utf 8')
print('I received a string is:',str2)
str3=str2.upper( )
conn.send(str3.encode( 'utf- 8'))
conn.close()
s.close( )

TCP客户端

TCP连接由以下过程组成:套接字的绑定,客户端向服务器端发出请求连接,接受服务器回复的确认报文,向服务器发送确认报文,以及接受服务器发来的信息,关闭TCP连接。
套接字的绑定由socket.socket()来实现,客户端向服务器发送请求连接, recv()接受来自服务器的字节流数据,send()则向服务器发送string中的数据,最后由close()函数,释放连接。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip=socket.gethostname() 
port=9999
s.connect((ip,port))
print('l am connecting the server! ')
str0='hello'
s.send(str0.encode('utf-8')) #发消息
str1=s.recv(1024)
str2=str(str1, encoding= 'utf 8')
print( 'The original string is:',str0, '\tthe processed string is:',str2)
s.close()

先打开服务器,然后再打开客户端。
在这里插入图片描述
在这里插入图片描述

UDP服务器端

UDP由于面向无连接,相对于TCP,只少了accept的函数。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip=socket.gethostname() 
port=9999
s.bind((ip, port))
print( 'Wait for connecting..')
data,addr=s.recvfrom(1024)
print('Received from :',addr)
print('I received a string is:',data)
s.sendto('OK!'.encode('utf-8'),addr)
s.close( )

UDP客户端

UDP为面向无连接的连接方式,只需要尽最大努力的交付自己的任务,就不需要绑定地址。过程为用方法socket()绑定套接字,用sendto()方法,向服务器发送数据,用recvform()方法来接受服务器的消息,最后用方法close()释放连接。

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip=socket.gethostname() 
port=9999
print('l am connecting the server! ')
str0='hello'
s.sendto(str0.encode('utf-8'),(ip,port)) #发消息
data,addr=s.recvfrom(1024)
print('I received a string is:',data)
s.close()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值