您的位置:首页 > 其它

基于UDP协议的P2P模式即时通信软件1.0

2017-08-07 18:06 441 查看
Main
package mychat;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.ArrayList;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.text.html.HTMLDocument.Iterator;
public class Main extends JFrame implements ActionListener{
Communication cmu=null;
static User usr=null;
User []friends=null;
int maxfriendnum;
int currentnum=0;
JLabel name=null;
JLabel gender=null;
JLabel age=null;
JLabel host=null;
JPanel pane=null;
JTextField tname=null;
JTextField tgender=null;
JTextField tage=null;
JTextField thost=null;
JScrollPane spane=null;
JButton chat=null;
JButton refresh=null;
JButton quit=null;
JList sublist=null;
ArrayList<String> fnditem=null;
DefaultListModel model=null;
void inforinit()
{
cmu.setUser(usr);
tname.setText(usr.name);
tgender.setText(usr.gender);
tage.setText(String.valueOf(usr.age));
thost.setText(usr.ip);
}
public void setPane()
{
model.clear();
java.util.Iterator<String> i=fnditem.iterator();
while(i.hasNext())
{
model.addElement(i.next());
}
}
public Main()
{
model=new DefaultListModel();
sublist=new JList(model);
fnditem=new ArrayList<String>();
maxfriendnum=255;
friends=new User[maxfriendnum];
JMenuItem mport=new JMenuItem("Change Port");
JMenuItem mname=new JMenuItem("Modify Name");
JMenuItem mage=new JMenuItem("Modify Age");
JMenuItem mgender=new JMenuItem("Modify Gender");
JMenuItem mscan=new JMenuItem("Port Scan");
JMenu menu=new JMenu("Option");
menu.add(mport);
menu.add(mname);
menu.add(mage);
menu.add(mgender);
menu.add(mscan);
JMenuBar menubar=new JMenuBar();
menubar.add(menu);
this.setJMenuBar(menubar);

usr=new User();
cmu=new Communication(usr,this);
cmu.init();
cmu.start();
pane=new JPanel();
pane.setLayout(null);
name=new JLabel("Name :");
gender=new JLabel("Gender :");
age=new JLabel("Age :");
host=new JLabel("Ip :");
tname=new JTextField();
tgender=new JTextField();
tage=new JTextField();
thost=new JTextField();
name.setBounds(10, 10, 40, 20);
tname.setBounds(60, 10, 210,20);
age.setBounds(10, 40, 30, 20);
tage.setBounds(60, 40, 40, 20);
gender.setBounds(150,40,50,20);
tgender.setBounds(220, 40, 50, 20);
host.setBounds(10,70,40,20);
thost.setBounds(60, 70, 210, 20);
pane.add(name);
pane.add(tname);
pane.add(age);
pane.add(tage);
pane.add(gender);
pane.add(tgender);
pane.add(thost);
pane.add(host);
inforinit();
spane=new JScrollPane(sublist);
spane.setBounds(20,100,250,450);
chat=new JButton("Chat");
chat.setBounds(20,560,70,30);
chat.addActionListener(this);
refresh=new JButton("Refresh");
refresh.setBounds(100,560,90,30);
this.add(refresh);
refresh.addActionListener(this);
quit=new JButton("Quit");
quit.setBounds(200, 560, 70, 30);
quit.addActionListener(this);
pane.add(quit);
pane.add(chat);
this.add(spane);
this.add(pane);
this.setTitle("SineQ");
this.setSize(300,650);
this.setVisible(true);
this.setLocation(900, 50);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setResizable(false);
}
public void searchfriend()
{
User temp=new User();
temp.ip="255.255.255.255";
temp.port=8888;
cmu.send((String.valueOf(usr.port)+"-"+Protocol.segment.search+"-").getBytes(), temp);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Object src=arg0.getSource();
if(src==chat)
{
int index=sublist.getSelectedIndex();
if(index!=-1)
if(friends[index]!=null)
{
if(friends[index].chatwnd==null)
friends[index].chatwnd=new Chatwindow(friends[index],cmu);
}
}
else if(src==refresh)
{
for(int j=0;j<maxfriendnum;j++)
{
if(friends[j]!=null)
{
if(friends[j].chatwnd!=null)
friends[j].chatwnd.dispose();
friends[j]=null;
}
}
currentnum=0;
fnditem.clear();
inforinit();
searchfriend();

}
else if(src==quit)
{
for(int j=0;j<maxfriendnum;j++)
{
if(friends[j]!=null)
{
if(friends[j].chatwnd!=null)
friends[j].chatwnd.dispose();
friends[j]=null;
}
}
this.dispose();
cmu.quit();
}
}

public static void main(String[]args)
{
Main main=new Main();
}
}
User:
package mychat;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class User {
public String name=null;
public String ip=null;
public String gender=null;
public int age;
public int port;
public Chatwindow chatwnd=null;
public User()
{
name="user"+Math.round(Math.random()*2555);
try {
ip=InetAddress.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
gender="male";
age=21;
port=7777;
}
}
DataParse:
package mychat;
import java.net.DatagramPacket;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
public class Dataparse {
Communication cmu=null;
Iterator<String> i=null;
Date date=null;
public Dataparse(Communication cmu)
{
date=new Date();
this.cmu=cmu;
}
public void parse(DatagramPacket data)
{
ArrayList<String> temp=Protocol.strbreak(new String(data.getData()));
User usr=new User();
usr.ip=data.getAddress().getHostAddress();
i=temp.iterator();
if(i.hasNext())
usr.port=Integer.valueOf(i.next());
while(i.hasNext())
{
String te=i.next();
System.out.println(cmu.main.usr.name+te);
if(te.equals(Protocol.segment.search))
deal_search(usr);
else if(te.equals(Protocol.segment.message))
deal_message(usr);
else if(te.equals(Protocol.segment.file))
deal_file();
else if(te.equals(Protocol.segment.echosearch))
deal_echosearch();

}
}
private void deal_search(User usr) {
// TODO Auto-generated method stub
if(usr.port==cmu.main.usr.port)
return;
String temp=String.valueOf(cmu.main.usr.port)+"-"+Protocol.segment.echosearch;
temp+="-";
temp+=cmu.host.name;
temp+="-";
temp+=cmu.host.gender;
temp+="-";
temp+=String.valueOf(cmu.host.age);
temp+="-";
temp+=String.valueOf(cmu.host.port);
temp+="-";
temp+=cmu.host.ip;
temp+="-";
cmu.send(temp.getBytes(), usr);
}
private void deal_file() {
// TODO Auto-generated method stub
}
private void deal_message(User usr) {
// TODO Auto-generated method stub
String temp=i.next();
boolean flag=false;
int index=cmu.main.currentnum;
for(int j=0;j<index;j++)
{
if(usr.ip.equals(cmu.main.friends[j].ip))
{
flag=true;
if(cmu.main.friends[j].chatwnd==null)
cmu.main.friends[j].chatwnd=new Chatwindow(cmu.main.friends[j], cmu);
cmu.main.friends[j].chatwnd.receivewnd.append(date.toString()+":\n"+temp+"\n");
}
}
}
private synchronized void deal_echosearch() {
// TODO Auto-generated method stub
User usr=new User();
if(i.hasNext())
usr.name=i.next();
if(i.hasNext())
usr.gender=i.next();
if(i.hasNext())
usr.age=Integer.parseInt(i.next());
if(i.hasNext())
usr.port=Integer.parseInt(i.next());
if(i.hasNext())
usr.ip=i.next();
int index=cmu.main.currentnum;
boolean flag=false;
for(int j=0;j<index;j++)
{
if(usr.ip.equals(cmu.main.friends[j].ip))
flag=true;
}
if(flag==false)
{
cmu.main.friends[index]=usr;
cmu.main.currentnum++;
cmu.main.fnditem.add(usr.name);
cmu.main.setPane();
}
}
}
Protocol:
package mychat;
import java.util.ArrayList;
public class Protocol {
static c
4000
lass segment
{
public static String message="message";
public static String search="search";
public static String echosearch="echosearch";
public static String file="file";
public static String font="font";
public static String video="video";
};

public static ArrayList<String> strbreak(String str)
{
ArrayList<String> temp=new ArrayList<String>();
while(str.indexOf('-')!=-1)
{
temp.add(str.substring(0, str.indexOf('-')));
if(str.indexOf('-')!=str.length()-1)
str=str.substring(str.indexOf('-')+1,str.length()-1);
else break;
}
return temp;
}
}
ChatWindow:
package mychat;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Chatwindow extends JFrame implements ActionListener{
Date date=null;
User usr=null;
Communication cmu=null;
JLabel name=null;
JLabel gender=null;
JLabel age=null;
JLabel host=null;
JPanel pane=null;
JTextField tname=null;
JTextField tgender=null;
JTextField tage=null;
JTextField thost=null;
JTextArea receivewnd=null;
JTextArea sendwnd=null;
JButton send=null;
JButton quit=null;
JScrollPane spaner=null;
JScrollPane spanes=null;
void inforinit()
{
tname.setText(usr.name);
tgender.setText(usr.gender);
tage.setText(String.valueOf(usr.age));
thost.setText(usr.ip);

}
public Chatwindow(User usr,Communication cmu)
{
this.usr=usr;
this.cmu=cmu;
date=new Date();
pane=new JPanel();
name=new JLabel("Name :");
gender=new JLabel("Gender :");
age=new JLabel("Age :");
host=new JLabel("Ip :");
pane.setLayout(null);
tname=new JTextField();
tgender=new JTextField();
tage=new JTextField();
thost=new JTextField();
name.setBounds(10, 10, 40, 20);
tname.setBounds(60, 10, 210,20);
age.setBounds(10, 40, 30, 20);
tage.setBounds(60, 40, 40, 20);
gender.setBounds(150,40,50,20);
tgender.setBounds(220, 40, 50, 20);
host.setBounds(320,10,40,20);
thost.setBounds(350, 10, 210, 20);
pane.add(name);
pane.add(tname);
pane.add(age);
pane.add(tage);
pane.add(gender);
pane.add(tgender);
pane.add(thost);
pane.add(host);
inforinit();
this.add(pane);

receivewnd=new JTextArea();
sendwnd=new JTextArea();
spaner=new JScrollPane(receivewnd);
spanes=new JScrollPane(sendwnd);
spaner.setBounds(10,80,400,180);
spanes.setBounds(10,270,400,120);
pane.add(spaner);
pane.add(spanes);
send=new JButton("Send");
quit=new JButton("Quit");
send.setBounds(340,400,70,30);
quit.setBounds(260,400,70,30);
send.addActionListener(this);
quit.addActionListener(this);
pane.add(send);
pane.add(quit);
this.setSize(600,500);
this.setLocation(200,100);
this.setTitle("Chating with "+usr.name);
this.setVisible(true);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
Object src=arg0.getSource();
if(src==send)
{
String temp=String.valueOf(cmu.main.usr.port)+"-"+Protocol.segment.message+"-";
temp+=sendwnd.getText()+"-";
cmu.send(temp.getBytes(), usr);
receivewnd.append("Me: "+date.toString()+":\n"+sendwnd.getText()+"\n");
sendwnd.setText("");
}
}

}
Communication:
package mychat;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class Communication extends Thread{

Dataparse dp=null;
DatagramSocket server=null;
DatagramSocket client=null;
User host=null;
Main main=null;
byte[] data=null;
public void setUser(User usr)
{
this.host=usr;
}
public Communication(User host,Main main)
{
this.main=main;
this.host=host;
dp=new Dataparse(this);
data=new byte[65535];
}
public void init()
{
try {
server=new DatagramSocket(host.port);
client=new DatagramSocket();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void quit()
{
if(server!=null)
server.close();
if(client!=null)
client.close();
}
public synchronized void send(byte data[],User usr)
{
DatagramPacket pac=null;
try {
pac = new DatagramPacket(data,data.length,InetAddress.getByName(usr.ip),usr.port);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(client!=null)
try {
client.send(pac);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
DatagramPacket receivepacket=new DatagramPacket(data,data.length);
while(true)
{

if(server!=null)
{
try {
server.receive(receivepacket);
dp.parse(receivepacket);

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息