python网络编程之tcp通信

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通信。

  1. s.bind():绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址。第一个参数为ip地址,如果为”“,表示为本机ip,第二个参数为端口号
  2. s.close():关闭套接字
  3. s.listen(backlog):开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
  4. s.accept():接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
  5. s.connect(address):连接到address处的套接字。一般address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
  6. s.recv(bufsize[,flag]):接受TCP套接字的数据。数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。
  7. 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()

参考文献:

  1. 菜鸟Python教程之Python 网络编程:用到的一些socket模块的函数介绍
  2. Python网络编程之socket模块实例讲解(一)
  3. 用Python进行TCP网络编程的教程
  4. 利用Python进行TCP、UDP套接字编程
  5. python socket编程详细介绍

猜你喜欢

转载自blog.csdn.net/yeqiang19910412/article/details/80441102