概念:
创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。 服务器端编程如下:
第一步:创建一个socket对象
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
上面的代码创建了一个socket对象。type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。AF_INET表示创建的是ip v4的类型。
socket(address_family,type,protocol_type)
上面三个参数的含义是:
address_family指明要建立哪一类socket。最常用的当然是ip协议,AF_INET。在unix系统中,AF_UNIX也是比较常用的,用于建立unix系统中的进程间通信。
type用于指定通信类型。通常是建立面向连接的流通信。SOCKET_DGRAM是报文通信。如果address_family设置的是AF_INET,那么对应的是TCP和UDP。
protocol_type用于指定协议类型。这个参数是可选的。在建立tcp或者是udp连接的时候他们通常都是0。如果第一个参数是AF_INET,那么这个参数表示是ip包中的protocol字段。
第二步:是将socket绑定到指定的地址:
例:
sock.bind(('localhost',7556)) # 两个参数 :地址、端口
第三步:监听端口: :【listen方法中的参数指明可接受的最大连接数】
sock.listen(5)
第四步:不断接收请求:收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求.
connection,address = sock.accept()
accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。
第五步:是处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。如果send成功了,那么对方的缓冲区已经有你发送的数据了。
#调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符 串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
例子: 取自:python TCP编程:——廖雪峰:例:
TCP服务器端连接:
# -*- coding:utf-8 -*-
' a socket example which send echo message to client.'
import socket, threading
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口:
s.bind(('127.0.0.1', 9999)) # 127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。
s.listen(5)
print 'Waiting for connection...'
def tcplink(sock, addr):
print 'Accept new connection from %s:%s...' % addr
sock.send('Welcome,Godwj')
while True:
data = sock.recv(1024)
time.sleep(1)
if data == 'exit' or not data:
break
sock.send('Hello, %s!' % data)
sock.close()
print 'Connection from %s:%s close.' % addr
while True:
# 接受一个新连接:
sock, addr = s.accept() #accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素sock 是新的socket对象,服务器必须通过它与客户通信;第二个元素 addr是客户的Internet地址
# 创建新线程来处理TCP连接:
t = threading.Thread(target = tcplink, args =(sock, addr))
t.start()
客户端编程如下:
第一步:第一步:创建一个socket对象
第二步:建立连接
TCP客户端-例子:
# -*- coding:utf-8 -*-
'a socket example which send echo message to server'
import socket
# 创建socket对象:
a = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接:
a.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print a.recv(1024)
for data in ['Michael', 'Tracy', 'Green']:
# 发送数据:
a.send(data)
print a.recv(1024)
a.send('exit')
a.close()
(ps: 以上内容仅为学习参考使用)
服务器端编程如下:
第一步:创建一个socket对象
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
上面的代码创建了一个socket对象。type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。AF_INET表示创建的是ip v4的类型。
上面三个参数的含义是:
address_family指明要建立哪一类socket。最常用的当然是ip协议,AF_INET。在unix系统中,AF_UNIX也是比较常用的,用于建立unix系统中的进程间通信。
type用于指定通信类型。通常是建立面向连接的流通信。SOCKET_DGRAM是报文通信。如果address_family设置的是AF_INET,那么对应的是TCP和UDP。
protocol_type用于指定协议类型。这个参数是可选的。在建立tcp或者是udp连接的时候他们通常都是0。如果第一个参数是AF_INET,那么这个参数表示是ip包中的protocol字段。
第二步:是将socket绑定到指定的地址:
例:sock.bind(('localhost',7556)) # 两个参数 :地址、端口
第三步:监听端口: :【listen方法中的参数指明可接受的最大连接数】
sock.listen(5)
第四步:不断接收请求:收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求.
connection,address = sock.accept()
accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素 address是客户的Internet地址。
第五步:是处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。如果send成功了,那么对方的缓冲区已经有你发送的数据了。 #调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符 串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区 删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。
例子: 取自:python TCP编程:——廖雪峰:例:TCP服务器端连接:# -*- coding:utf-8 -*- ' a socket example which send echo message to client.' import socket, threading import time s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 监听端口: s.bind(('127.0.0.1', 9999)) # 127.0.0.1是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。 s.listen(5) print 'Waiting for connection...' def tcplink(sock, addr): print 'Accept new connection from %s:%s...' % addr sock.send('Welcome,Godwj') while True: data = sock.recv(1024) time.sleep(1) if data == 'exit' or not data: break sock.send('Hello, %s!' % data) sock.close() print 'Connection from %s:%s close.' % addr while True: # 接受一个新连接: sock, addr = s.accept() #accept方法返回一个含有两个元素的 元组(connection,address)。第一个元素sock 是新的socket对象,服务器必须通过它与客户通信;第二个元素 addr是客户的Internet地址 # 创建新线程来处理TCP连接: t = threading.Thread(target = tcplink, args =(sock, addr)) t.start()客户端编程如下:第一步:第一步:创建一个socket对象
TCP客户端-例子:第二步:建立连接
# -*- coding:utf-8 -*- 'a socket example which send echo message to server' import socket # 创建socket对象: a = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 建立连接: a.connect(('127.0.0.1', 9999)) # 接收欢迎消息: print a.recv(1024) for data in ['Michael', 'Tracy', 'Green']: # 发送数据: a.send(data) print a.recv(1024) a.send('exit') a.close()
(ps: 以上内容仅为学习参考使用)