Java Socket+mysql实现简易文件上传器的代码_java

最近跟着某网站学习了一个小项目,因为白天有课,所以都是晚上写的,今天把它完成了。

项目主要是实现一个文件上传器,通过客户端的登陆,把本地文件上传到服务器的数据库(本地的)。

首先建两个表如下:

一个文件信息表

CREATE TABLE `fileinfo` (
`Fname` char(50) NOT NULL,
`FInfo` blob NOT NULL,
`FId` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`FId`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 

一个用户信息表

CREATE TABLE `user` (
`username` char(25) NOT NULL,
`password` char(25) NOT NULL,
`useid` int(10) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`useid`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;

User类

package fileUpload;
import java.io.Serializable;
/*
* 用户实体类
*/
public class User implements Serializable{
private static final long serialVersionUID = -7279093338433393181L;
private int useid;//用户编号
private String usename;//用户名
private String usepsd;//用户密码
public User(){
}
public User(String usename,String usepsd){
super();
this.usename = usename;
this.usepsd = usepsd;
}
public User(int useid,String usename,String usepsd){
super();
this.useid = useid;
this.usename = usename;
this.usepsd = usepsd;
}
public int getUseid() {
return useid;
}
public void setUseid(int useid) {
this.useid = useid;
}
public String getUsename() {
return usename;
}
public void setUsename(String usename) {
this.usename = usename;
}
public String getUsepsd() {
return usepsd;
}
public void setUsepsd(String usepsd) {
this.usepsd = usepsd;
}
}

UserService类

package fileUpload;
/**
* 用户登陆与注册操作类
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserService {
private Connection conn = null;
private PreparedStatement ptmt = null;
private ResultSet rs = null;
// 用户登录
public boolean login(User user) {
String url = "jdbc:mysql://localhost:3306/fileupload";// 数据库连接字符串
String sql = "select * from user where username=? and password=?";
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(url, "root", "1995520");
ptmt = conn.prepareStatement(sql);
ptmt.setString(1, user.getUsename());
ptmt.setString(2, user.getUsepsd());
rs = ptmt.executeQuery();
if (rs.next()) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
rs.close();
ptmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return false;
}
//用户注册
public boolean register(User user){
System.out.println("hello");
String url = "jdbc:mysql://localhost:3306/fileupload";// 数据库连接字符串
String sql = "insert into user(username,password) values (?,?)";
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(url, "root", "1995520");
ptmt = conn.prepareStatement(sql);
ptmt.setString(1, user.getUsename());
ptmt.setString(2, user.getUsepsd());
ptmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
//rs.close();
ptmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return true;
}
}

FileIofo类

package fileUpload;
import java.io.Serializable;
/*
* 文件实体类
*/
public class FileInfo implements Serializable{
private static final long serialVersionUID = 2554622626228481455L;
private int fid;//文件编号
private String fname;//文件名
private byte[] fcontent;//文件内容
public FileInfo(){
}
public FileInfo(String fname,byte[] fcontent){
super();
this.fname = fname;
this.fcontent = fcontent;
}
public FileInfo(int fid,String fname,byte[] fcontent){
super();
this.fid = fid;
this.fname = fname;
this.fcontent = fcontent;
}
public int getFid() {
return fid;
}
public void setFid(int fid) {
this.fid = fid;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public byte[] getFcontent() {
return fcontent;
}
public void setFcontent(byte[] fcontent) {
this.fcontent = fcontent;
}
}

FileService类

package fileUpload;
/**
* 文件上传操作类
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class FileService {
private Connection conn = null;
private PreparedStatement ptmt = null;
//将文件保存到数据库中
public boolean save(FileInfo file){
String url = "jdbc:mysql://localhost:3306/fileupload";//数据库连接字符串
String sql = "insert into fileinfo(Fname,Finfo) value (?,?)";
try{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
conn = DriverManager.getConnection(url, "root", "1995520");
ptmt = conn.prepareStatement(sql);
ptmt.setString(1, file.getFname());
ptmt.setBytes(2,file.getFcontent());
ptmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try {
ptmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return true;
}
}

package fileUpload;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 启动服务器类
*/
public class StartServer {
@SuppressWarnings("resource")
public static void main(String[] args){
try {
// 1.创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
System.out.println("服务器已启动,等待客户端的连接...");
//循环监听等待客户端的连接
while (true) {
// 2.调用accept()方法开始监听,等待客户端的连接
socket = serverSocket.accept();
//创建一个新的线程
ServerThread serverThread = new ServerThread(socket);
//启动线程
serverThread.start();
}
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
[java] view plain copy 在CODE上查看代码片派生到我的代码片
package fileUpload;
import java.io.IOException;
/**
* 启动客户端类
*/
public class StartClient {
public static void main(String[] args) throws IOException{
SocketClient client = new SocketClient();
client.showMainMenu();//显示主菜单
}
}

package fileUpload;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
/*
* 服务器端多线程处理类
*/
public class ServerThread extends Thread {
static Socket socket = null;
private static ObjectInputStream ois = null;// 对象输入流
private ObjectOutputStream oos = null;// 对象输出流
private UserService us = new UserService();// 用户业务对象
private FileService fs = new FileService();// 文件业务对象
// 通过构造方法,初始化socket
public ServerThread(Socket socket) {
ServerThread.socket = socket;
}
public void run() {
try {
ois = new ObjectInputStream(socket.getInputStream());//接收客户端发来的消息
oos = new ObjectOutputStream(socket.getOutputStream());//用来向客户端发送消息
CommandTransfer transfer = (CommandTransfer) ois.readObject(); // 读取客户端发送到服务器的指令操作
transfer = execute(transfer); // 执行客户端送到服务器的指令操作
oos.writeObject(transfer);// 响应客户端
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 执行客户端发送到服务器的指令操作
*/
private CommandTransfer execute(CommandTransfer transfer) {
String cmd = transfer.getCmd();// 获取当前操作的指令
if (cmd.equals("login")) { // 用户登录
User user =(User)transfer.getData();
boolean flag = us.login(user);
if(flag)
JOptionPane.showMessageDialog(null, "登陆成功!");
transfer.setFlag(flag);
if(flag){//判断登陆是否成功
transfer.setResult("登陆成功!");
}else{
transfer.setResult("用户名或密码不正确,请重新登陆!");
}
}else if(cmd.equals("register")){//用户注册
User user = (User) transfer.getData();
us.register(user);//注册用户
boolean flag = us.register(user);
if(flag)
JOptionPane.showMessageDialog(null, "注册成功!");
transfer.setFlag(flag);
if(flag){
transfer.setResult("注册成功!");
}else{
transfer.setResult("注册失败!");
}
}else if(cmd.equals("uploadFile")){
FileInfo file =(FileInfo)transfer.getData();
fs.save(file);
boolean flag = fs.save(file);
if(flag)
JOptionPane.showMessageDialog(null, "上传成功!");
transfer.setFlag(flag);
if(flag){
transfer.setResult("上传成功!");
}else{
transfer.setResult("上传失败!");
}
}
return transfer;
}
}
package fileUpload;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
* 主菜单类
*/
public class SocketClient {
Scanner input = new Scanner(System.in);
private static Socket socket = null;// 客户端Socket
// 主菜单
public void showMainMenu() throws IOException {
System.out.println("******欢迎使用xx文件上传器******");
System.out.println("1.登录\n2.注册\n3.退出");
System.out.println("****************************");
System.out.println("请选择:");
int choice = input.nextInt();// 获取用户的选择
socket = new Socket("localhost", 8888);
switch (choice) {
case 1:
showLogin();// 登录
break;
case 2:
showRegister();// 注册
break;
case 3:
System.out.println("欢迎你对本系统的支持");
System.exit(0);
default:
System.out.println("输入有误!");
System.exit(0);
}
}
// 用户注册
private void showRegister() throws IOException {
User user = new User();
CommandTransfer transfer = new CommandTransfer();
int count = 0;// 登陆次数
while (true) {
count++;
if (count > 3) {
System.out.println("你已连续3次登陆失败,程序退出!");
System.exit(0);
}
System.out.print("请输入用户名:");
user.setUsename(input.next());
System.out.print("请输入密码:");
user.setUsepsd(input.next());
System.out.print("请再次输入密码:");
String rePassword = input.next();
if (!user.getUsepsd().equals(rePassword)) {
System.out.println("两次输入的密码不一致!");
System.out.println("**********************");
continue;
}
transfer.setCmd("register");
transfer.setData(user);
try {
sendData(transfer);// 将数据发送到服务器
transfer = getData();// 获取服务器返回的数据
System.out.println(transfer.getResult());// 输出显示结果
System.out.println("*****************************");
if (transfer.isFlag()) {
break;// 如果注册成功,则不再重复执行注册
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
showLogin();// 注册成功后显示登陆
}
// 获得服务器的数据
public static CommandTransfer getData() throws IOException {
// TODO Auto-generated method stub
ObjectInputStream ois = null;
CommandTransfer res = null;
try {
if(socket.isClosed())
socket = new Socket("localhost", 8888);
ois = new ObjectInputStream(socket.getInputStream());
res = (CommandTransfer) ois.readObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
//socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return res;
}
/*
* 上传文件
*/
private void showUploadFile() throws IOException {
System.out.println("请输入上传文件的绝对路径:");
String path = input.next();
FileInfo file = null;
FileInputStream fis = null;
BufferedInputStream bis = null;
String fname = path.substring(path.lastIndexOf("/") + 1);
try {
fis = new FileInputStream(path);
byte[] fcontent = new byte[fis.available()];
bis = new BufferedInputStream(fis);
bis.read(fcontent);
file = new FileInfo(fname, fcontent);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
bis.close();
fis.close();
}
CommandTransfer transfer = new CommandTransfer();
transfer.setCmd("uploadFile");
transfer.setData(file);
try {
sendData(transfer);// 将数据发送到服务器
transfer = getData();// 获取服务器返回的数据
System.out.println(transfer.getResult());// 输出显示结果
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
// 向服务器发送数据
public static void sendData(CommandTransfer cmd) throws IOException {
// TODO Auto-generated method stub
ObjectOutputStream oos = null;
try {
if(socket.isClosed())//判断socket是否被关闭,如果关闭,就打开
socket = new Socket("localhost", 8888);
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(cmd);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 用户登陆
private void showLogin() throws IOException {
User user = new User();
CommandTransfer transfer = new CommandTransfer();
while (true) {
System.out.print("请输入用户名:");
user.setUsename(input.next());
System.out.print("请输入密码:");
user.setUsepsd(input.next());
transfer.setCmd("login");
transfer.setData(user);
try {
sendData(transfer);// 将数据发送到服务器
transfer = getData();// 获取服务器返回的数据
System.out.println(transfer.getResult());// 输出显示结果
System.out.println("*****************************");
if (transfer.isFlag()) {
break;// 如果注册成功,则不再重复执行注册
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
showUploadFile();// 登陆成功后进行文件的上传
}
}

运行效果图如下:

文件已保存到数据库中了,这个项目对于想练练Socket通信和mysql的朋友来说,还是挺不错的。

以上所述是小编给大家介绍的Java Socket+mysql实现简易文件上传器,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
, socket
java文件上传器
socket实现简易服务器、socket实现文件上传、mysql socket、mysql socket 连接、mysql socket文件,以便于您获取更多的相关知识。

时间: 2024-11-01 04:34:56

Java Socket+mysql实现简易文件上传器的代码_java的相关文章

JAVA中使用FTPClient实现文件上传下载实例代码_java

在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件.下载文件,本文给大家介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建 * @param url F

commons fileupload实现文件上传的实例代码_java

一.文件上传的原理分析 1.文件上传的必要前提 a.表单的method必须是post b.表单的enctype属性必须是multipart/form-data类型的. enctype默认值:application/x-www-form-urlencoded 作用:告知服务器,请求正文的MIME类型 application/x-www-form-urlencoded : username=abc&password=123 ServletRequest.getParameter(String nam

java使用smartupload组件实现文件上传的方法

 这篇文章主要介绍了java使用smartupload组件实现文件上传的方法,对比分析了使用组件与不使用组件实现文件上传的区别,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了java使用smartupload组件实现文件上传的方法.分享给大家供大家参考.具体分析如下: 文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,这里主要说明smartupload组件上传. 在讲解smartupload上传前,我们先来看看不使用组件是怎么完成上传

java-请问Java怎样实现跨服务器文件上传?

问题描述 请问Java怎样实现跨服务器文件上传? 请问Java怎样实现跨服务器文件上传? 文件信息保存在web服务器数据库中,文件保存在另一台机器. 解决方案 另一台机器也要有处理文件上传的WEB程序,你可以参考Stream上传插件(支持HTML5和Flash两种方式上传)http://www.twinkling.cn/ 指定跨域上传就可以了

java web-socket多客户端同时文件上传

问题描述 socket多客户端同时文件上传 现在有javaweb服务端和C#客户端 C#客户端用于数据文件上传,文件上传方式使用socket,现在遇到的问题是: 如果多个客户端同时进行文件上传,则一个客户端数据上传时,其他客户端则无法上传, 一直处于等待状态. 如何解决,跪求! 解决方案 貌似一个socket监听,做服务.有新的连接就再开一个socket与新的连接通信.原socket继续监听-- 解决方案二: 你用的链接模型不支持把可能,或者弄成异步的?

java使用smartupload组件实现文件上传的方法_JSP编程

本文实例讲述了java使用smartupload组件实现文件上传的方法.分享给大家供大家参考.具体分析如下: 文件上传几乎是所有网站都具有的功能,用户可以将文件上传到服务器的指定文件夹中,也可以保存在数据库中,这里主要说明smartupload组件上传. 在讲解smartupload上传前,我们先来看看不使用组件是怎么完成上传的原理的? 废话不多说直接上代码: 复制代码 代码如下: import java.io.*; import java.util.*; import javax.servle

Java doGet, doPost方法和文件上传实例代码_java

Java doGet, doPost方法和文件上传 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/test" method="post

看我如何黑掉PayPal:从任意文件上传到远程代码执行

本文讲的是看我如何黑掉PayPal:从任意文件上传到远程代码执行, 漏洞发现过程 在上一篇文章中,我描述了我是如何破解OSCP证书的,破解起来非常困难,大概花了我四个多月的时间,但是我如果我不去挖漏洞的话,意味着我就没有零用钱了. 正常人的周末充满了饮料,派对,乐趣等等.或者看权力的游戏 ? 像我这样的人,在周末的时候,会看一些博客或者YouTube视频.我打了Burp(关闭了拦截器)并访问了PayPal的漏洞奖励计划页面,于是我发现了如下图所示的内容: 上图显示的是我访问http://payp

Ajax提交Form表单及文件上传的实例代码_AJAX相关

前几天,发现了一些小问题.我在写后台管理页面时,需要上传一张图片.于是我就用很普通的Form表单上传有一段Json串和图片文件: Form表单上传图片只需要在<form>标签里加上enctype = 'multipart/form-data',这样是可以上传图片的: 但问题来了,在我进行用Form表单提交的时候直接跳出来提交返回值的页面并且原先的页面刷新: 这样我们可以先到异步的Ajax可以实现局部刷新: 废话不多说了 直接上代码: 首先是html: <form id = "f