实现简单的TCP交互

用python实现TCP的交互

简单的思路,由服务端和客户端组成,都要导入socket,threading(这里线程的主要作用是实现多个用户同时访问,可以让每个用户占一个子线程,如若不适用线程,在多个用户进行访问的时候,主线程陷入循环之中,无法为更多的用户提供服务。)
TCP实现原理

  1. 步骤一
    创建服务端,不多说,直接上代码!`
# -*- conding:utf-8 -*-
'''
Created on 2018年9月14日
@author: zkx
'''
import socket
import threading
#socket又俗称套接字
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
#socket.AF_INET  表示IPV4(默认)socket.SOCK_STREAM  流式socket for TCP(默认)
address ='127.0.0.1',105
s.bind(address)#自己设定的ip和端口号       默认的AF_INET下这样以元组的形式存在即(ip,port) 和客户端相同
s.listen(5)#开始监听传入连接。指定在拒绝连接之前,可以挂起的最大连接数量 ,这个值不能无限大,因为需要在内核中维护连接队列
con,address =s.accept()#接收连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据,address是连接客户端的地址。
print('%s have connection'%address[0])#显示客户端id连接
con.send('Hello ,I am python'.encode())#将数据发送到连接的ip
isok=True
def receive(con):
    global isok 
    while isok:
        rece_data =str(con.recv(1024),encoding="utf_8")#接收套接字的数据,数据以字符串形式返回,1024指定最多可以接收的数量 ,设置编码集格式,防止编码发生错误
        if rece_data =='exit': #当输入exit的时候,退出循环
            isok=False
        print(rece_data) 
thrd =threading.Thread(target=receive,args=(con,))#实例化子线程,线程作用目标为receive方法,参数是con
thrd.start()#线程开启

#主线程
while isok:
    #将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有的数据,成功返回None,失败则抛出异常
    send_d =input("server>")#用于区别客户端和服务端
    con.sendall(bytes(send_d,encoding='utf_8'))#以字节的形式将全部数据发送给客户端,规定编码集
    if send_d == 'exit': #当输入exit的时候,退出循环
        isok =False
s.close() #关闭套接字

2 步骤二 创建服务端

# -*- conding:utf-8 -*-
'''
Created on 2018年9月14日
@author: zkx
'''
import socket
import threading

cl =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#socket.AF_INET  表示IPV4(默认)socket.SOCK_STREAM  流式socket for TCP(默认)
address='127.0.0.1',105
cl.connect(address)#连接到address处的套接字,一般,address的格式为元组(hostname,port),和服务端的相同

isok=True
def receive (cl):
    global isok
    while isok:
        t =cl.recv(1024).decode('utf_8')#接收套接字的数据,数据以string形式返回,1024指定最多可以接收的数量
        if t == 'exit':#输入exit,退出循环
            isok = False
        print(t) 
th2=threading.Thread(target=receive,args=(cl,))#实例化子线程,线程作用目标为receive方法,参数是cl
th2.start() #开启子线程
#主线程
while isok:
    t =input()
    cl.send(t.encode(encoding='utf_8'))#向服务端发送数据,规定编码集
    if t =='exit':#输入exit,退出循环
        isok =False
cl.close()#关闭套接字

3 结果演示
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_42747175/article/details/82707939