JAvaチャットルームグループチャットとプライベートチャットを実現!

18578 ワード

JAvaチャットルームグループチャットとプライベートチャットを実現!
一:業務ロジック
  • データベースに接続し、ログインアカウントを登録する機能
  • を実現する
  • サーバ機能
  • は、serverSocketを使用してメッセージを受信送信する.
  • クライアントはsocketを使用してサーバと対話する
  • 二:クラス設計及びコード構造
  • MyMessageクラス:主に送信メッセージの内容をカプセル化するために使用される
  • .
  • Server SocketTestクラス:サーバセグメント実装クラス
  • signupクラス:データベースによるログイン登録
  • SocketFrame:チャットメインインタフェースクラス
  • 3:コードMymessageクラスコード:
    package objtalk;
    
    import java.io.Serializable;
    import java.util.ArrayList;
    
    import javax.swing.text.StyledDocument;
    
    /*
     *         
     *          
     *               
     * */
    
    public class MyMessage implements Serializable {//    &&    (        )
    	public static final long serialVersionUID = 1l;
    	public static final int MES_TYPE_PLAIN = 1;//    
    	public static final int MES_TYPE_UPDATE_CLIENTLIST = 2;//        
    
    	private StyledDocument content ;//     (    )
    	private ArrayList clientList;//        
    	private int mesType = -1;
    	private boolean ifmass=true;//             
    	private String ip="null";//  message  ip
    	private String usename = "null";
    
    	public String getIp() {
    		return ip;
    	}
    
    	public void setIp(String ip) {
    		this.ip = ip;
    	}
    
    	public MyMessage(Boolean ifmass,int mesType) {
    		this.ifmass=ifmass;
    		this.mesType = mesType;
    	}
    
    	public int getMesType() {
    		return mesType;
    	}
    
    	public void setMesType(int mesType) {
    		this.mesType = mesType;
    	}
    
    	public StyledDocument getContent() {
    		return content;
    	}
    
    	public void setContent(StyledDocument content) {
    		this.content = content;
    	}
    
    	public ArrayList getClientList() {
    		return clientList;
    	}
    
    	public void setClientList(ArrayList clientList) {
    		this.clientList = clientList;
    	}
    
    	public boolean getisIfmass() {
    		return ifmass;
    	}
    
    	public void setIfmass(boolean ifmass) {
    		this.ifmass = ifmass;
    	}
    }
    

    Signupクラスコード:
    package objtalk;
    
    /*    talk   
     *     usename password
     * */
    
    
    import java.awt.event.ActionEvent;
    
    import java.awt.event.ActionListener;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import javax.swing.JButton;
    import javax.swing.JEditorPane;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
    
    import com.mysql.jdbc.Connection;
    import com.mysql.jdbc.Statement;
    
    public class signup extends JFrame{
    	private JTextField usename = new JTextField();//     
    	private JTextField password  = new JTextField();
    	private JButton signup = new JButton("  ");//  
    	private JButton signin = new JButton("  ");
    	
    	//     
    	private String user = "";
    	private String pwd = "";
    	private String url = "";//jdbc:myaql://ip    /     database
    	
    	private boolean tag = false;//          
    	public signup() {
    			// TODO Auto-generated constructor stub
    		this.setSize(300,400);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		this.setLayout(null);
    		
    		this.add(usename);
    		this.add(password);
    		this.add(signin);
    		this.add(signup);
    		
    		usename.setSize(100,30);
    		password.setSize(100,30);
    		signin.setSize(100,50);
    		signup.setSize(100,50);
    		
    		usename.setLocation(100,100);
    		password.setLocation(100,200);
    		signin.setLocation(50,300);
    		signup.setLocation(150,300);
    		
    		
    		try {
    			Class.forName("com.mysql.jdbc.Driver");//     
    		} catch (ClassNotFoundException e2) {
    			// TODO Auto-generated catch block
    			e2.printStackTrace();
    		}
    		
    		signin.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				String useName = usename.getText().toString();
    				String passWord = password.getText().toString();
    				if(useName.isEmpty()||passWord.isEmpty()){
    						JOptionPane.showMessageDialog(null, "         ", "error",JOptionPane.ERROR_MESSAGE);
    				}
    				else{
    					try {
    						Connection con = (Connection) DriverManager.getConnection(url, user, pwd);//    
    						Statement stmt = (Statement) con.createStatement();//      
    						String sql = "select * from talk";//     
    						ResultSet rs = (ResultSet) stmt.executeQuery(sql);//        ,           
    						java.sql.ResultSetMetaData rsmd = rs.getMetaData();//         
    						while(rs.next()){//           ,next()      
    							if(rs.getString(1).equals(useName)&&rs.getString(2).equals(passWord)){
    								tag = true;
    							new SocketFrame().setVisible(true);//      
    							exits();//      
    							return;
    							}
    						}
    						if(tag==false){
    							JOptionPane.showMessageDialog(null, "      !", "error",JOptionPane.ERROR_MESSAGE);
    						}
    				} catch (SQLException e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();
    				}
    			}
    		}
    	});
    		
    		signup.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				// TODO Auto-generated method stub
    				String useName = usename.getText().toString();
    				String passWord = password.getText().toString();
    				if(useName.isEmpty()||passWord.isEmpty()){
    					JOptionPane.showMessageDialog(null, "         ", "error",JOptionPane.ERROR_MESSAGE);
    				}
    				else{
    					Connection con;
    					try {
    						con = (Connection) DriverManager.getConnection(url, user, pwd);
    						Statement stmt = (Statement) con.createStatement();
    						String sql = "insert talk value('"+useName+"','"+passWord+"');";
    						stmt.executeUpdate(sql);
    						JOptionPane.showMessageDialog(null,"    ", "done",JOptionPane.ERROR_MESSAGE);
    						//stmt.executeQuery(sql);//        ,           
    					} catch (SQLException e1) {
    						// TODO Auto-generated catch block
    						e1.printStackTrace();
    					}//     ,Connection      new
    				}
    			}
    		});
    	}
    	
    	public void exits() {
    		this.setVisible(false);
    	}
    	
    	
    	public static void main(String[] args) {
    		new signup().setVisible(true);
    	}
    }
    
    

    SocktFrameクラスコード
    package objtalk;
    
    import java.awt.BorderLayout;
    import java.awt.Font;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    import java.net.SocketAddress;
    import java.nio.channels.NonWritableChannelException;
    import java.nio.channels.SelectableChannel;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.imageio.ImageIO;
    import javax.lang.model.element.Element;
    import javax.swing.AbstractListModel;
    import javax.swing.DefaultListModel;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.JTextPane;
    import javax.swing.event.AncestorListener;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.filechooser.FileNameExtensionFilter;
    import javax.swing.text.BadLocationException;
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyledDocument;
    
    
    public class SocketFrame extends JFrame {
    	private JTextPane jtpMes = new JTextPane();//   
    	private StyledDocument contentDoc = jtpMes.getStyledDocument();//    (),    (sas   )
    	private JScrollPane jspMes = new JScrollPane(jtpMes);//         
    	private JButton btnSend = new JButton("Send");
    	private JButton btnConnect = new JButton("Connect");
    	private JButton btnSelectimg = new JButton("img");
    	private JTextPane jtpNewMes = new JTextPane();//   (         )
    	private JScrollPane jspNewMes = new JScrollPane(jtpNewMes);//         
    	private StyledDocument sendDoc = jtpNewMes.getStyledDocument();
    	private JPanel panSend = new JPanel();
    	JPanel btnPan = new JPanel();
    	private Font font = new Font("  ", Font.PLAIN, 20);
    	private JList listClient = new JList<>();
    	private JScrollPane jspClientList = new JScrollPane(listClient);
    	private Socket socket;
    	private ObjectOutputStream out;
    	private ReadThread reader;//      
    
    	public SocketFrame() {
    		this.setSize(800, 600);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		init();
    		getContentPane().add(jspMes);
    		getContentPane().add(panSend, BorderLayout.SOUTH);
    		getContentPane().add(jspClientList, BorderLayout.EAST);
    
    	}
    
    	public void updateListClient(ArrayList list) {//        
    		listClient.setModel(new ClientListModel(list));
    	}
    
    	class ClientListModel extends AbstractListModel {//  list  
    		ArrayList list;
    
    		public ClientListModel(ArrayList list) {
    			super();
    			this.list = list;
    		}
    
    		@Override
    		public Object getElementAt(int arg0) {
    			return list.get(arg0);
    		}
    
    		@Override
    		public int getSize() {
    			return list.size();
    		}
    	}
    
    	private void init() {
    		panSend.setLayout(new BorderLayout());
    		panSend.add(jspNewMes,BorderLayout.CENTER);
    		panSend.add(btnPan,BorderLayout.EAST);
    		btnPan.add(btnSend);
    		btnPan.add(btnConnect);
    		btnPan.add(btnSelectimg);
    		jtpMes.setEditable(false);
    		jtpMes.setFont(font);
    		jtpNewMes.setFont(font);
    		btnSend.addActionListener(new ActionListener() {
    
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				String str = jtpNewMes.getText().trim();//    
    				System.out.println(str);
    				if (str != null && str.length() > 0 && socket != null) {
    					SocketAddress address = socket.getRemoteSocketAddress();//      
    					String ip = address.toString().substring(1,
    					address.toString().indexOf(":") + 1);//  ip
    					SimpleAttributeSet sas = new SimpleAttributeSet();//       
    					StyleConstants.setFontSize(sas,24);//    
    					try {
    						/*senDoc               (    ,50 57     ),           ip(     )*/
    						sendDoc.insertString(0, ip, sas);
    						
    					} catch (BadLocationException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    					MyMessage mes = new MyMessage(true,MyMessage.MES_TYPE_PLAIN);
    					mes.setContent(sendDoc);
    					sendMes(mes);//    
    					try {
    						sendDoc.remove(0, sendDoc.getLength());//        
    					} catch (BadLocationException e) {
    						// TODO Auto-generated catch block
    						e.printStackTrace();
    					}
    				}
    			}
    		});
    		btnConnect.addActionListener(new ActionListener() {//     
    
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				if(socket==null){
    				try {
    					socket = new Socket("10.117.45.114", 12345);//  ip    
    					reader = new ReadThread(socket);
    					reader.start();
    					out = new ObjectOutputStream(socket.getOutputStream());//       
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    				}
    			}
    		});
    		
    		btnSelectimg.addActionListener(new ActionListener() {//          
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				// TODO Auto-generated method stub
    				JFileChooser fc = new JFileChooser("d:");//     
    				FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Image", "jpg","gif");//     
    				fc.setFileFilter(filter);
    				int i = fc.showOpenDialog(SocketFrame.this);
    				if(i == JFileChooser.APPROVE_OPTION){
    					try {
    						Image img = ImageIO.read(fc.getSelectedFile());
    						ImageIcon icon = new ImageIcon(img);
    						SimpleAttributeSet sas = new SimpleAttributeSet();//  
    						StyleConstants.setIcon(sas, icon);//     sas  
    						sendDoc.insertString(sendDoc.getLength(), "icon", sas);// sas      ,    
    					} catch (IOException e1) {
    						// TODO Auto-generated catch block
    						e1.printStackTrace();
    					} catch (BadLocationException e1) {
    						// TODO Auto-generated catch block
    						e1.printStackTrace();
    					}
    				}
    			}
    		});
    		this.addWindowListener(new WindowAdapter() {
    
    			@Override
    			public void windowClosing(WindowEvent arg0) {//             
    				if (out != null) {
    					MyMessage mes = new MyMessage(true,MyMessage.MES_TYPE_PLAIN);
    					//mes.setContent("quit");
    					sendMes(mes);
    					reader.stopRun();
    				}
    			}
    		});
    		
    		listClient.addMouseListener(new MouseAdapter() {
    
    			@Override
    			public void mouseClicked(MouseEvent e) {
    				// TODO Auto-generated method stub
    				super.mouseClicked(e);
    				if(e.getClickCount()==2){//      
    					new PrivateDialog(listClient.getSelectedValue().toString()).setVisible(true);
    				}
    			}
    			
    		});
    	}
    	
    	public void append(StyledDocument sd){
    		int caretPosition = jtpMes.getStyledDocument().getLength();
    		caretPosition+=sd.getLength();
    		try {
    		for(int i=0;i0&&socket!=null){
    						MyMessage mes = new MyMessage(false,MyMessage.MES_TYPE_PLAIN);
    						mes.setIp(ip);
    						mes.setContent(jtpPriMes.getStyledDocument());
    						sendMes(mes);
    				}
    			}
    			});
    			
    			btnselect.addActionListener(new ActionListener() {
    				
    				@Override
    				public void actionPerformed(ActionEvent e) {
    					// TODO Auto-generated method stub
    					JFileChooser fc = new JFileChooser("d:");
    					FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Image", "jpg","gif");//     
    					fc.setFileFilter(filter);
    					int i = fc.showOpenDialog(SocketFrame.this);
    					if(i == JFileChooser.APPROVE_OPTION){
    						try {
    							Image img = ImageIO.read(fc.getSelectedFile());
    							ImageIcon icon = new ImageIcon(img);
    							SimpleAttributeSet sas = new SimpleAttributeSet();//  
    							StyleConstants.setIcon(sas, icon);//     sas  
    							jtpPriMes.getStyledDocument().insertString(jtpPriMes.getStyledDocument().getLength(), "icon", sas);// sas      ,    
    						} catch (IOException e1) {
    							// TODO Auto-generated catch block
    							e1.printStackTrace();
    						} catch (BadLocationException e1) {
    							// TODO Auto-generated catch block
    							e1.printStackTrace();
    						}
    					}
    				}
    			});
    		}
    	}
    
    }
    

    ServerSocketTestコード
    package objtalk;
    
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.SocketAddress;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.Iterator;
    
    import javax.swing.text.SimpleAttributeSet;
    import javax.swing.text.StyleConstants;
    import javax.swing.text.StyledDocument;
    
    import org.omg.CORBA.SystemException;
    
    
    public class ServerSocketTest {
    	ServerSocket server;
    	HashSet clientSet = new HashSet<>();
    
    	public ServerSocketTest() {
    		try {
    			server = new ServerSocket(12345);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public void work() {
    		int no = 0;//        
    		try {
    			while (true) {
    				Socket client = server.accept();
    				clientSet.add(client);
    				SendUpdateClientList();
    				no++;
    				new ClientThread(client, no).start();
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
    	public void SendUpdateClientList() {//         ,          
    			MyMessage mes = new MyMessage(true,MyMessage.MES_TYPE_UPDATE_CLIENTLIST);
    			mes.setClientList(getClientList());
    			massMes(mes);
    	}
    
    	public void massMes(MyMessage mes) {//    
    		Iterator it = clientSet.iterator();
    		while (it.hasNext()) {
    			sendMes(it.next(), mes);
    		}
    	}
    	
    	public void singleMes(MyMessage mes){//    
    		for(Socket s : clientSet){
    			if(s.getRemoteSocketAddress().toString().equals(mes.getIp())){//String     equals
    				sendMes(s, mes);
    				break;
    			}
    		}
    	}
    
    	public void sendMes(Socket s, MyMessage mes) {
    		ObjectOutputStream out;
    		try {
    			out = new ObjectOutputStream(s.getOutputStream());
    			out.writeObject(mes);
    			out.flush();
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    	}
    
    	public ArrayList getClientList() {
    		ArrayList list = null;
    		if (clientSet.size() > 0) {
    			list = new ArrayList();
    			Iterator it = clientSet.iterator();
    			int index = 0;
    			while (it.hasNext()) {
    				list.add(it.next().getRemoteSocketAddress().toString());
    			}
    		}
    		return list;
    	}
    
    	class ClientThread extends Thread {
    		Socket c;
    		int no;
    
    		public ClientThread(Socket c, int no) {
    			super();
    			this.c = c;
    			this.no = no;
    		}
    
    		@Override
    		public void run() {
    			try (ObjectInputStream in = new ObjectInputStream((c.getInputStream()));) {
    				MyMessage newMes = (MyMessage) in.readObject();
    				while (newMes.getContent()!=null) {//         
    					if(newMes.getisIfmass()==true){
    					massMes(newMes);
    					System.out.println(newMes.getContent().getText(0,newMes.getContent().getLength() ));
    					}
    					else{
    						singleMes(newMes);
    					}
    					newMes = (MyMessage) in.readObject();
    				}
    			} catch (Exception e) {
    				e.printStackTrace();
    			} finally {
    				try {
    					c.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    				clientSet.remove(c);//     
    				SendUpdateClientList();
    			}
    		}
    	}
    
    	public static void main(String[] args) {
    		new ServerSocketTest().work();
    	}
    
    }
    
    

    四:使用方法:
  • サーバSocketTestクラスを開く(サーバを開く)
  • signUpクラスを開き、登録し、ログインし、接続し、チャットを開始する(いくつかの実装グループチャットを複数開くことができる)5:プロジェクトgithubアドレスhttps://github.com/Chaos1874/javaTalk