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可以用来判断用户是否经过登录验证,也可以保存用户的各种 ...
随机推荐
- Qt5之反射机制(内省)
Qt的元对象系统除了提供信号/槽机制的特性之外,它还提供了以下特性: QObject::metaObject() 返回关联的元对象 QMetaObject::className() 在运行时状态下返回 ...
- 通俗易懂讲解Word2vec的本质
本文首发于微信公众号「对白的算法屋」,来一起学AI叭 一.Word2vec CBOW(Continuous Bag-of-Words):每个词的含义都由相邻词决定. Skip-gram:依据分布的相似 ...
- LNMP zabbix 4.4 安装
硬件配置需求 环境 平台 CPU/内存 数据库 硬盘 监控主机数 小型 CentOS 2CPU/1GB MySQL.InnoDB 普通 100 中型 CentOS 2CPU/2GB MySQL.Inn ...
- shell循环语句while
格式1: while 条件 do 执行命令 done 格式2: while 条件;do 命令 done 例子: while [ 1 -eq 1 ];do echo "这一步需要先修改/dat ...
- noip模拟18
\(\color{white}{\mathbb{曲径通幽,星汉隐约,缥缈灯影,朦胧缺月,名之以:薄雾}}\) 放眼望去前十被我弃掉的 \(t2\) 基本都上85了-- 开考就以为 \(t2\) 是个大 ...
- 专项测试-App性能分析
专项测试 app性能 Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastRece ...
- Jsoup快速查询
一.selector选择器 二.Xpath查询
- vue-element-admin 全局loading加载等待
最近遇到需求: 全局加载loading,所有接口都要可以手动控制是否展示加载等待的功能 当拿到这个需求的时候我是拒绝的,因为我以及局部写好了0.0,这是要大改呀....,没办法老板的要求,只能硬着头皮 ...
- 使用Eclipse对weblogic进行远程调试
一.环境说明 weblogic12c,linux centOS 6.5,eclipse mars. 二.步骤 1.找到weblogic根目录下user_projects/domains/域名/bin/ ...
- (9)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-搭建Eureka服务注册中心
首先创建一个 Maven 项目,取名为 eureka-server,在 pom.xml 中配置 Eureka 的依赖信息,代码如下所示. <!-- Spring Boot --> &l ...