JAvaチャットルームグループチャットとプライベートチャットを実現!
18578 ワード
JAvaチャットルームグループチャットとプライベートチャットを実現!
一:業務ロジックデータベースに接続し、ログインアカウントを登録する機能 を実現するサーバ機能 は、serverSocketを使用してメッセージを受信送信する.クライアントはsocketを使用してサーバと対話する 二:クラス設計及びコード構造 MyMessageクラス:主に送信メッセージの内容をカプセル化するために使用される . Server SocketTestクラス:サーバセグメント実装クラス signupクラス:データベースによるログイン登録 SocketFrame:チャットメインインタフェースクラス 3:コードMymessageクラスコード:
Signupクラスコード:
SocktFrameクラスコード
ServerSocketTestコード
四:使用方法:サーバSocketTestクラスを開く(サーバを開く) signUpクラスを開き、登録し、ログインし、接続し、チャットを開始する(いくつかの実装グループチャットを複数開くことができる)5:プロジェクトgithubアドレスhttps://github.com/Chaos1874/javaTalk
一:業務ロジック
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();
}
}
四:使用方法: