import time #时间
import socket #这个py中的主要模块 Socket
import threading #多线程
#------Socket也是刚学,可能会出现点解释上的问题,有错的话请大佬指出,谢谢!------
#TCP
def tcp_serverside(): #定义函数tcp_serverside() [服务端]
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建套接字 (TCP)
s.bind((str(socket.gethostname()),32767)) #绑定信息 (需要元组)
s.listen(5) #加上listen()之后该套接字从默认的主动变成被动,这样就可以接收别人的连接
print("Waiting for client connecting...") #提示用户正在等待客户连接
c,addr = s.accept() #阻塞,直到客户连接(可以取消阻塞,但是取消阻塞后执行该函数时若没有客户端可以连接则会出错) [c是客户端套接字,addr是客户端信息(吧?)]
print("\nClient Connected: " + str(addr) + "\nSocket: " + str(c)) #当客户连接时输出客户信息
rec = c.recv(1024).decode() #接收来自客户端的数据 (若不加decode(),则收到的数据会出现这种情况: b'Test')
print("Client: " + str(rec)) #输出收到的数据
while True: #死循环
receive = c.recv(1024).decode() #接收来自客户端的数据
print("Client: " + str(receive)) #输出收到的数据
def tcp_clientside(): #定义函数tcp_clientside() [客户端]
global c #定义一个全局变量,如果这里不写,要么就是NameError(变量在该函数之前没有定义),要么就是UnboundLocalError(变量在该函数之前定义)
c = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建套接字 (TCP)
c.connect((str(socket.gethostname()),32767)) #连接服务端 (需要元组)
c.send(b'Test if connected successfully') #发送数据 "Test" (发送的数据要么就是b'',内容在引号中间,要么就需要在后面加encode(),比如"Test".encode())
sside = threading.Thread(target=tcp_serverside) #构造线程函数
sside.start() #开始线程活动
time.sleep(1) #延迟1秒
tcp_clientside() #执行函数 tcp_clientside()
time.sleep(1) #延迟1秒,防止显示错误
while True: #死循环
c.send(input("Send >> ").encode()) #发送输入的数据至服务器
time.sleep(1) #延迟1秒,防止显示错误
###小注释
###socket.gethostname(): 获取本机主机名
###至于为什么要开一个线程,因为我懒得再搞一个py文件,并且Python自带的IDLE不能双开Python Shell,所以就把客户端和服务端放一起了