TCP通信:传输控制协议
1. socket基本函数
socket()函数:
socket.socket([family[, type[, proto]]])
参数意义:
- family: 套接字家族可以使AF_UNIX或者AF_INET
- type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
- protocol: 一般不填默认为0.
创建一个tcp socket(tcp套接字)
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print 'Socket Created'
第一个参数表示ipv4,必须这么写;第二个表示创建出来的套接字可以用于tcp通信。
- s.bind():绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。第一个参数为ip地址,如果为”“,表示为本机ip,第二个参数为端口号
- s.close():关闭套接字。
- s.listen(backlog):开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
- s.accept():接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
- s.connect(address):连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
- s.recv(bufsize[,flag]):接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
- s.send(string[,flag]):发送TCP数据。将string中的数据发送到连接的套接字。返回值是要发送的字节数量,该数量可能小于string的字节大小。
Python2.*
import socket
udpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
udpSocket.sendto("haha",("49.123.115.249",8080))
Python3.*(对于Python3,”haha”前要加b)
import socket
udpSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
udpSocket.sendto(b"haha",("49.123.115.249",8080))
2.TCP通信(python2.7)
Ubuntu和pycharm的客户端源程序client.py代码如下所示:
#!/usr/bin/python
# coding: UTF-8
import socket
clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建socket
serverAdrr = ('49.123.115.249',12345) #指定服务器的ip和端口号
clientSocket.connect(serverAdrr) #建立连接
while True:
sendData = raw_input("请输入要发送的数据:") # 接收数据
clientSocket.send(sendData.encode("utf-8")) # 发送编码后的数据
if sendData == 'quit':
break
print clientSocket.recv(1024).decode("utf-8") # 打印接收到的数据
clientSocket.close()
pycharm的服务端源程序server.py代码如下所示:
#!/usr/bin/python
# coding: UTF-8
import socket
from threading import Thread
def main():
listenSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建socket
listenSocket.bind(("49.123.115.249", 12345)) # 绑定端口
listenSocket.listen(5) # 等待客户端连接
while True:
connectSocket, clientAddr = listenSocket.accept() # 建立客户端连接。
th = Thread(target=tcpLink,args=(connectSocket,clientAddr))
th.start()
def tcpLink(connectSocket,clientAddr):
print 'accept connection from:',str(clientAddr)
while True:
recvData = connectSocket.recv(1024).decode("utf-8") # 接受数据
if recvData == 'quit':
break
print str(clientAddr) +' send '+recvData
connectSocket.send('success receive '+recvData.encode("utf-8")) # 发送数据
connectSocket.close()
print 'Connection from %s closed'%str(clientAddr)
if __name__ == '__main__':
main()
参考文献: