類似QQ的聊天工程

来源:https://www.cnblogs.com/xm970829/archive/2018/05/26/xm970829.html
-Advertisement-
Play Games

個人學習Java的第一個完成的項目,分享給大家。有不好的地方,請多指教。 ...


首先建立一個html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>far</title>
<style>
#chatWindow{
font-family: 微軟雅黑;
height:700px;
width:800px;
font-size:12px;/*字體大小*/
position: absolute;/*絕對定位*/
/*margin:auto;自動佈局,容器居中*/
/*陰影效果*/
box-shadow: gray 0px 4px 5px;/*陰影:顏色*/

display: none;/*開始不顯示chatWindow這個div*/
}
#title{
height:40px;
line-height:40px;
/**/
/*背景漸變*/
background:-webkit-linear-gradient(left, #4B8CFE 0%,#ffffff 120%);
text-align: center;/*容器中的內容居中*/
color:white;/*字體顏色*/
}
#data{
height:400px;
border-top:1px solid gray;
border-bottom:1px solid gray;
overflow-y:auto;/*溢出部分顯示滾動條*/
padding: 2px;
}
#util>a{
display: inline-block;
width: 30px;
height: 25px;
margin: 0 5px;
}
#util>a:hover{
background-color: gray;
border-radius: 4px;
}
#send{
height:180px;
padding: 5px;/*上下左右都和輸入內容有點(5px)距離*/
outline: none;/*去掉邊框*/
overflow-y:auto;/*溢出部分顯示滾動條*/
}
#btns{
text-align: right;
padding-right: 10px;/*盒子的內容距離邊框的距離,簡稱內距離*/
}
.btnSetting{/* .代表class*/
width:72px;
height:28px;
display: inline-block;/*轉成行塊標簽*/
line-height: 28px;
border:1px solid gray;
font-size:12px;font-family:"微軟雅黑";text-align: center;
border-radius: 3px;/*圓角*/
text-decoration: none;/*去除下劃線*/
margin-right:10px;/*外間距,盒子與別的盒子的距離*/
vertical-align: 1px;/*垂直位置上的調整*/
}
.i1{
background:url("/images/1.jpg") no-repeat center;
}
.i2{
background: url("/images/2.jpg") no-repeat center;
}
.i3{
background: url("/images/3.jpg") no-repeat center;
}
.dataBox{
border-radius: 5px;
padding: 3px;
background-color: #66afe9;
color:black;
width:auto;/*內容不固定大小,多少內容就用多少空間,可換行*/
display: inline-block;
margin-left: 10px;
}
.fright{
float:right;
clear: both;
text-align: right;
}
.fleft{
float:left;
clear: both;
}
.dou{
clear:both;
text-align: center;
line-height: 30px;
border-radius: 5px;
background-color: #4B8CFE;
}
#closeBtn {
color: black; /*字體顏色*/
}
#closeBtn:hover{
background-color: #EFEFF0;
}
#sendBtn {
background-color: #4B8CFE;
color:white;/*字體顏色*/
}
#sendBtn:hover{
background-color: #47C8F8;
}
</style>
<link rel="stylesheet" href="/css/facebox.css">
<script src="js/jquery-2.1.1.min.js"></script>
<script src="js/jquery.qqFace.js"></script>
<script>
var ws;
//#:找到id為chatBtn的節點,綁定一個點擊事件 $符號代表框架。
$(document).ready(function () {
$("#chatBtn").click(function () {
//找到nickName獲取val值。
var nickName = $("#nickName").val();
if ($.trim(nickName) == "") {//trim()函數的作用是去掉左右兩邊的空格。
alert("請輸入昵稱!");
return;//結束該函數
}
var url = "ws://" + window.location.hostname + ":8080/chatHandle/" + nickName;
//var url1="ws://"+window.location.hostname+":8080/chatHandle/"+fang;
//document.write(url+url1);
ws = new WebSocket(url);
//當後臺伺服器發了消息的時候,獲取到後臺消息
ws.onmessage=function (chatBtn) {
var index=chatBtn.data.indexOf("\0");
if(index>=0) {
dou();
}
$("#data").scrollTop(520);
$("#data").append(chatBtn.data+"<br>");
}
$("#join").hide();
$("#chatWindow").show();
/*
關閉按鈕
*/
$("#closeBtn").click(function () {
ws.close();//關閉客戶端與服務端的連接
$("#join").show();
$("#chatWindow").hide();
})
/*
發送按鈕
*/
$("#sendBtn").click(function () {
var val=$("#send").html();
//清空
$("#send").html("");
//聚焦
$("#send").focus();
//獲取併發送
ws.send(val);
})
//添加快捷鍵
$("#send").keydown(function (event) {
if(event.altKey && event.keyCode==67){
$("#closeBtn").click();//模擬手動點擊,代碼點擊;
}
if((event.altKey && event.keyCode==83)|| event.keyCode==13){
$("#sendBtn").click();//模擬手動點擊發送按鈕,代碼點擊;
}
})
})
var reader=new FileReader();
var myFile=document.getElementById("myFile");
myFile.onchange=function () {
var chooseFile=myFile.files[0];
reader.readAsDataURL(chooseFile);
}
reader.onload=function () {
var obj=document.createElement("img");
obj.src=reader.result;
$("#send").append(obj);
}
$("#myFile").hide();
$(".i1").click(function () {
$("#myFile").click();
})
$(".i2").qqFace({
id:'facebox',
assign:'send',
path:'arclist/'
})
/*拖拽部分*/
var title=document.getElementById("title");
var pyx,pyy;
title.ondragstart=function (e) {
pyx=e.offsetX;
pyy=e.offsetY;
}
title.ondrag=function (e) {
var x=e.pageX;
var y=e.pageY;
if(x==0&&y==0) return;
$("#chatWindow").css("left",x-pyx);
$("#chatWindow").css("top",y-pyy);
}
$(".i3").click(function () {
ws.send("\0");
})
function dou() {
var initx=$("#chatWindow").offset().left;
var inity=$("#chatWindow").offset().top;
for(var i=0;i<=10;i++){
$("#chatWindow").animate({"left":initx-10,"top":inity-10},10);
$("#chatWindow").animate({"left":initx,"top":inity},10);
$("#chatWindow").animate({"left":initx+10,"top":inity+10},10);
$("#chatWindow").animate({"left":initx,"top":inity},10);
}
}
})
</script>
</head>
<body>
<div id="join"><!-----div可以看成一個盒子,容器。固定頁面佈局。CSS(放head裡面)相當對html的"化妝";------->
<input id="nickName" type="text"><br>
<input id="chatBtn" type="button" value="加入聊天室"><br>
</div>
<div id="chatWindow">
<div id="title" draggable="true">far away</div>
<div id="data"></div><!----聊天內容------->
<div id="util"><!--工具區域-->
<input type="file" id="myFile">
<a class="i1" href="javascript:;"></a>
<a class="i2" href="javascript:;"></a>
<a class="i3" href="javascript:;"></a>
</div>
<div id="send" contenteditable="true"></div><!----要發送內容------->
<div id="btns"><!------發送和關閉按鈕-------->
<a id="closeBtn" class="btnSetting" href="javascript:;">關閉(<u>C</u>)</a>
<a id="sendBtn" class="btnSetting" href="javascript:;">發送(<u>S</u>)</a>
</div>
</div>
</body>
</html>

後臺控制代碼:
package com.seecon.Chat.handle;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import javax.websocket.server.PathParam;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

@ServerEndpoint("/chatHandle/{nickName}")
public class ChatHandle {
//創建一個靜態的“袋子”(跟對象無關),用來裝所有的session,也就是所有用戶的會話;
private static List<Session> users=new ArrayList<Session>();//static可以共用。
public static synchronized void add(Session session){//靜態方法不依賴對象
users.add(session);
}
public synchronized static void remove(Session session){
users.remove(session);
}
private void sendAll(String message){
for (Session user : users) {
user.getAsyncRemote().sendText(message);
}
}
private String nickName;/*當前會話的昵稱*/
@OnOpen
public void connect(Session session,@PathParam("nickName") String nickName) throws Exception {
System.out.println(nickName + "連接上了後臺伺服器程式" + session);
add(session);
sendAll("<div class='fleft'>-----歡迎[" + nickName + "]------加入聊天室 "+"當前聊天室人數:"+users.size()+"</div>");
this.nickName=nickName;
}
@OnClose
public void exit(Session session,@PathParam("nickName") String nickName) throws Exception{
remove(session);
sendAll("<div class='fright'>----[" + nickName + "]------退出聊天室"+"當前聊天室人數:"+users.size()+"</div>");
}
@OnMessage
public void receiveMessage(Session session,String message) throws Exception{
Calendar c=Calendar.getInstance();
int hour=c.get(Calendar.HOUR_OF_DAY);
String hourStr=hour>=10?hour+"":"0"+hour;
int minute=c.get(Calendar.MINUTE);
String minuteStr=minute>=10?minute+"":"0"+minute;
int second=c.get(Calendar.SECOND);
String secondStr=second>=10?second+"":"0"+second;
String fullTime=hourStr+":"+minuteStr+":"+secondStr;
//構建message
if(message.equals("\0")){
message="<div class='dou'>"+nickName+"給您發送了一個視窗抖動</div>";
String str="&nbsp;&nbsp;"+fullTime+"<br>"+message;
sendAll("\0"+str);
}else {
message = "<div class='dataBox'>" + message + "</div>";
String str = nickName + "&nbsp&nbsp" + fullTime + "<br>" + message;
sendAllMessage(str, session);
}
}
private void sendAllMessage(String message,Session session){
//把Message的數據通知給所有會話
for(Session user:users){
if(user==session){
user.getAsyncRemote().sendText("<div class='fright'>"+message+"</div>");
}
else{
user.getAsyncRemote().sendText("<div class='fleft'>"+message+"</div>");

}
}
}

}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 每個 Android 應用進程在創建時,會同時創建一個線程,我們稱之為主線程,負責更新 UI 界面以及和處理用戶之間的交互,因此,在 Android 中,我們又稱之為 UI 線程。一個進程中 UI 線程只有一個,為了不造成界面卡頓、提高用戶體驗,我們勢必要將一些耗時操作交由子線程來執行。 使用子線程 ...
  • 主要思想是這樣的:將倒計時CountDownTimer放在Service裡面進行,每過一秒就一條發廣播,在主Activity里註冊廣播,收到廣播後更新UI。 一、寫一個類CodeTimerService繼承自Service,重寫onStartCommand(...)方法。 先瞭解一下CountDow ...
  • iOS設備內部都有一個iPod媒體庫,在這個媒體庫中包含了音頻和視頻文件,它的來源主要是蘋果公司的iTunes Store,現在蘋果公司的iTunes Store內容很多,但能夠下載到iPod媒體庫的文件形式就是音頻和視頻文件。 從程式員的角度看,iPad,iPod touch還是iPhone它們訪 ...
  • <!doctype html><html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author" content=""> <meta name=" ...
  • java && javascript && php 轟炸!!!恢復 1.javascript簡介 *是基於對象和時間的驅動語言,應用於客戶端。 基於對象: **提供好了很多對象,可以直接拿過來使用。 事件驅動: **基於事件本來要求做出動態效果。 客戶端: **專門指運行於客戶端。 2.javasc ...
  • java && javascript && php 轟炸!!!恢復 1.javascript簡介 *是基於對象和時間的驅動語言,應用於客戶端。 基於對象: **提供好了很多對象,可以直接拿過來使用。 事件驅動: **基於事件本來要求做出動態效果。 客戶端: **專門指運行於客戶端。 2.javasc ...
  • 變數1 "未知數",本質上相當於一個容器,可以存放任何的數據 2 語法 // 變數定義 var a; // 給變數賦值 a = 456; var 變數名; * 變數名 組成部分: _ $ 字母 數字 第一個字元不能為數字 區分大小寫 比如 a 和 A 是不同的變數名 不能是js的關鍵字和保留字 va ...
  • 針對web應用的攻擊模式 主動攻擊,攻擊者通過直接訪問web資源把攻擊代碼傳入的攻擊模式,需要攻擊者能夠訪問伺服器上的資源,常見有SQL註入攻擊和OS命令註入攻擊; 被動攻擊,利用圈套策略執行攻擊代碼的模式,攻擊者不直接攻擊web應用,常見有XSS和CSRF; SQL註入 把SQL命令插入到表單提交 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...