基于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(); } } } } }
相关文章推荐
- 基于P2P协议通信模式的选型(一)
- 基于udp通信协议开发的简易聊天系统1.0
- 基于P2P协议通信模式的选型(二)
- 即时通信软件常用开放协议与术语
- 基于Linux系统的tcp协议的即时通信系统(聊天室)
- Java学习系列(十八)Java面向对象之基于UDP协议的网络通信
- Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
- 136-基于 UDP 协议的通信
- Linux下基于UDP协议的C/S通信编程笔记
- Linux中使用C语言实现基于UDP协议的Socket通信示例
- android手机与服务器基于UDP协议的通信
- Java学习系列(十八)Java面向对象之基于UDP协议的网络通信
- 基于UDP协议的双端通信
- notTX FLV探测/播放和基于P2P的即时通讯多功能软件
- android实现基于TCP和UDP协议的即时通讯,含android端和服务器端
- 基于LINUX系统的SOCKET通信,使用UDP协议.
- Java学习系列(十八)Java面向对象之基于UDP协议的网络通信
- 基于P2P模式的视频通信系统
- 基于QT的UDP协议的通信
- 基于QT的UDP协议的通信小程序