1. ホーム
  2. java

javaの模造品QQ WeChatのチャットルーム

2022-02-10 04:43:13

さっそくですが、写真から見てみましょう

インスタントメッセージングシステム:グループチャット、プライベートチャット、リアルタイムでチャットメッセージを送信および表示、友人のリストを完了することができ、さらに顔文字、添付ファイル、チャットメッセージ配信などで送信することができます。システムソケット通信技術、マルチスレッド技術、データベース技術の主な技術。

本システムでは、以下の機能を実装しています。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());