半双工通信
使用python的socket库
本次实现的是客户端与服务端的通信,以后还会实现全双工通信,还会添加群聊,可能还会尝试使用UDP。
代码如下:
# 服务端
import socket as sk
port = 134
socket = sk.socket(sk.AF_INET, sk.SOCK_STREAM)
host = sk.gethostname()
socket.bind((host, port))
socket.listen(5)
while True:
print("监听中...")
connection, address = socket.accept()
print("{}请求连接".format(address))
state = input("Y/N?")
if state == "N":
connection.send("Sorry, the server refuse your connection.".encode('utf-8'))
socket.close()
print("拒绝连接")
elif state == "Y":
print("允许连接")
connection.send("Connect successfully".encode('utf-8'))
name = connection.recv(2048).decode('utf-8')
print("连接成功")
print("Welcome {}!".format(name))
connection.send("Welcome {}!".format(name).encode('utf-8'))
while True:
data = connection.recv(2048).decode('utf-8')
if data == "quit":
print("{} 离开了聊天室".format(name))
connection.close()
print(data)
connection.send(input().encode('utf-8'))
客户端
# import socket as sk
ip = input("请输入目标IP:")
port = int(input("请输入端口号:"))
socket = sk.socket(sk.AF_INET, sk.SOCK_STREAM)
socket.connect((ip, port))
socket.settimeout(180)
print(socket.recv(2048).decode('utf-8'))
name = input("请输入昵称:")
socket.send(name.encode('utf-8'))
print(socket.recv(2048).decode('utf-8'))
print("开始聊天吧!(输入‘quit’退出聊天)")
while True:
data = input().encode('utf-8')
if data.decode('utf-8') == "quit":
socket.send(data)
socket.close()
break
else:
socket.send(data)
print("等待对方输入。。。")
print(socket.recv(2048).decode('utf-8'))
客户端输出如下:
服务端输出如下:
已知缺陷:由于socket.recv()是阻塞的,所以当发送空消息时会导致客户端与服务端同时阻塞,通过对消息进行过滤应该可以解决,这次先就这样,以后再改。
PS:注意服务端端口可能会被占用,建议先用netstat命令查看端口占用然后进行修改
等全部完成后项目会上传github