1.TCP服务端编写过程
2.TCP服务端代码
3.TCP客户端编写过程
4.TCP客户端代码
1.TCP服务端编写过程
首先,网络编程分为客户端编程和服务端编程。先说说服务端的编写
TCP服务端的编写过程
0.所需要引入的包: import socket
1.socket():socket模块中的socket对象 可用于建立一个套接字。原形:socket(family,type)
family 填 :socket.AF_INET 表示地址族为 ipv4 (现在还基本都是用 IPv4)
type 填 :socket.SOCK_STREAM 表示用的协议是 流协议(即TCP)
返回值 : 返回一个套接字对象,暂且把它叫做 s
2.bind():用于把 套接字和(主机地址,端口号)进行绑定,使套接字和主机相关联
bind()是存在套接字对象中的。调用时: 套接字.bind() ,例 s.bind()
bind()只有一个参数: 这个参数是个元组,里面的元素是 主机ip号和端口号,即 bind((ip,端口) )
3.listen():把程序进入监听模式,等待客户端的连接。把socket设置成服务器模式
一个整型参数:这个参数指定程序拒绝连接前,操作系统允许它挂起的连接数量,一般设置为5就行了
同样这个方法也是要用套接字对象调用的,即 s.listen()
4.accept():它会阻塞直到有客户端连接进来,然后返回一个元组,元组的数据是 代表客户端的新套接字 和 客户端的地址
同样这个方法也是要用套接字对象调用的
5.close():用于关闭套接字,停止本进程与服务端或客户端的连接
同样这个方法也是要用套接字对象调用的
6.recv():用于接收远程连接发来的信息,并返回接收到的信息
当没有消息发来时会阻塞。
有一个整形参数:用于指定缓冲区的大小
同样这个方法也是要用套接字对象调用的
7.sendall():用于向远端发送消息 (用sendall代替send)
有一个整数:指定发送的对象或数据
同样这个方法也是要用套接字对象调用的
2.TCP服务端代码
import socket #引入socket模块
HOST = '' #服务端不需要指定绑定的本地IP地址
PORT = 8888 #指定端口号为 8888
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建套接字
s.bind((HOST,PORT)) #绑定套接字
s.listen(5) #监听
conn,addr = s.accept() #等待客户端连接,有客户端连接则返回一个新的套接字来表示客户端
print('Client\'s addr:',addr) #打印客户端的信息
while True: #循环接收来自服务端的信息
data = conn.recv(1024) #接收客户端的信息
if not data:
break
print('Receive data:',data.decode('utf-8')) #打印客户端发来的信息,并以utf-8的编码方式来解码。(因为客户端是以UTF-8来编码的 )
conn.sendall(data) #把收到的信息发回客户端
conn.close() #关闭套接字
3.TCP客户端编写过程
0.也需要引入 socket模块。 import socket
1.socket():上面已经说过了
2.connect():用于连接服务器
参数:接收一个元组,包含服务器的 IP地址 和 服务器指定的端口号
同样这个方法也是要用套接字对象调用的
3.recv()和send()和close()上面都说过了
4.客户端代码
import socket
HOST = 'localhost' #服务端的ip地址,但由于我是在同一台电脑测试,所以就用localhost这个宏
PORT = 8888 #服务端指定的端口
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建套接字
s.connect((HOST,PORT)) #连接服务端
data=input("please enter data") #从键盘输出信息
while data:
s.sendall(data.encode('utf-8'))
data = s.recv(512)
print('Receive data:\n',data.decode('utf-8'))
data = input('please enter data')
s.close()