Python3 网络通信 网络聊天室 文件传输
Python3 网络通信 网络聊天室 文件传输
功能描述
该项目将实现一个文字和文件传输的客户端和服务器程序通信应用程序。它将传输和接收视频文件。
文本消息必须通过TCP与服务器通信,而客户端自己用UDP传输视频文件。
程序将支持一下功能:
- 用户身份验证
- 向服务器发布消息
- 编辑或删除消息、读取消息
- 从服务器发送消息
- 读取活动用户的信息
- 上传视频文件从一个用户到另一个用户
简要流程
- 该项目将实现各种应用程序协议来实现以上功能。
- 服务器将监听指定为命令行参数的端口,并等待客户端监听连接。
- 客户端程序将发起一个与服务器的TCP连接。
- 在连接建立后,用户将启动身份验证过程。客户端将与用户交互通过命令行界面。
- 身份验证成功后,用户可以执行一系列命令
- 最终登出
- 客户端和服务器都必须打印有意义的提示消息
简要设计
- Server: 使用一个类来保存每个客户端信息,包括用户名和IP地址的映射,并多线程开始接收每个客户端的处理程序。
- Client: 三个线程:主线程为获取用户输入和发送到服务器,和一个线程为接收服务器响应,一个线程UDP传输文件
功能协议
- Login: flag("Login") + username + password
- MSG: flag("MSG") + message
- EDT: flag("EDT") + msg_index + msg_time + new_msg
- DLT: flag("DLT") + msg_index + msg_time
- RDM: flag("RDM") + msg_time
- ATU: flag("ATU")
- OUT: flag("OUT")
- UPD: flag("UDP") + username + filename
Usage
- Server:
python server.py 端口号 最大密码尝试次数
- Client:
python client.py 服务器IP 服务器端口 客户端UDP端口
效果展示
代码
client 点击查看代码
import socket
import threading
import time
import sys
import os
UDP_port = 6666
LoginStatus = False
TCP_running = True
clientSocket = socket.socket()
login_Event = threading.Event()
response_Event = threading.Event()
user_list = []
USERNAME = ""
# get IP address and port after ATU command
def get_address_port_by_username(name):
if len(user_list) == 0:
print("[error] need run ATU command first")
else:
for i in user_list:
user_info = i.split(", ")
username = user_info[0]
address = user_info[1]
port = user_info[2]
if username == name:
return address, port
return None
# LOGIN
def log_in(clientSocket,udp_port):
global USERNAME
print("Username: ", end="")
name = input('')
print("Password: ", end="")
pwd = input('')
FLAG = "LOGIN"
USERNAME = name
PWD = pwd
login_msg = FLAG + "%%" + name + "%%" + PWD + "%%" + str(udp_port)
clientSocket.send(login_msg.encode('utf-8'))
def reponse_to_client(recv_msg):
global TCP_running
global LoginStatus
global login_Event
send_msg = ""
recv_msg_list = []
recv_msg_list = recv_msg.split("%%")
res = True
if len(recv_msg_list) != 0:
flag = recv_msg_list[0]
if (flag == "LOGIN"):
TYPE = recv_msg_list[1]
if(TYPE == "0"):
LoginStatus = True
else:
LoginStatus = False
# inform the main loop the result from server
login_Event.set()
print(recv_msg_list[2])
elif (flag == "MSG"):
print(recv_msg_list[1])
elif flag == "EDT":
TYPE = recv_msg_list[1]
if (TYPE == "0"):
edit_res = True
else:
edit_res = False
print(recv_msg_list[2])
elif (flag == "RDM"):
txt = recv_msg_list[1:]
for i in txt:
print(i)
pass
elif (flag == "DLT"):
TYPE = recv_msg_list[1]
if (TYPE == "0"):
del_res = True
else:
del_res = False
print(recv_msg_list[2])
pass
elif (flag == "ATU"):
NUM = recv_msg_list[1]
if NUM == "0":
print(recv_msg_list[2])
else:
txt = recv_msg_list[2:]
for i in txt:
print(i)
user_list.append(i)
elif (flag == "OUT"):
TCP_running = False
print(recv_msg_list[1])
def read_server(s):
global response_Event
global TCP_running
while TCP_running:
# the thread always receive from server
content = s.recv(2048).decode('utf-8')
reponse_to_client(content)
# inform the mian loop, resume it
response_Event.set()
# s.close()
os._exit(1)
def execute_command(clientSocket):
response_Event.clear()
while TCP_running:
print("Enter one of the following commands (MSG, DLT, EDT, RDM, ATU, OUT, UPD): ", end="")
msg = input('')
if not msg:
continue
command = msg.split(" ")[0]
if command == "MSG":
if len(msg.split(" ")) < 2:
print("need arguments")
continue
txt = msg.split(" ")[1:]
msg = command + "%%" + ' '.join(txt)
elif command == "EDT":
if len(msg.split(" ")) < 2:
print("[error] need arguments")
continue
args = msg.split(" ")[1:]
index = args[0][1:]
dt = ' '.join(args[1:5])
txt = ' '.join(args[5:])
msg = command + "%%" + index + "%%" + dt + "%%" + txt
elif command == "DLT":
if len(msg.split(" ")) < 2:
print("[error] need arguments")
continue
args = msg.split(" ")[1:]
index = args[0][1:]
dt = ' '.join(args[1:])
msg = command + "%%" + index + "%%" + dt
pass
elif command == "RDM":
if len(msg.split(" ")) < 2:
print("[error] need arguments")
continue
dt = ' '.join(msg.split(" ")[1:])
msg = command + "%%" + dt
elif command == "ATU":
if len(msg.split(" ")) < 2:
pass
else:
print("[error] too many arguments")
continue
pass
elif command == "OUT":
if len(msg.split(" ")) < 2:
pass
else:
print("[error] too many arguments")
continue
pass
elif command == "UPD":
if len(msg.split(" ")) < 3:
print("[error] need more arguments")
continue
else:
UDP_send(msg.split(" ")[1], msg.split(" ")[2])
continue
else:
print("[error] unknown command")
continue
clientSocket.send(msg.encode('utf-8'))
# block, waiting for server response
time.sleep(0.3)
response_Event.wait(30)
response_Event.clear()
# mian func
def tcp_start(server_IP, server_port, udp_port):
global clientSocket
clientSocket = socket.socket()
clientSocket.connect((server_IP, server_port))
TCP_t = threading.Thread(target=read_server, args=(clientSocket,)).start()
# login
while LoginStatus == False:
log_in(clientSocket, udp_port)
# waiting for server ...
time.sleep(0.3)
# block, waiting for server response
login_Event.wait(30)
login_Event.clear()
if LoginStatus:
# print("Debug: log in success")
pass
else:
# print("Debug: log in fail")
pass
# commands
execute_command(clientSocket)
def UDP_send(username, filename):
global USERNAME
address, port = get_address_port_by_username(username)
BUF_SIZE = 1024
# print(address, port)
server_addr = (address, int(port))
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
count = 0
f = open(filename, 'rb')
while True:
if count == 0:
# send the first message inculding filename
data = "UDP%%"+USERNAME+"_"+filename
client.sendto(data.encode('utf-8'), server_addr)
data = f.read(BUF_SIZE)
if str(data) != "b''":
client.sendto(data, server_addr)
else:
client.sendto('end'.encode('utf-8'), server_addr) # end for the file and send a speical "end" flag
# lecture1.mp4 has been uploaded
print(filename + " has been uploaded.")
execute_command(clientSocket)
break
count += 1
time.sleep(0.001)
f.close()
client.close()
def UDP_recv(udp_port):
BUF_SIZE = 1024
server_addr = ('127.0.0.1', udp_port)
# UDP: socket.SOCK_DGRAM
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server.bind(server_addr)
count = 0
f = None
filename = ""
while True:
data, addr = server.recvfrom(BUF_SIZE)
if count == 0:
# recive the starting message inculding filename
recv_data_array = data.decode('utf-8').split("%%")
if len(recv_data_array) > 1:
if recv_data_array[0] == "UDP":
filename = recv_data_array[1]
f = open(filename, 'wb')
count += 1
elif str(data) != "b'end'":
try:
f.write(data)
# print(count)
except:
print("[erroe] can not write")
count += 1
else:
f.close()
# print(count)
count = 0
print("\nReceived " + filename.split("_")[1] + " from " + filename.split("_")[0])
if __name__ == '__main__':
# python client.py server_IP server_port client_udp_server_port
if len(sys.argv) > 3:
server_IP = sys.argv[1]
server_port = int(sys.argv[2])
client_udp_server_port = int(sys.argv[3])
udp_recv_t = threading.Thread(target=UDP_recv, args=(client_udp_server_port,)).start()
tcp_start(server_IP, server_port, client_udp_server_port)
else:
print("[error] Usage: python client.py server_IP server_port client_udp_server_port ")
# just for test
# server_IP = "127.0.0.1"
# server_port = 9000
# client_udp_server_port = 7777
# udp_recv_t = threading.Thread(target=UDP_recv, args=(client_udp_server_port,)).start()
# tcp_start(server_IP, server_port, client_udp_server_port)
Server 点击查看代码
# Python 3
# coding: utf-8
from socket import *
import time
import sys
import threading
import traceback
# If true, print debug information
__DEBUG = False
# max number of consecutive failed attempts
MAX_ERR_COUNT = 0
# server IP
serverIP = '127.0.0.1'
# record clients who try to connect to server
client_connect_list = []
# ClientInfo class
# manager client infomation
class ClientInfo():
m_IP=""
m_loginTimestamp = -1
m_preLoginTime = -1
m_username=""
m_UDPServerPort = -1
m_errorCount = 0
def __init__(self, IP):
self.m_IP = IP
def add_logInfo(self, name, timestamp, UDPport):
self.m_loginTimestamp = timestamp
self.m_username = name
self.m_UDPServerPort = UDPport
if self.m_errorCount < MAX_ERR_COUNT:
self.m_preLoginTime = self.m_loginTimestamp
# print("Debug: self.m_errorCount: " + str(self.m_errorCount))
return True
else:
if (int(self.m_loginTimestamp) - int(self.m_preLoginTime) > 30):
self.m_errorCount = 0
self.m_errorCount = self.m_errorCount + 1
return True
else:
return False
# record number_of_consecutive_failed_attempts
def error_password(self):
self.m_errorCount = self.m_errorCount + 1
# check name and password
def check_credential(username, password):
res = False
with open('credentials.txt', 'r') as file:
credential_list = file.readlines()
for credential in credential_list:
name = credential.strip().split(" ")[0]
pwd = credential.strip().split(" ")[1]
if (name==username and pwd == password):
res = True
break
if __DEBUG: print("check_credential: res: " , res)
return res
# Get client infomation by IP
def get_client_from_connect_list(IP):
for c in client_connect_list:
if c.m_IP == IP:
return c
return None
# Add a new client to cse_userlog.txt
def add_user_log(name, timestamp, IP, UDPport):
dt = time.strftime("%d %b %Y %H:%M:%S", time.localtime(int(timestamp)))
address = IP[0]
txt = dt + "; " + name + "; " + address + "; " + str(UDPport)
index = 0
# read old file to get log index
with open('cse_userlog.txt', mode='r', encoding="utf-8") as user_file:
log_list = user_file.readlines()
if log_list:
last_line = log_list[-1]
index = int(last_line.strip().split("; ")[0])
else:
index = 0
# write new log in file
with open('cse_userlog.txt', mode='a+', encoding="utf-8") as user_file:
msg = str(index+1) + '; ' + txt
user_file.write(msg + "\n")
# OUT: delete a client from cse_userlog.txt and adjust other client's index
def del_user_log(name):
new_log_list=[]
index = 1
with open('cse_userlog.txt', mode='r', encoding="utf-8") as user_file:
log_list = user_file.readlines()
for log in log_list:
log_arr = log.split("; ")
log_txt = log_arr[1:]
log_prot = log_arr[4]
log_addr = log_arr[3]
log_name = log_arr[2]
if log_name == name:
if __DEBUG: print("Debug: find same IP need to delete: " + str(log_arr[0]))
pass
else:
txt = "; ".join(i for i in log_txt)
msg = str(index) + "; " + txt
index = index + 1
new_log_list.append(msg)
with open('cse_userlog.txt', mode='w', encoding="utf-8") as user_file:
user_file.writelines(new_log_list)
# ATU: read other user log from cse_userlog.txt and return
def show_user_log_exclude_self(name):
new_log_list=[]
with open('cse_userlog.txt', mode='r', encoding="utf-8") as user_file:
log_list = user_file.readlines()
for log in log_list:
log_arr = log.split("; ")
log_txt = log_arr[1:]
log_name = log_arr[2]
if log_name == name :
if __DEBUG: print("Debug: find same name no need to show: " + str(log_arr[0]))
pass
else:
txt = "; ".join(i for i in log_txt)
msg = txt
new_log_list.append(msg)
return new_log_list
# MSG: When someone posts a new message, add it to the messagelog.txt
def add_msg_log(name, timestamp, txt):
dt = time.strftime("%d %b %Y %H:%M:%S", time.localtime(int(timestamp)))
log_txt = dt + "; " + name + "; " + txt
index = 0
with open('messagelog.txt', mode='r', encoding="utf-8") as msg_file:
log_list = msg_file.readlines()
if log_list:
last_line = log_list[-1]
index = int(last_line.strip().split("; ")[0])
else:
index = 0
with open('messagelog.txt', mode='a+', encoding="utf-8") as msg_file:
msg = str(index + 1) + '; ' + log_txt + '; ' + 'no'
msg_file.write(msg + "\n")
return index + 1
# convert formatted date time to timestamp
def dt_to_timestamp(dt):
timeArray = time.strptime(dt, "%d %b %Y %H:%M:%S")
timeStamp = int(time.mktime(timeArray))
return timeStamp
# RDM: read message log by different time
def read_msg_log(timestamp):
new_log_list=[]
with open('messagelog.txt', mode='r', encoding="utf-8") as msg_file:
log_list = msg_file.readlines()
for log in log_list:
log_arr = log.split("; ")
log_dt = log_arr[1]
log_timestamp = dt_to_timestamp(log_dt)
log_name = log_arr[2]
if log_timestamp < timestamp:
pass
else:
new_log_list.append(log)
return new_log_list
# DLT: delete a client's own message by time
def del_msg_log(name, del_index, del_dt):
del_res = False
del_txt = ""
new_log_list=[]
index = 1
with open('messagelog.txt', mode='r', encoding="utf-8") as msg_file:
log_list = msg_file.readlines()
for log in log_list:
log_arr = log.split("; ")
log_txt = log_arr[1:]
log_dt = log_arr[1]
log_name = log_arr[2]
if log_dt == del_dt and log_name == name and index == del_index:
del_res = True
del_txt = log_arr[3]
if __DEBUG: print("Debug: find same name and index and time need to delete: " + str(log_arr[0]))
pass
else:
txt = "; ".join(i for i in log_txt)
msg = str(index) + "; " + txt
index = index + 1
new_log_list.append(msg)
with open('messagelog.txt', mode='w', encoding="utf-8") as msg_file:
msg_file.writelines(new_log_list)
return del_res, del_txt
# EDT: edit a client's own message by time
def edit_msg_log(name, edit_index, edit_dt, edit_txt):
edit_res = False
new_log_list=[]
edit_time = ''
with open('messagelog.txt', mode='r', encoding="utf-8") as msg_file:
log_list = msg_file.readlines()
for log in log_list:
log_arr = log.split("; ")
log_index = log_arr[0]
log_txt = log_arr[3]
log_dt = log_arr[1]
log_name = log_arr[2]
if log_dt == edit_dt and log_name == name and log_index == str(edit_index):
edit_res = True
edit_time = time.strftime("%d %b %Y %H:%M:%S", time.localtime(int(time.time())))
log_arr[3] = edit_txt
log_arr[1] = edit_time
log_arr[4] = "yes\n"
if __DEBUG: print("Debug: find same name and index and time need to edit: " + str(log_arr[0]))
log = "; ".join(log_arr)
new_log_list.append(log)
if __DEBUG: print("Debug: new log ", log)
else:
new_log_list.append(log)
with open('messagelog.txt', mode='w', encoding="utf-8") as msg_file:
msg_file.writelines(new_log_list)
return edit_res, edit_time
# parse the msg from client and make different responses based on different client commands
def reponse_to_client(clientSocket, IP, recv_msg):
socket_status = True
send_msg = ""
recv_msg_list = []
recv_msg_list = recv_msg.split("%%")
pwd_status = True
if len(recv_msg_list) != 0:
flag = recv_msg_list[0]
else:
print("[error] parse error")
pass
if __DEBUG: print("Debug: flag is " + flag)
client = get_client_from_connect_list(IP)
# response to login
if (flag == "LOGIN"):
name = recv_msg_list[1]
pwd = recv_msg_list[2]
UDPPort = recv_msg_list[3]
pwd_status = check_credential(name, pwd)
# if wrong name and password, number of consecutive failed attempts adds 1
if not pwd_status:
client.error_password()
if client is None:
client = ClientInfo(IP)
client_connect_list.append(client)
# save user information
add_status = client.add_logInfo(name, time.time(), UDPPort)
if add_status == True:
if pwd_status == False:
TYPE = "1"
if client.m_errorCount == MAX_ERR_COUNT:
DATA = "Invalid Password. Your account has been blocked. Please try again later"
else:
DATA = "Invalid Password. Please try again!"
elif pwd_status == True:
TYPE = "0"
DATA = "Log in sucessfully!"
add_user_log(name, client.m_loginTimestamp, IP, client.m_UDPServerPort)
server_output = client.m_username + " log in sucessfully"
print(server_output)
else:
TYPE = "2"
DATA = "Your account is blocked due to multiple login failures. Please try again later"
FLAG = flag
send_msg = FLAG + "%%" + TYPE + "%%" + DATA
# response to "MSG" command
elif (flag == "MSG"):
txt = recv_msg_list[1]
if __DEBUG: print("Debug: " + txt)
timestamp = time.time()
msg_index = add_msg_log(client.m_username, timestamp, txt)
dt = time.strftime("%d %b %Y %H:%M:%S", time.localtime(int(timestamp)))
FLAG = flag
DATA = "Message #" + str(msg_index) + " posted at " + dt
send_msg = FLAG + "%%" + DATA
server_output = client.m_username + " posted MSG #" + str(msg_index) + " \"" + txt + "\" at " + dt + "."
print(server_output)
# response to "RDM" command
elif (flag == "RDM"):
FLAG = flag
DATA = ""
dt = recv_msg_list[1]
try:
timestamp = dt_to_timestamp(dt)
except Exception as e:
print(e)
send_msg = FLAG + "%%" + "unknown time, please check time format"
clientSocket.send(send_msg.encode('utf-8'))
return
log_list = read_msg_log(timestamp)
if len(log_list) == 0:
DATA = "no new message"
else:
# print(log_list)
for log in log_list:
log_arr = log.split("; ")
log_edit_status = log_arr[4]
log_index = log_arr[0]
log_name = log_arr[2]
log_txt = log_arr[3]
log_dt = log_arr[1]
if log_edit_status.strip() == "no":
log_edit_status = "posted"
elif log_edit_status.strip() == "yes":
log_edit_status = "edited"
m = "#" + log_index + " " + log_name + ", " + log_txt + ", " + log_edit_status + " at " + log_dt + "%%"
DATA = DATA + m
send_msg = FLAG + "%%" + DATA
#Yoda issued RDM command
server_output = client.m_username + " issued RDM command."
print(server_output)
# response to "EDT" command
elif (flag == "EDT"):
FLAG = flag
edit_index = int(recv_msg_list[1])
edit_dt = recv_msg_list[2]
edit_txt = recv_msg_list[3]
edit_res, edit_time = edit_msg_log(client.m_username, edit_index, edit_dt, edit_txt)
if edit_res:
TYPE = "0" # del success
DATA = "Message #" + str(edit_index) + " edited at " + edit_time + "."
server_output = client.m_username + " edited MSG #" + str(edit_index) + " \"" + edit_txt + "\" at " + edit_time + "."
print(server_output)
else:
TYPE = "1" # del fail
DATA = "Edit message fail, can not find such message"
server_output = client.m_username + " " + DATA
print(server_output)
send_msg = FLAG + "%%" + TYPE + "%%" + DATA
pass
# response to "DLT" command
elif (flag == "DLT"):
FLAG = flag
del_index = int(recv_msg_list[1])
del_dt = recv_msg_list[2]
del_res, del_txt = del_msg_log(client.m_username, del_index, del_dt)
del_time = time.strftime("%d %b %Y %H:%M:%S", time.localtime(int(time.time())))
if del_res:
TYPE = "0" # del success
DATA = "Message #" + str(del_index) + " deleted at " + del_time + "."
server_output = client.m_username + " deleted MSG #" + str(
del_index) + " \"" + del_txt + "\" at " + del_time + "."
print(server_output)
else:
TYPE = "1" # del fail
DATA = "Delete message fail, can not find such message"
server_output = client.m_username + " " + DATA
print(server_output)
send_msg = FLAG + "%%" + TYPE + "%%" + DATA
# response to "ATU" command
elif (flag == "ATU"):
FLAG = flag
DATA = ""
user_list = show_user_log_exclude_self(client.m_username)
NUM = len(user_list)
if len(user_list) == 0:
DATA = "no other active user"
else:
for user in user_list:
user_arr = user.split("; ")
user_dt = user_arr[0]
user_name = user_arr[1]
user_address = user_arr[2]
user_port = user_arr[3]
txt = user_name + ", " + user_address + ", " + user_port.strip() + ", active since " + user_dt + "."
DATA = DATA + txt + '%%'
send_msg = FLAG + "%%" + str(NUM) + "%%" + DATA
server_output = client.m_username + " issued ATU command."
print(server_output)
# response to "OUT" command
elif (flag == "OUT"):
del_user_log(client.m_username)
client = get_client_from_connect_list(IP)
FLAG = flag
send_msg = FLAG + "%%" + "Bye, " + client.m_username + "!"
socket_status = False
server_output = client.m_username + " logout"
print(server_output)
if send_msg != "":
clientSocket.send(send_msg.encode('utf-8'))
if not socket_status:
clientSocket.close()
# Try to recvice msg from client
def read_client(socket, IP):
try:
return socket.recv(2048).decode('utf-8')
except:
# if exception, indicating that the connection failed, the client is deleted
print(str(IP) + ' Left!')
# Always wait for a message from the client
def recv_handler(socket, clientAddress):
try:
while True:
content = read_client(socket, clientAddress)
if content is None:
break
else:
if __DEBUG: print(str(clientAddress) + " received: " + content)
reponse_to_client(socket, clientAddress, content)
except Exception as e:
# raise Exception
print("[error]: ", e)
exstr = traceback.format_exc()
if __DEBUG: print("debug: " + exstr)
pass
def start(server_port):
serverSocket = socket(AF_INET, SOCK_STREAM)
serverSocket.bind((serverIP, server_port))
serverSocket.listen(1)
print("Server start ... ")
print("waiting client ...")
while True:
clientSocket, clientAddress = serverSocket.accept()
# record each client when server accept successfully
client = ClientInfo(clientAddress)
client_connect_list.append(client)
if __DEBUG: print(str(clientAddress) + ' is trying to connect!')
# start recv_handler for each client
threading.Thread(target=recv_handler, args=(clientSocket, clientAddress)).start()
if __name__ == '__main__':
# create messagelog.txt
msg_file = open('messagelog.txt', 'w')
msg_file.close()
# create cse_userlog.txt
user_file = open('cse_userlog.txt', 'w')
user_file.close()
# python server.py server_port number_of_consecutive_failed_attempts
if len(sys.argv) > 2:
server_port = int(sys.argv[1])
MAX_ERR_COUNT = int(sys.argv[2])
start(server_port)
else:
print("[error] Usage: python server.py server_port number_of_consecutive_failed_attempts ")
# just for test
# server_port = 9000
# MAX_ERR_COUNT = 6
# start(server_port)
Python3 网络通信 网络聊天室 文件传输的更多相关文章
- android asmack 注册 登陆 聊天 多人聊天室 文件传输
XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的 ...
- php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室)
php websocket-网页实时聊天之PHP实现websocket(ajax长轮询和websocket都可以时间网络聊天室) 一.总结 1.ajax长轮询和websocket都可以时间网络聊天室 ...
- 基于Linux的TCP网络聊天室
1.实验项目名称:基于Linux的TCP网络聊天室 2.实验目的:通过TCP完成多用户群聊和私聊功能. 3.实验过程: 通过socket建立用户连接并传送用户输入的信息,分别来写客户端和服务器端,利用 ...
- Qt NetWork即时通讯网络聊天室(基于TCP)
本文使用QT的网络模块来创建一个网络聊天室程序,主要包括以下功能: 1.基于TCP的可靠连接(QTcpServer.QTcpSocket) 2.一个服务器,多个客户端 3.服务器接收到某个客户端的请求 ...
- java基于P2P的聊天和文件传输实例
用java的NIO技术编写的 1. 支持聊天功能 2. 拖拽文件能够实现文件传输功能.也能够是目录 3. 启动时能够选择server端或client端启动 4. 本人原创.学习NIO和java的网络通 ...
- Java NIO示例:多人网络聊天室
一个多客户端聊天室,支持多客户端聊天,有如下功能: 功能1: 客户端通过Java NIO连接到服务端,支持多客户端的连接 功能2:客户端初次连接时,服务端提示输入昵称,如果昵称已经有人使用,提示重新输 ...
- 使用socket搭建一个网络聊天室
#服务器端import socket import threading #创建一个TCP端 sock = socket.socket(socket.AF_INET, socket.SOCK_STREA ...
- Java WebSocket实现网络聊天室(群聊+私聊)
1.简单说明 在网上看到一份比较nice的基于webSocket网页聊天项目,准备看看学习学习,如是有了这篇文章!原博主博客:http://blog.csdn.net/Amayadream/artic ...
- Netty网络聊天室之会话管理
写过web的同学们应该对Session这个东西很熟悉.浏览器第一次与服务器建立连接的时候,服务器就会自动为之分配一个Session.Session可以用来判断用户是否经过登录验证,也可以保存用户的各种 ...
随机推荐
- C# 简单粗暴的毫秒转换成 分秒的格式
C# 简单粗暴的毫秒转换成 分秒的格式 1:code(网络上很多存在拷贝或者存在bug的或者不满足自己的要求) 1 public static string RevertToTime(double m ...
- 发布 mbtiles 存储的矢量瓦片
之前我们分享过如何 在本地发布OSM矢量瓦片地图,里面介绍了生成的矢量瓦片会存放在 .mbtiles 文件中,然后用 tileserver-gl 软件发布. mbtiles 是基于sqllite数据库 ...
- FeignClient注解属性configuration不生效问题排查思路
FeignClient注解属性configuration不生效问题排查思路 问题背景 我们知道,"如果需要自定义单个Feign配置,Feign的@Configuration 注解的类不能与@ ...
- Java变量命名规范
java命名规范 所有方法.变量.类名:见名知意 类成员变量:首字母小写.驼峰原则: 例如:lastName 第一个单词首字母小写,其余首字母大写 局部变量:首字母小写.驼峰原则 类名: 首字母小写. ...
- 【Azure 应用服务】Python flask 应用部署在Aure App Service 遇见的 3 个问题
在App Service(Windows)中部署Flask应用时的注意事项: ● 添加Python扩展插件,Python 3.6.4 x64: ●● 配置 FastCGI 处理程序,添加Web.con ...
- Spring Boot 入门系列(二十四)多环境配置,3分钟搞定!
之前讲过Spring Boot 的系统配置和自定义配置,实现了按照实际项目的要求配置系统的相关熟悉.但是,在实际项目开发过程中,需要面对不同的环境,例如:开发环境,测试环境,生产环境.各个环境的数据库 ...
- 20210816 你相信引力吗,marshland,party?,半夜
考场 第一眼都不可做 T1 长得就像单调栈/单调队列,推了推性质发现优弧.劣弧都合法的点对很好处理,其他情况只在一种情况合法,那么开两个单调队列分别统计距离 \(\le\frac2n,>\fra ...
- WEB漏洞——文件上传
有关文件上传的知识 为什么文件上传存在漏洞 上传文件时,如果服务端代码未对客户端上传的文件进行严格的验证和过滤就容易造成可以上传任意文件的情況,包括上传脚本文件(asp.aspx.php.jsp等格式 ...
- SpringBoot-自动配置分析-图解
- CentOS 7操作系统安装
1.关于运维小伙伴可以采用何种方式安装操作系统 下面列举的只是我会用到的安装方式,在运维过程中并不一定是最优解,只是自己运维过程中的一些经验. (1)物理服务器,可以通过连接管理口来安装操作系统,管理 ...