package my_QQ.com;
import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Font;
import java.awt.List;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Date;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
public class My_QQ extends JFrame{
/**
* @author ggg
* @version 1.0
*/
private static final long serialVersionUID = 1L;
JPanel contentPane;
JTextField textInput = new JTextField();
JButton btnSend = new JButton();
JButton btnConnect = new JButton();
List lstMessage = new List();
List lstFriend = new List();
JLabel name = new JLabel();
JLabel Top = new JLabel();
JLabel version = new JLabel();
UserInfo [] userInfo = new UserInfo[90];//新建UserInfo数组类保存用户信息
ServerSocket listernSocket;
public final static int DEFAULT_PORT = 8321;
public final static int CATCH_PORT = 7321;
public final static int TCP_PORT = 6321;
DatagramSocket socket = null;
InetAddress group;
InetAddress groupC;
DatagramPacket packet;
DatagramSocket s = null;
MulticastSocket socketR;
MulticastSocket socketC;
Socket Csocket;
QQ_listerner QQ_listern;
TCP_connect tfp_connect;
CATCHER catcher;
Check_in login;
String nickname = new String("11111111111");
public byte [] nameTags;
public My_QQ()//构造函数
{
while (nickname.length()>9||nickname.length()==0)
{
nickname = JOptionPane.showInputDialog(name, "请输入昵称", "登录", 3);
if(nickname.length()>9)
{
nickname = JOptionPane.showInputDialog(name, "长度应该小于10", "非法昵称", JOptionPane.ERROR_MESSAGE);
}
if(nickname.length()==0)
{
nickname = JOptionPane.showInputDialog(name, "长度应该大于0", "非法昵称", JOptionPane.ERROR_MESSAGE);
}
}
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
My_QQ_JoinGroup();//首先初始化端口,并向已经在线的QQ程序发送本机IP及请求回应,并对相应的组播端口进行监听;
try
{
jbInit();//初始化frame端口,并对相应的控件添加事件响应
}catch(Exception e)
{
e.printStackTrace();
}
this.setLocation(300, 200);
My_QQ_Listerner();//对组内公共聊天的组播组端口进行监听
TCP_Listerner();//对TCP端口进行监听
}
protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSING)
{
try
{
//退出时发送退出登录的信息的组播数据包,其包的内容的起始位为判断位,”D“表示该包为告知下线的信息包
byte [] notice = new String("D"+nickname+InetAddress.getLocalHost().getHostAddress()+nickname.length()).getBytes();
packet = new DatagramPacket(notice,notice.length,groupC,CATCH_PORT);
socket.send(packet);
}catch(IOException ee)
{
ee.printStackTrace();
}
socket.close();
System.exit(0);
}
}
private void jbInit() {//初始化应用程序窗口
// TODO Auto-generated method stub
version.setText("1.0");
version.setBounds(420, 5, 50, 30);
textInput.setText("");
textInput.setBounds(80, 140, 140, 30);
textInput.addKeyListener(new KeyAdapter(){//添加按键事件响应,输入文本并按下回车后将发送消息
public void keyPressed(KeyEvent keyEvent){
//if(keyEvent.getKeyChar()=='\n')
if(keyEvent.isControlDown()&& keyEvent.getKeyCode() == 10)
{
try
{
Date date = new Date();
String origin_data = nickname+":("+date+")"+textInput.getText();
String en_data = encrypttoStr(origin_data,"lifaxin");
byte [] dataS = (en_data).getBytes();
packet = new DatagramPacket(dataS,dataS.length,group,DEFAULT_PORT);//打包
socket.send(packet);//发送
textInput.setText("");//发送后将输入框内容清除
}catch(Exception e1)
{
System.out.println("error:"+e1);
}
}
}
});
contentPane = (JPanel)this.getContentPane();
contentPane.setLayout(null);
name = new JLabel(nickname+":");
name.setBounds(new Rectangle(20,140,50,30));
this.setSize(480, 210);
this.setTitle("My_QQ");
Icon sendIcon = new ImageIcon("image\\BTSend.gif");
Icon BG = new ImageIcon("image\\BackGround1.gif");
Icon TCPIcon = new ImageIcon("image\\BTConnect.gif");
Top.setIcon(BG);
Top.setBounds(0, 0, 480, 183);
btnSend.setIcon(sendIcon);
btnSend.setBounds(230, 141, 89, 32);
btnSend.setBackground(Color.WHITE);
btnSend.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
btnSend_actionPerformed(e);
}
});
btnConnect.setIcon(TCPIcon);
btnConnect.setBounds(new Rectangle(355,140,89,32));
btnConnect.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
btnConnect_actionPerformed(e);
}
});
lstMessage.setBounds(new Rectangle(20,35,300,100));
lstFriend.setBounds(new Rectangle(340,35,120,100));
lstFriend.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
lstFriend_actionPerformed(e);
}
});
contentPane.add(textInput, null);
contentPane.add(btnSend, null);
contentPane.add(btnConnect, null);
contentPane.add(lstFriend, null);
contentPane.add(lstMessage, null);
contentPane.add(name, null);
contentPane.add(version, null);
contentPane.setBackground(Color.WHITE);
contentPane.add(Top, null);
this.setResizable(false);
}
public static void main(String [] arg)//主函数,程序入口
{
Font f = new Font("宋体",Font.PLAIN,12);
UIManager.put("Label.font",f);
UIManager.put("Label.foreground",Color.black);
UIManager.put("Button.font",f);
UIManager.put("Menu.font",f);
UIManager.put("MenuItem.font",f);
UIManager.put("List.font",f);
UIManager.put("CheckBox.font",f);
UIManager.put("RadioButton.font",f);
UIManager.put("ComboBox.font",f);
UIManager.put("TextArea.font",f);
UIManager.put("EditorPane.font",f);
UIManager.put("ScrollPane.font",f);
UIManager.put("ToolTip.font",f);
UIManager.put("TextField.font",f);
UIManager.put("TableHeader.font",f);
UIManager.put("Table.font",f);
UIManager.put("JPnel.font", f);
My_QQ qq = new My_QQ();
qq.setVisible(true);
}
public void processMsg(String str)//该方法为将字符串str显示到对话列表框中
{
String utfCadena = null;
try {
utfCadena = new String (str.getBytes("GBK"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO A