首先我们要了解服务端的代码逻辑和客户端的代码逻辑
服务端的代码逻辑
创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
绑定IP和端口号
#绑定IP和端口 端口<=65535
s.bind(('127.0.0.1',3428))
等待客户的连接
有人来
创建一个线程用于收数据
创建一个线程用于发数据
发送数据线程
等待服务端在终端输入内容,然后方发送给客户端
收数据线程
等待客户端发送的数据,然后打印到终端
关闭连接
s.close()
客户端的代码逻辑
创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
连接指定的服务端的IP和端口号
#连接指定端口,IP
s.connect(('127.0.0.1',3428))
创建一个线程用于收数据
创建一个线程用于发数据
发送数据线程
等待客户端在终端输入内容,然后方发送给服务端
收数据线程
等待服务端发送的数据,然后打印到终端
关闭连接
s.close()
使用的模块
import socket,threading
整体代码如下:
1.简单的
服务端:
import socket,threading#通信使用的模块
#新建套接字
def threadFun(ssock):
print("有人来了")
while True:
if ssock is not None:
buff = ssock.recv(1024)
str = buff.decode('utf-8')
if str == "close":
print("client close")
break
elif str == "":
break
else:
print("接收的数据:%s"%buff.decode('utf-8'))
else:
break
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定IP和端口 端口<=65535
s.bind(('127.0.0.1',3428))
#开启监听
s.listen(5)
#等待连接
while True:
#一直等待用户来连接
print("等待连接")
conn,address = s.accept()
th = threading.Thread(target=threadFun,args=(conn,))
th.start()
print("有人来了")
print(conn)
print(address)
buff = conn.recv(1024)
print("接受的数据:%s"%buff.decode('utf-8'))
s.close()
客户端:
import socket
#创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接指定端口,IP
s.connect(('127.0.0.1',3428))
#发送数据
while True:
str = input("#:")
if(str == ""):
break
#print("发送数据")
s.send(str.encode('utf-8'))
#关闭连接
s.close()
先运行服务端,再运行客户端
2.复杂的
服务端:
#通信使用的模块
import socket,threading
def threadRecvFun(ssock):
print("有人来了:%s"%threading.current_thread().name)
while True:
buff = ssock.recv(1024)
str = buff.decode('utf-8')
print("接受的数据:%s" % buff.decode('utf-8'))
def threadSendFun(ssock):
while True:
str = input("#:")
ssock.send(str.encode('utf-8'))
# 新建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP和端口 端口<=65535
s.bind(('127.0.0.1',3428))
# 开启监听
s.listen(5)
# 等待连接
while True:
#一直在这里死等用户来连接
print("等待连接")
conn,address = s.accept()
th1 = threading.Thread(target=threadRecvFun,args=(conn,))
th1.start()
th2 = threading.Thread(target=threadSendFun, args=(conn,))
th2.start()
s.close()
客户端:
# 运行的模块
import socket,threading
def threadSendFun(ssock):
while True:
str = input("#:")
ssock.send(str.encode('utf-8'))
def threadRecvFun(ssock):
while True:
buff = ssock.recv(1024)
str = buff.decode('utf-8')
print("接受的数据:%s" % buff.decode('utf-8'))
# 创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 连接指定的IP和端口
s.connect(('127.0.0.1',3428))
# 发送数据
th1 = threading.Thread(target=threadRecvFun, args=(s,))
th1.start()
th2 = threading.Thread(target=threadSendFun, args=(s,))
th2.start()
先运行服务端,再运行客户端
服务端:
客户端:
可以通过在同一局域网下或者热点下聊天。
一个可以扮演服务端,另一个可以扮演客户端。
记得把客户端的IP地址修改为服务端的IP地址。