zoukankan      html  css  js  c++  java
  • java UDP聊天与文件传输

    package rgy.com.UDP3;
    
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyAdapter;
    import java.awt.event.KeyEvent;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketAddress;
    import java.sql.Date;
    import java.text.SimpleDateFormat;
    import java.util.Timer;
    import java.util.TimerTask;
    
    import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.WindowConstants;
    
    public class Client extends JFrame {
    	// 加入属性
    	private JPanel panel = new JPanel();
    	private JButton button_send = new JButton("文件发送");
    	private JButton button_receive = new JButton("另存为");
    	private JTextArea ta = new JTextArea();
    	private JScrollPane sp = new JScrollPane(ta);
    	private JTextArea ta_send = new JTextArea();
    	private JScrollPane sp_send = new JScrollPane(ta_send);
    	private JLabel label_fileState = new JLabel("文件状态", JLabel.CENTER);
    	private JLabel label_feedback = new JLabel("反馈", JLabel.CENTER);
    	//
    	private InetAddress ip = null;
    	private int otherport;
    	private int myport;
    	DatagramSocket socket;// 接收文件来显提示
    	DatagramSocket socket1;// 接收文件信息
    	DatagramSocket socket2;// 接收平时的聊天信息
    	//
    	String filename = null;
    	byte buffer[] = new byte[1024];
    	int fileLen = 0;
    	int numofBlock = 0;
    	int lastSize = 0;
    	//
    	String str_name;
    
    	//
    	public Client(String str_name, String str_ip, int otherport, int myport) {
    		super(str_name);
    		this.str_name = str_name;
    		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    		this.setBounds(600, 250, 300, 400);
    		// 加入功能代码
    		this.setLayout(new GridLayout(5, 1, 7, 7));
    		ta.setLineWrap(true);// 换行
    		this.add(sp);
    		ta_send.setLineWrap(true);// 换行
    		this.add(sp_send);
    		button_send.setFont(new Font("楷体", 1, 20));
    		button_receive.setFont(new Font("楷体", 1, 20));
    		panel.add(button_send);
    		panel.add(button_receive);
    		this.add(panel);
    		this.add(label_fileState);
    		this.add(label_feedback);
    		//
    		this.setVisible(true);
    		//
    		this.otherport = otherport;
    		this.myport = myport;
    		//
    		button_send.addActionListener(new ActionListener() {// 发送文件
    					public void actionPerformed(ActionEvent e) {
    						// 选择要发送的文件
    						JFileChooser filechooser = new JFileChooser();
    						int result = filechooser.showOpenDialog(Client.this);
    						if (result == JFileChooser.APPROVE_OPTION) {
    							try {
    								File file = filechooser.getSelectedFile();
    								try {
    									// 将文件名称发送过去
    									String str_filename = file.getName();
    									String str_tip = "有文件,请处理:" + str_filename;
    									byte[] fileNameBuf = str_tip.getBytes();
    									DatagramSocket socket = new DatagramSocket();
    									DatagramPacket packet = new DatagramPacket(
    											fileNameBuf, fileNameBuf.length,
    											ip, Client.this.otherport);
    									socket.send(packet);
    									socket.close();
    									//
    									FileInputStream fis = new FileInputStream(
    											file);// 从文件里取出写入内存
    									// 将文件长度发送过去
    									int fileLen = fis.available();
    									String str_len = "" + fileLen;
    									byte[] fileLenBuf = str_len.getBytes();
    									socket = new DatagramSocket();
    									packet = new DatagramPacket(fileLenBuf,
    											fileLenBuf.length, ip,
    											Client.this.otherport+1);
    									socket.send(packet);
    									socket.close();
    									// 发送文件主体
    									byte[] buf = new byte[1024];
    									int numofBlock = fileLen / buf.length;// 循环次数(将该文件分成了多少块)
    									int lastSize = fileLen % buf.length;// 最后一点点零头的字节数
    									socket = new DatagramSocket();
    									for (int i = 0; i < numofBlock; i++) {
    										fis.read(buf, 0, buf.length);// 写入内存
    										packet = new DatagramPacket(buf,
    												buf.length, ip,
    												Client.this.otherport+1);
    										socket.send(packet);
    										Thread.sleep(1); // 简单的防止丢包现象
    									}
    									// 发送最后一点点零头
    									fis.read(buf, 0, lastSize);
    									packet = new DatagramPacket(buf,
    											buf.length, ip,
    											Client.this.otherport+1);
    									socket.send(packet);
    									Thread.sleep(1); // 简单的防止丢包现象
    									//
    									fis.close();
    									socket.close();
    									//
    									label_fileState.setText("文件传输完成。");
    									ta.append("");
    									//
    								} catch (Exception ev) {
    									System.out.println(ev);
    								}
    							} catch (Exception ex) {
    								JOptionPane.showMessageDialog(Client.this,
    										"打开文档出错!");
    							}
    						}
    					}
    				});
    		// /////////////
    		button_receive.addActionListener(new ActionListener() {// 接收文件
    					public void actionPerformed(ActionEvent e) {
    						// 选择要接收的文件
    						JFileChooser filechooser = new JFileChooser();
    						int result = filechooser.showSaveDialog(Client.this);
    						if (result == JFileChooser.APPROVE_OPTION) {
    							try {
    								File file2 = filechooser.getSelectedFile();
    								try {
    									File file1 = new File("D:\TT\" + filename);
    									saveAs(file1, file2);
    									//
    									label_fileState.setText("文件接收完成!

    "); ta.append("文件已处理!! "); } catch (Exception ex) { System.out.println(ex); } } catch (Exception ex) { JOptionPane.showMessageDialog(Client.this, "打开保存出错!"); } } } }); // ta_send.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent ke) { String str_chat = Client.this.str_name + " 说: " + ta_send.getText(); byte buf[] = str_chat.getBytes(); if (ke.isControlDown() && ke.getKeyCode() == KeyEvent.VK_ENTER) { try { DatagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(buf, buf.length, ip, Client.this.otherport+2); socket.send(packet); ta.append("我说: "+ta_send.getText()+" "); ta_send.setText(""); } catch (Exception ex) { System.out.println(ex); } } } }); // try { ip = InetAddress.getByName(str_ip); socket = new DatagramSocket(this.myport); socket1 = new DatagramSocket(this.myport + 1); socket2 = new DatagramSocket(this.myport + 2); Timer timer = new Timer();//定时器,刷新接收消息 timer.schedule(new MyTimerTask_receive(),0, 100); while (socket!=null) { try { // byte filetipBuf[] = new byte[256];// 防止文件名称字过长(此处最长256个字符) DatagramPacket packet_tip = new DatagramPacket(filetipBuf, 0, filetipBuf.length); socket.receive(packet_tip); String str_filetip = new String(packet_tip.getData(), 0, packet_tip.getLength()); filename = str_filetip.substring(8); ta.append(str_filetip + " "); // 接收文件长度(字节数) byte[] fileLenBuf = new byte[12];// 能够传输1T的文件 DatagramPacket packet_len = new DatagramPacket(fileLenBuf, fileLenBuf.length); socket1.receive(packet_len); String str_fileLen = new String(fileLenBuf, 0, packet_len.getLength()); fileLen = Integer.parseInt(str_fileLen); ta.append("文件大小: " + fileLen + "字节, " + (fileLen / 1024) + "kb, " + (fileLen / 1024 / 1024) + "Mb "); // DatagramPacket packet_file = new DatagramPacket(buffer, 0, buffer.length); numofBlock = fileLen / buffer.length;// 循环次数(将该文件分成了多少块) lastSize = fileLen % buffer.length;// 最后一点点零头的字节数 File file = new File("D:\TT\" + filename); FileOutputStream fos = new FileOutputStream(file);// 从内存取出存入文件 for (int i = 0; i < numofBlock; i++) { packet_file = new DatagramPacket(buffer, 0, buffer.length); socket1.receive(packet_file);// 通过套接字接收数据 fos.write(buffer, 0, 1024);// 写入文件 } // 接收最后一点点零头 packet_file = new DatagramPacket(buffer, 0, lastSize); socket1.receive(packet_file);// 通过套接字接收数据 fos.write(buffer, 0, lastSize);// 写入文件 fos.close(); // 反馈包 } catch (Exception e) { System.out.println(e); } } } catch (Exception e) { System.out.println(e); } } public void saveAs(File file1, File file2) {// 把file1另存为file2,并删掉file1 try { FileInputStream fis = new FileInputStream(file1); FileOutputStream fos = new FileOutputStream(file2); byte buf[] = new byte[1024]; int len = 0; while ((len = fis.read(buf)) != -1) { fos.write(buf, 0, len); } fis.close(); fos.close(); file1.delete(); } catch (Exception ex) { System.out.println(ex); } } class MyTimerTask_receive extends TimerTask { public void run() { try{ byte chatBuf[] = new byte[512]; DatagramPacket packet_chat = new DatagramPacket(chatBuf, 0, chatBuf.length); socket2.receive(packet_chat); String str_chat = new String(packet_chat.getData(), 0, packet_chat.getLength()); ta.append(str_chat + " "); }catch(Exception ex){ System.out.println(ex); } } } // //////////////////////////////////////////////////// public static void main(String args[]) { new Client("Mary", "127.0.0.2", 6000, 10000); } }


  • 相关阅读:
    使用阿里云服务器的总结二-----目录权限
    使用阿里云服务器的总结一----修改配置
    thinkphp框架开启页面gzip压缩
    内容页分页代码
    js禁止中文输入 最简洁的【禁止输入中文】
    JS中setTimeout()的用法详解
    面向对象的5条基本设计原则
    C#_面试题1
    问题 E: C语言11.8
    问题 D: C语言11.7
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7105587.html
Copyright © 2011-2022 走看看