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("文件已处理!!\n");
								} 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()+"\n");
						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 + "\n");
					// 接收文件长度(字节数)
					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\n");
					//
					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 + "\n");
			}catch(Exception ex){
				System.out.println(ex);
			}
		}
	}

	// ////////////////////////////////////////////////////
	public static void main(String args[]) {
		new Client("Mary", "127.0.0.2", 6000, 10000);
	}
}

java UDP聊天与文件传输,布布扣,bubuko.com

时间: 2024-10-27 01:33:46

java UDP聊天与文件传输的相关文章

android asmack 注册 登陆 聊天 多人聊天室 文件传输

XMPP协议简介 XMPP协议(Extensible Messaging and PresenceProtocol,可扩展消息处理现场协议)是一种基于XML的协议,目的是为了解决及时通信标准而提出来的,最早是在Jabber上实现的.它继承了在XML环境中灵活的发展性.因此,基于XMPP的应用具有超强的可扩展性.并且XML很易穿过防火墙,所以用XMPP构建的应用不易受到防火墙的阻碍.利用XMPP作为通用的传输机制,不同组织内的不同应用都可以进行有效的通信. 这篇文章有基本的介绍,http://bl

Linux socket跨局域网聊天和文件传输

一直想写一个跨局域网聊天和文件传输,以及视频聊天的软件,这两天刚好闲着没啥事就把代码写完了,代码已经上传至github:https://github.com/vinllen/chat 其实之前想法P2P模式,P2P的话必须穿透NAT,现在的NAT有4种模式: 完全圆锥型NAT 受限圆锥型NAT 端口受限圆锥型NAT 对称NAT(双向NAT) 维基百科给出的定义如下: 1.Full cone NAT,亦即著名的一对一(one-to-one)NAT 一旦一个内部地址(iAddr:port1)映射到外

java基于P2P的聊天和文件传输实例

用java的NIO技术编写的 1. 支持聊天功能 2. 拖拽文件能够实现文件传输功能.也能够是目录 3. 启动时能够选择server端或client端启动 4. 本人原创.学习NIO和java的网络通信一定会不错 5. 下载下来能够直接导致eclipse.然后执行 代码下载路径例如以下: http://download.csdn.net/detail/tqtihihc/8266793 截图:

Tftp文件传输服务器(基于UDP协议)

一个简单的UDP服务端与客户端 服务端: 1 from socket import * 2 #创建套接字 3 udp_server = socket(AF_INET,SOCK_DGRAM) 4 5 msg_server = ("",8877) 6 #绑定ip地址和端口 7 udp_server.bind(msg_server) 8 9 while True: 10 #接受消息,注意此处用的是 recvfrom() 11 msg_client = udp_server.recvfrom(

TCP、UDP练习题 (UDP聊天程序、TCP上传文本文件和图片文件)

TCP.UDP编程练习 TCP ☆上传文本文件 读取一个本地文本文件,将数据发送到服务端,服务器端对数据进行存储. 存储完毕后,给客户端一个提示. 一.解题思路 客户端:(1) 创建Socket对象----用服务器的ip+端口号 (2)读取文件内容 (3)通过socket把内容发送给服务器端(把socket中的输出流包装成"打印流"来进行发送文本,是一种比较安全的输出方式,不会出现失真.) 服务器端:(1) 创建服务器socket---ServerSocket (2)通过ServerS

Java UDP实现聊天功能代码

我以前经常写的是基于TCP的网络编程,由于TCP建立连接鼻血要经过三次握手连接,服务器端需要阻塞式等待客户端的连接.而UDP则是可以直接向目的地址的目的端口上发送数据包,由于它只负责发送出去就好,不管对方是否正确接受到与否,所以当网络性能不好时它容易出现丢包的问题.(注意:UDP是基于数据报为单位进行传输的,而TCP是一种基于流进行传输的) 但是UDP很好的模拟了我们呢平时聊天的方式,可以很好的实现连续多次发送和接受,也就是简单的QQ聊天的功能. 现在来简要介绍Java中有关UDP编程相关的类:

Socket编程一实现简易的聊天功能以及文件传输

干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看.我从小就喜爱看武侠小说,一直有着武侠梦.从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江湖. 如果你有好看的武侠系列小说,给我留言哦.题外话就扯这么多了,接着还是上技术. 看看今天实现的功能效果图: 可以这里使用多台手机进行通讯,[凤歌]我采用的服务器发送消息. 是不是只有发送消息,有些显得太单调了.好,在发送消息的基础上增加文件传输.后期会增加视频,音频的传输,增加表情包.那一起来看

基于文件传输的UDP协议分析(1)

网络通信与数据交换已经成为现代软件必备的基础功能. 目前公司上下位机的网络通信均采用TCP/ UDP协议进行数据交换和控制.这种低层次的网络通信协议在小数据量,少互交的领域有着较大的优势.但是随着网络功能需求的日趋旺盛,TCP/UDP协议日渐无法满足需求,其弊端日渐明显 *TCP/UDP通信编程可分为: 1  通信控制层 通信控制层负责网络的配置,连接,发送数据, 接受数据响应, 中断等服务 2数据处理层 数据处理层主要负责数据的封包,解包,校验等工      作.简称: "数据协议的程序化过程

linux网络环境下socket套接字编程(UDP文件传输)

今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中,如果我们使用TCP传输,会造成传输速度较慢的情况,所以我们在进行文件传输的过程中,最好要使用UDP传输. 在其中,我们需要写两个程序,一个客户端,一个服务端,在一个终端中,先运行服务端,在运行客户端,在服务端和客户端都输入IP地址和端口号,注意服务端和客户端的端口号要相同,然后选择功能,在linux