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

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 class 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();
				}
			}
		}
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值