javaの模造品QQ WeChatのチャットルーム
さっそくですが、写真から見てみましょう
インスタントメッセージングシステム:グループチャット、プライベートチャット、リアルタイムでチャットメッセージを送信および表示、友人のリストを完了することができ、さらに顔文字、添付ファイル、チャットメッセージ配信などで送信することができます。システムソケット通信技術、マルチスレッド技術、データベース技術の主な技術。
本システムでは、以下の機能を実装しています。1.ユーザー名ログイン 2.ユーザー間のグループチャットとグループチャット履歴の表示 3.ユーザー間のプライベートチャットとプライベートチャット履歴 4.友人リストを動的に更新して表示 5.オンライン人数を表示 6.サーバーはユーザーのオンライン状態を表示可能 7.処理を終了できること。
このプログラムは、LANチャットを実装することができます、ちょうどLANのIPにipを変更します。システムuiには、友達を追加する(友達であることを確認する)、スペースにコメントを投稿する、そして、いいね!やコメントができるなど、実装されていない機能がたくさんあります。
興味のある方はエクステンションがあります。システムビデオエフェクトを見るためのリンク http://m.v.qq.com/play.html?cid=&vid=f3241h0cgfo&vuid24=7Dp8aai1Y0YPJR%2FiSwf3dQ%3D&url_from=share&second_share =0&share_from=copy&pgid=page_detail&mod_id=mod_toolbar_new
ダウンロードリンク https://download.csdn.net/download/qq_44716544/12352588
giteeダウンロードリンク https://gitee.com/c-xiaobai-c/java-chat-system.git
登録、以下は、主にアカウントの一意性とニックネームの一意性を確認するために使用されるデータベースのキーコードです、主にダブル判定を使用して、まずアカウントの一意性を決定し、ニックネームの一意性を決定するには、条件が不十分である場合、その登録が失敗しました。次のコードは、主にデータベースのクエリ機能は、最初のアカウントがあるかどうかをデータベースに照会することです、次にニックネームがあるかどうかデータベースをチェックし、最後に登録情報次のコードは、クエリのコードを示していますが、情報を格納するためのコードは似ているとここでは示されていないです。
Connectionlain c = new Connectionlain();
Connection conn = c.getConnect();
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement("select *from userlist where name=? ");
ps.setString(1, textloginName.getText());
rs = ps.executeQuery();
if (rs.next()) {
JOptionPane.showMessageDialog(this, "The nickname already exists, please refill the nickname");
} else {
save();
}
} catch (SQLException e1) {
// TODO Auto-generated catch block
// e1.printStackTrace();
}
finally{
try {
rs.close();
ps.close();
// ct.close();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
連絡先ページでは、主にデータベース読み取り機能を使ってログインユーザのアカウントを取得し、jlistリストを使ってログインユーザのアカウントを友達列に表示します。
The following shows the key code.
list = new JList(listModel);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);// set single selection mode (only one element can be selected at a time)
list.setCellRenderer(new MyCellRenderer(icons));// use own CellRenderer, use image function
listScroller = new JScrollPane(list);
listScroller.setBounds(20,300,465,350);//add list with scrollbar
//list.setBounds(20,300,450,350);
listScroller.setBackground(new Color(30, 144, 255));
listScroller.setOpaque(false);
listScroller.setBorder(null);
//this.add(listScroller,BorderLayout.CENTER);//add list with scrollbar
//this.add(list);
this.add(listScroller);
listModel = new DefaultListModel();
try {
Class.forName("com.mysql.jdbc.Driver");
//(2) Get the database connection
Connection ct=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/check?useUn icode=true&characterEncoding=utf_8& quot;,"root", "123");
//(3) Create the SQL statement object
Statement ps=ct.createStatement();
//(4) Execute the query and return the result set
ResultSet rs=ps.executeQuery("SELECT * FROM userlist2");
String []data1=new String [1];
while(rs.next()){
//if(rs.next()){
//rowData can store multiple rows
String st1=rs.getString(1);
data1[0] = rs.getString(1);
for(int i=0;i<data1.length;i++){
listModel.add(i, data1[i]);//add logged in users to the list box
}
System.out.println(data1[0]);
}} catch (Exception e1)
if(ps!=null){
ps.close();
}
if(ct!=null){
ct.close();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
グループチャットとプライベートチャットのコードは似ているため、プライベートチャットのキーコードのみを表示します;次のキーコードを表示します。
String serverIp="127.0.0.1";
int serverPort=8000;
//connect to the server and get the socket io stream
socket=new Socket(serverIp,serverPort);
dis=new DataInputStream(socket.getInputStream());
dos=new DataOutputStream(socket.getOutputStream());
//get username, build, send login message
String id2="buddy"+id1;
String msgLogin="LOGIN#"+id2;
dos.writeUTF(msgLogin);
dos.flush();
//read the information returned by the server to determine whether the login is successful
String response=dis.readUTF();
//login failed
if(response.equals("FAIL"){
addMsg("login failed");
System.out.println("Login failed");
socket.close();
return;
}
//login success
if(response.equals("SUCCESS")){
addMsg("Logged in successfully");
isLogged=true;
btnSend.setEnabled(true);
}
}
public void run(){
//connect to the server and login
try{
login();
}catch(IOException e){
//addMsg("An exception occurred while connecting to the server");
e.printStackTrace();
System.out.println("An exception occurred while connecting to the server");
return;
}
while(isLogged){
try{
String msg=dis.readUTF();
String[] parts=msg.split("#");
//process the messages sent by the server
if(parts[0].equals("USERLIST"){
for(int i=1;i<parts.length;i++){
}
}
if(parts[0].equals("LOGIN"){
addMsg(parts[1]+"ONLINE");
}
if(parts[0].equals("LOGOUT")){
}
if(parts[0].equals("TALKTO_ALL")){
addMsg(parts[1]+"Talk to everyone:"+parts[2]);
}
if(parts[0].equals("TALKTO"){
addMsg(parts[1]+"Talk to me:"+parts[2]);
}
}catch(IOException e){
isLogged=false;
e.printStackTrace();
}
}
}
}
//Start the thread
private void start(){
clientThread=new ClientThread();
clientThread.start();
}
private void addMsg(String msg)
textAreaRecord.append(msg+"\n");
//auto scroll to the last line of the text area
textAreaRecord.setCaretPosition(textAreaRecord.getText().length());
new save();
}
private void addMsg2(String msg){
textAreaRecord.append("\t"+"\t"+"\t"+"\t"+"\t"+msg+":"+"user"+id1+"\n& quot;);
//auto scroll to the last line of the text area
textAreaRecord.setCaretPosition(textAreaRecord.getText().length());
new save().
}
class save{
public save(){
try {
// Register the mysql driver
Class.forName("com.mysql.jdbc.Driver");//driver
System.out.println("Mysql database driver found");
} catch (Exception e1) {
System.out.println("Mysql driver not found on class path," + "Please check if mysql jar package is loaded on class path! ");
}
// (3) Get the database connection
Connection conn = null;// press CTRL+SHIFT+O at the same time
try {
conn = DriverManager.getConnection(
"jdbc:mysql://127.0.0.1:3306/check?charcterEncoding=utf-8", "root", "123");//(url,username,password)
System.out.println("Database connection established successfully");
} catch (Exception e1) {
e1.printStackTrace();
System.out.println("Failed to create database connection! ");
}
// (4) create a SQL statement to execute (need to execute SQL statements in Java)
Statement stmt = null;
try {
// Create the SQL statement object from the conn object
stmt = conn.createStatement();
} catch (Exception e1) {
e1.printStackTrace();
}
String sql
サーバー 主にネットワーク通信やマルチスレッドに使用される
try{
//get serverip and serverPoet
String serverIp=textServerIP.getText();
int serverPort=Integer.parseInt(textPort.getText());
// Create a socket address
SocketAddress socketAddress=new InetSocketAddress(serverIp,serverPort);
//create ServerSocket, bind socket address
server=new ServerSocket();
server.bind(socketAddress);
//modify the identifier variable to determine whether the server is running or not
isRunning=true;
btnStart.setEnabled(false);
btnStop.setEnabled(true);
addMsg("Server started successfully");
System.out.println("Server started successfully");
}catch(IOException e){
System.out.println("Server startup failed");
e.printStackTrace();
isRunning=false;
}
}
public void run(){
startServer();
//When the server is running, listen to the client's connection requests in a loop
while(isRunning){
try{
Socket socket=server.accept();
//create a thread to interact with the client
Thread thread=new Thread(new ClientHandler(socket));
thread.start();
}catch(IOException e){
System.out.println("Not connected yet");
}
}
}
}
class ClientHandler implements Runnable{
private Socket socket;
private DataInputStream dis;
private DataOutputStream dos;
private boolean isConnected;
private String username;
public ClientHandler(Socket socket){
this.socket=socket;
try{
this.dis=new DataInputStream(socket.getInputStream());
this.dos=new DataOutputStream(socket.getOutputStream());
isConnected=true;
}catch(IOException e){
isConnected=false;
e.printStackTrace();
}
}
public void run(){
while(isRunning&&isConnected){
try{
//read the message sent by the client
String msg=dis.readUTF();
String[] parts=msg.split("#");
if(parts[0].equals("LOGIN")){
String loginUsername=parts[1];
Date date3=new Date();
SimpleDateFormat f2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String d3=f2.format(date3);
String q="User:"+parts[1]+""+"logged in"+"\t"+d3;
addMsg(q);
//if the user is logged in, return a failure message, otherwise return a success message
if(clientHandlerMap.containsKey(loginUsername)){
dos.writeUTF("FAIL");
}else{
dos.writeUTF("SUCCESS");
//add information about this client processing thread to the clientHandlerMap
clientHandlerMap.put(loginUsername, this);
//send the information of the existing user to the new user
StringBuffer msgUserList=new StringBuffer();
msgUserList.append("USERLIST");
for(String username : clientHandlerMap.keySet()){
msgUserList.append(username +"#");
}
dos.writeUTF(msgUserList.toString());
// send the newly logged in user information to other users
String msgLogin="LOGIN#"+loginUsername;
broadcastMsg(loginUsername,msgLogin);
//store the login username
this.username=loginUsername;
}
}
if(parts[0].equals("LOGOUT")){
clientHandlerMap.remove(username);
String msgLogout="LOGOUT#"+username;
//broadcastMsg(username,msgLogout);
isConnected=false;
socket.close();
}
if(pars[0].equals("TALKTO_ALL"){
String msgTalkToAll="TALKTO_ALL#"+username+"#"+parts[1]; date3=new Date();
SimpleDateFormat f2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String d3=f2.format(date3);
String p="User "+username+"Say to all"+parts[1]+"\t"+d3;
addMsg2(p);
broadcastMsg(username,msgTalkToAll);}
if(pars[0].equals("TALKTO"){
ClientHandler clientHandler=clientHandlerMap.get(parts[1]);
if(null!=clientHandler){
String msgTalkTo="TALKTO#"+username+"#"+parts[2];
Date date3=new Date();
SimpleDateFormat f2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String d3=f2.format(date3);
String p2="user "+clientHandler+" to "+username+" say: "+parts[2]+"\t"+d3;
addMsg2(p2);
clientHandler.dos.writeUTF(msgTalkTo);
clientHandler.dos.flush();
}
}
}catch(IOException e){
isConnected=false;
e.printStackTrace();
}
}
}
/**
* Broadcast a message from a user to other users
*/
private void broadcastMsg(String fromUsername,String msg) throws IOException{
for(String toUserName : clientHandlerMap.keySet()){
if(fromUsername.equals(toUserName)==false){
DataOutputStream dos=clientHandlerMap.get(toUserName).dos;
dos.writeUTF(msg);
dos.flush();
}
}
}
}
/**
* Add a message to the text box
*/
private void addMsg(String msg){
// Add a message to the text area with a newline
textAreaRecord.append(msg+"\n");
textAreaRecord.setCaretPosition(textAreaRecord.getText().length());
関連
-
Javaクラスローダーにソースコードから潜り込む
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
JQuery DataTable 详解
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について
-
「リソースリーク:'scanner'が閉じない」警告、Scannerステートメントでの解決法
-
Java-Myeclipse エラー解決 構文エラー、TryStatem を完了するために "Finally" を挿入する。
-
java.security.InvalidAlgorithmParameterException: TrustAnchors パラメータは空であってはなりません 解決策
-
Java面接のポイント3--例外処理(Exception Handling)
-
コンピュータ教育で足りない授業、手遅れになる前に補うようにアドバイス、仕事の後の半分の努力で2倍の結果が得られる!?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
SpringBootApplication を型解決できない。
-
をインスタンス化することができません。
-
自動配線された依存性のインジェクションに失敗しました。
-
HttpClientがGZIP形式でない場合の対処法
-
引数型[java.lang.String]の名前がありません..........................。.バグ処理
-
Tomcat 8は、「少なくとも1つのJARがTLDをスキャンされたが、TLDが含まれていない」問題を解決します。
-
アイデア2021.2が起動しないことを一度記録した