?? chipchat.java
字號(hào):
import java.io.*;
import java.net.*;
import java.util.Vector;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
public class ChipChat extends JFrame
{
JPanel contentPane;
JTextField txtInput = new JTextField();
JButton btnSend = new JButton();
JButton TCPconnect = new JButton();
List lstMsg = new List();
List lstFriend = new List();
JLabel name = new JLabel();
JLabel Top = new JLabel();
JLabel version = new JLabel();
UserInfo [] userinfo = new UserInfo[90];//新建UserInfo數(shù)組類保存用戶信息
ServerSocket listen_socket;
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;
CCListener cclisten;
String nickname = new String("11111111111");
public ChipChat()//構(gòu)造函數(shù)
{
while(nickname.length()>9||nickname.length()==0)
{
nickname = JOptionPane.showInputDialog(null,"請(qǐng)輸入昵稱","登陸",3);
if(nickname.length()>9)
JOptionPane.showMessageDialog(null,"昵稱長(zhǎng)度需要小于10","非法昵稱",JOptionPane.ERROR_MESSAGE);
if(nickname.length()==0)
JOptionPane.showMessageDialog(null,"昵稱長(zhǎng)度需要等于0","非法昵稱",JOptionPane.ERROR_MESSAGE);
}
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
ChipChat_JoinGroup();//首先初始化端口,并向已經(jīng)在線的CC程序發(fā)送本機(jī)IP以及請(qǐng)求回應(yīng).并對(duì)相應(yīng)的組播組端口進(jìn)行監(jiān)聽(tīng)
try
{
jbInit();//初始化FRAME窗口,并對(duì)相應(yīng)的控件添加事件響應(yīng)
}catch(Exception e)
{
e.printStackTrace();
}
this.setLocation(300,200);
ChipChat_Listener();//對(duì)組內(nèi)公共聊天的組播組端口進(jìn)行監(jiān)聽(tīng)
TCP_Listener();//對(duì)點(diǎn)對(duì)點(diǎn)TCP協(xié)議端口進(jìn)行監(jiān)聽(tīng)
}
protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
if(e.getID()==WindowEvent.WINDOW_CLOSING)
{
try
{
//退出時(shí)發(fā)送退出登陸的信息的組播數(shù)據(jù)包,其包的內(nèi)容的起始位為判斷位,"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);
}
}
public void jbInit()//初始化應(yīng)用程序窗口
{
version.setText("V1.2");
version.setBounds(new Rectangle(420,5,50,30));
txtInput.setText("");
txtInput.setBounds(new Rectangle(80,140,140,30));
txtInput.addKeyListener(new KeyAdapter (){//添加事件按鍵事件監(jiān)聽(tīng),當(dāng)文本框中按下"回車"時(shí)則發(fā)送文本框消息
public void keyPressed(KeyEvent ek){
if(ek.getKeyChar() == '\n')
try {
byte[] dataS = (nickname+":"+txtInput.getText()).getBytes();
packet = new DatagramPacket(dataS,dataS.length, group, DEFAULT_PORT);
socket.send(packet);
txtInput.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("ChipChat");
Icon sentIcon = 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(sentIcon);
btnSend.setBounds(230,141,89,32);
btnSend.setBackground(Color.WHITE);
btnSend.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
btnSend_actionPerformed(e);
}
});
TCPconnect.setIcon(TCPIcon);
TCPconnect.setBounds(new Rectangle(355,140,89,32));
TCPconnect.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
TCPconnect_actionPerformed(e);
}
});
lstMsg.setBounds(new Rectangle(20,35,300,100));
lstFriend.setBounds(new Rectangle(340,35,120,100));
lstFriend.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
lstFriend_actionPerformed(e);
}
});
contentPane.add(txtInput,null);
contentPane.add(btnSend,null);
contentPane.add(lstMsg,null);
contentPane.add(name,null);
contentPane.add(version,null);
contentPane.add(lstFriend,null);
contentPane.add(TCPconnect,null);
contentPane.setBackground(Color.WHITE);
contentPane.add(Top,null);
this.setResizable(false);
}
public static void main(String [] arg)//主函數(shù),程序入口
{
ChipChat cc = new ChipChat();
cc.setVisible(true);
}
public void processMsg(String str)//該方法為將字符串str顯示到對(duì)話列表框中
{
this.lstMsg.add(str);
this.lstMsg.select(lstMsg.getItemCount()-1);
}
public void processFriend(String str)//該方法為將字符串str顯示到登陸信息列表框中
{
this.lstFriend.add(str);
}
public void ChipChat_JoinGroup()//初始化UDP協(xié)議端口信息
{
try {
group = InetAddress.getByName("238.0.0.0"); //初始化廣播聊天信息組播組
groupC = InetAddress.getByName("239.0.0.0");//初始化登陸信息組播組
socket = new DatagramSocket();
byte [] notify = new byte[100];
byte [] nametag = new byte[10];
nametag = nickname.getBytes();
//發(fā)送一個(gè)登陸信息給已經(jīng)登陸的用戶,通知他們本程序上線.包的數(shù)據(jù)結(jié)構(gòu)為:判斷位+用戶名+IP地址+用戶名長(zhǎng)度
notify =new String("C"+nickname+InetAddress.getLocalHost().getHostAddress()+nickname.length()).getBytes();
//int dd = InetAddress.getLocalHost().getHostAddress().length();
packet = new DatagramPacket(notify,notify.length,groupC,CATCH_PORT);
socket.send(packet);
socketC = new MulticastSocket(CATCH_PORT);
socketC.joinGroup(groupC);
CATCHER catcher = new CATCHER(socketC,this,nickname,userinfo);
Check_in LOGIN = new Check_in(this,userinfo);
}
catch (Exception e1) {
System.out.println("Error: " + e1);
}
}
void lstFriend_actionPerformed(ActionEvent e)//雙擊登陸列表框內(nèi)容時(shí)觸發(fā)的事件為連通列表框中的IP,建立TCP通信
{
Socket socket;
int s = this.lstFriend.getSelectedIndex();
String address = userinfo[s].getIP();//用address記錄對(duì)方IP地址
try
{
socket = new Socket(address,TCP_PORT);//建立連接
TCP_Frame TT = new TCP_Frame(socket,userinfo[s].getName());//打開(kāi)TCP會(huì)話程序
TT.setVisible(true);
}catch(IOException elf)
{
elf.printStackTrace();
}
}
void TCPconnect_actionPerformed(ActionEvent e)//連接按鈕事件監(jiān)聽(tīng)
{
Socket socketT;
String NN = null;
int s = this.lstFriend.getSelectedIndex();
try
{
NN = userinfo[s].getName();
}catch(Exception nu)
{
JOptionPane.showMessageDialog(null,"請(qǐng)從按鈕上方選擇想要連接的地址","空目標(biāo)地址",JOptionPane.ERROR_MESSAGE);
}
try
{
//對(duì)所選擇的登陸信息列表框中的內(nèi)容建立TCP連接
String address = userinfo[s].getIP();//this.lstFriend.getSelectedItem().substring(2);
socketT = new Socket(address,TCP_PORT);
TCP_Frame TT = new TCP_Frame(socketT,userinfo[s].getName());
TT.setVisible(true);
}catch(IOException es)
{
JOptionPane.showMessageDialog(null,"該用戶已不在線","用戶下線",JOptionPane.ERROR_MESSAGE);
try
{
byte [] notice = new String("D"+NN+InetAddress.getLocalHost().getHostAddress()+NN.length()).getBytes();
packet = new DatagramPacket(notice,notice.length,groupC,CATCH_PORT);
socket.send(packet);
}catch(IOException ee)
{
ee.printStackTrace();
}
es.printStackTrace();
}
}
void btnSend_actionPerformed(ActionEvent e)//群聊發(fā)送按鈕觸發(fā)
{
try {
//發(fā)送一個(gè)數(shù)據(jù)包到組波組,數(shù)據(jù)包數(shù)據(jù)結(jié)構(gòu)為:用戶名+文本框中的內(nèi)容
byte[] dataS = (nickname+":"+txtInput.getText()).getBytes();
packet = new DatagramPacket(dataS,dataS.length, group, DEFAULT_PORT);
socket.send(packet);
txtInput.setText("");//重設(shè)文本框的內(nèi)容為空,方便下一次輸入
}
catch(Exception e1)
{
System.out.println("Error: " + e1);
}
}
public void ChipChat_Listener()//群聊端口監(jiān)聽(tīng)
{
try
{
socketr = new MulticastSocket(DEFAULT_PORT);
socketr.joinGroup(group);
}catch(IOException e)
{
e.printStackTrace();
}
cclisten = new CCListener(socketr,this);
}
public void TCP_Listener()//對(duì)點(diǎn)對(duì)點(diǎn)TCP端口進(jìn)行監(jiān)聽(tīng),一旦接到連接請(qǐng)求則馬上打開(kāi)一個(gè)TCP連接會(huì)話程序
{
TCPConnect tcp = new TCPConnect(TCP_PORT,this,nickname);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -