import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
import java.net.UnknownServiceException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Vector;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.GroupLayout.Alignment;
import javax.swing.table.DefaultTableModel;
import net.jxta.discovery.DiscoveryService;
import net.jxta.document.Advertisement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.document.MimeMediaType;
import net.jxta.document.TextDocument;
import net.jxta.endpoint.Message;
import net.jxta.endpoint.MessageElement;
import net.jxta.endpoint.StringMessageElement;
import net.jxta.endpoint.TextDocumentMessageElement;
import net.jxta.exception.PeerGroupException;
import net.jxta.id.IDFactory;
import net.jxta.peergroup.NetPeerGroupFactory;
import net.jxta.peergroup.PeerGroup;
import net.jxta.peergroup.PeerGroupID;
import net.jxta.pipe.InputPipe;
import net.jxta.pipe.OutputPipe;
import net.jxta.pipe.PipeMsgEvent;
import net.jxta.pipe.PipeMsgListener;
import net.jxta.pipe.PipeService;
import net.jxta.protocol.ModuleImplAdvertisement;
import net.jxta.protocol.PeerGroupAdvertisement;
import net.jxta.protocol.PipeAdvertisement;
public class SimpleChat implements PipeMsgListener{
JFrame frontframe;
JLabel label1;
JLabel label2;
JTable table;
JButton button1;
JButton button2;
JButton button3;
JTextArea textarea;
JTextField textfield;
PeerGroup netpg;//默认组
PeerGroup myGroup;//自己创建的组
DiscoveryService discoverySvc=null;
PipeService pipeSvc = null;
PipeAdvertisement pipeAdv = null;
PipeAdvertisement pipePrivateAdv = null;
PipeMsgListener privateMsgListener;
InputPipe inPipe = null;
OutputPipe outPipe = null;
private Vector<Vector<Object>> pipes = new Vector<Vector<Object>>();
private Vector<String> pipeId = new Vector<String>();
private Vector<Vector<Object>> pipesPrivate = new Vector<Vector<Object>>();
private Vector<String> listvector = new Vector<String>();
private Vector<String> pipePrivateId = new Vector<String>();
private HashMap<String,Talking> map=new HashMap<String,Talking>();
String name="MainChatRoom";
String advPrivateFileName="privatepipe.adv";
static String groupURL;
long findGroupTimeOut = 3 * 1000;
long findGroupTryTimes = 3;
long findPipeTimeOut = 3 * 1000;
long findPipeTryTimes = 3;
long createPipeTimeOut = 6 * 1000;
int findPipeCount = 200;
public SimpleChat(){
frontframe=new JFrame("简单p2p系统");
label1=new JLabel("联系人列表:");
label2=new JLabel("聊天室");
button1=new JButton("私聊");
button2=new JButton("刷新");
button3=new JButton("发送");
textfield=new JTextField();
textarea=new JTextArea(20,20);
table=new JTable();
privateMsgListener=new PipeMsgListener(){
public void pipeMsgEvent(PipeMsgEvent pme){
privateMessage(pme);
}
};
startJxta();
showFrame();
}
private void showFrame(){
table=new JTable(new DefaultTableModel(){
public int getRowCount(){return listvector.size();}
public int getColumnCount(){return 1;}
public Object getValueAt(int row,int col){return listvector.get(row);}
public boolean isCellEditable(int row,int col){return false;}
public String getColumnName(int col){return "在线列表";}
});
JPanel p1=new JPanel(new BorderLayout());
JPanel p2=new JPanel(new BorderLayout());
JPanel p3=new JPanel(new BorderLayout());
JPanel p4=new JPanel(new BorderLayout());
JPanel p5=new JPanel(new BorderLayout());
JPanel p6=new JPanel(new BorderLayout());
p1.setBounds(10,10,270,25);
p2.setBounds(10,40,210,370);
p3.setBounds(10,420,210,25);
p4.setBounds(230,40,495,330);
p5.setBounds(230,380,100,25);
p6.setBounds(230,420,495,25);
p1.add(label2,BorderLayout.EAST);
p1.add(label1, BorderLayout.CENTER);
p2.add(table);
p3.add(button1,BorderLayout.EAST);
p3.add(button2,BorderLayout.WEST);
p4.add(textarea);
p5.add(button3);
p6.add(textfield);
frontframe.getContentPane().setLayout(null);
frontframe.getContentPane().add(p1);
frontframe.getContentPane().add(p2);
frontframe.getContentPane().add(p3);
frontframe.getContentPane().add(p4);
frontframe.getContentPane().add(p5);
frontframe.getContentPane().add(p6);
frontframe.setBounds(0,0,750,510);
frontframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frontframe.setVisible(true);
textarea.setEditable(false);
textarea.setLineWrap(true);
textarea.setEnabled(false);
}
private void startJxta(){
try{
netpg=new NetPeerGroupFactory().getInterface();
groupURL="jxta:uuid-04B8173E42A445F0AF6BBB486CEA53D102";
}catch(Exception e){
System.out.println(e.getMessage());
System.exit(0);
}
try{
joinMyGroup();
}catch(Exception e){
System.out.println("Can't join or create myGroup.");
e.printStackTrace();
System.exit(0);
}
}
/** 加入组,没有找到则建立同时发布通道公告 */
private void joinMyGroup()throws Exception{
DiscoveryService dstmp=netpg.getDiscoveryService();//获得默认组的发现服务
long tryGroupCount=1;//尝试加入组的次数
while(!findLocalGroup(dstmp) && tryGroupCount++<=findGroupTryTimes){
dstmp.getRemoteAdvertisements(null, DiscoveryService.GROUP, "Name", "MyChatGroup", 1);
Thread.sleep(findGroupTimeOut);//线程暂停三秒钟,等待查找结果。
}
if(myGroup==null){//myGroup没有找到,则创建它
ModuleImplAdvertisement mia=netpg.getAllPurposePeerGroupImplAdvertisement();
myGroup=netpg.newGroup((PeerGroupID)IDFactory.fromURL(new URL("urn","",groupURL)),mia,"MyChatGroup", "A test chat jxta group.");
}
discoverySvc=myGroup.getDiscoveryService();
pipeSvc=myGroup.getPipeService();
long tryPipeCount=1;
while(!findLocalPipe() && tryPipeCount++<findPipeTryTimes){
discoverySvc.getRemoteAdvertisements(null, DiscoveryService.ADV, "Name", "MyChatGroup:PipeAdv:"+name,1);
Thread.sleep(findPipeTimeOut);
}
if(pipeAdv==null){
System.out.println("Create a new pipeadvertisement.");
pipeAdv=(PipeAdvertisement)AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType());
pipeAdv.setName("MyChatGroup:PipeAdv:"+name);
pipeAdv.setPipeID(IDFactory.newPipeID(myGroup.getPeerGroupID()));
pipeAdv.setType(PipeService.PropagateType);
discoverySvc.publish(pipeAdv,PeerGroup.DEFAULT_LIFETIME,PeerGroup.DEFAULT_EXPIRATION);
discoverySvc.remotePublish(pipeAdv,DiscoveryService.ADV);
}
//私自的通道
try{
FileInputStream fis=new FileInputStream(advPrivateFileName);
pipePrivateAdv=(PipeAdvertisement)AdvertisementFactory.newAdvertisement(new MimeMediaType("text/xml"),fis);
}catch(IOException e){
System.out.println("Create a new private pipeadvertisement.");
FileOutputStream fos = new FileOutputStream(advPrivateFileName);
pipePrivateAdv = (PipeAdvertisement)AdvertisementFactory.newAdvertisement(PipeAdvertisement.getAdvertisementType());
pipePrivateAdv.setName("MyChatGroup:PipePrivateAdv:"+name);//设置广告名称
pipePrivateAdv.setPipeID(IDFactory.newPipeID(myGroup.getPeerGroupID()));//广告ID
pipePrivateAdv.setType(PipeService.UnicastType);//广告类型
pipePrivateAdv.setDescription(myGroup.getPeerName());//设置广告描述
pipePrivateAdv.getDocument(new MimeMediaType("text/xml")).sendToStream(fos);//将广告的设置为XML的形式写入到文件中
fos.flush();
fos.close();
}
discoverySvc.publish(pipePrivateAdv,PeerGro
- 1
- 2
- 3
前往页