Java Socket+mysql實(shí)現(xiàn)簡易文件上傳器的代碼
最近跟著某網(wǎng)站學(xué)習(xí)了一個(gè)小項(xiàng)目,因?yàn)榘滋煊姓n,所以都是晚上寫的,今天把它完成了。
項(xiàng)目主要是實(shí)現(xiàn)一個(gè)文件上傳器,通過客戶端的登陸,把本地文件上傳到服務(wù)器的數(shù)據(jù)庫(本地的)。
首先建兩個(gè)表如下:
一個(gè)文件信息表
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;
一個(gè)用戶信息表
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;
/*
* 用戶實(shí)體類
*/
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";// 數(shù)據(jù)庫連接字符串
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";// 數(shù)據(jù)庫連接字符串
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;
/*
* 文件實(shí)體類
*/
public class FileInfo implements Serializable{
private static final long serialVersionUID = 2554622626228481455L;
private int fid;//文件編號
private String fname;//文件名
private byte[] fcontent;//文件內(nèi)容
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;
//將文件保存到數(shù)據(jù)庫中
public boolean save(FileInfo file){
String url = "jdbc:mysql://localhost:3306/fileupload";//數(shù)據(jù)庫連接字符串
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;
/*
* 啟動服務(wù)器類
*/
public class StartServer {
@SuppressWarnings("resource")
public static void main(String[] args){
try {
// 1.創(chuàng)建一個(gè)服務(wù)器端Socket,即ServerSocket,指定綁定的端口,并監(jiān)聽此端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
System.out.println("服務(wù)器已啟動,等待客戶端的連接...");
//循環(huán)監(jiān)聽等待客戶端的連接
while (true) {
// 2.調(diào)用accept()方法開始監(jiān)聽,等待客戶端的連接
socket = serverSocket.accept();
//創(chuàng)建一個(gè)新的線程
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;
/*
* 服務(wù)器端多線程處理類
*/
public class ServerThread extends Thread {
static Socket socket = null;
private static ObjectInputStream ois = null;// 對象輸入流
private ObjectOutputStream oos = null;// 對象輸出流
private UserService us = new UserService();// 用戶業(yè)務(wù)對象
private FileService fs = new FileService();// 文件業(yè)務(wù)對象
// 通過構(gòu)造方法,初始化socket
public ServerThread(Socket socket) {
ServerThread.socket = socket;
}
public void run() {
try {
ois = new ObjectInputStream(socket.getInputStream());//接收客戶端發(fā)來的消息
oos = new ObjectOutputStream(socket.getOutputStream());//用來向客戶端發(fā)送消息
CommandTransfer transfer = (CommandTransfer) ois.readObject(); // 讀取客戶端發(fā)送到服務(wù)器的指令操作
transfer = execute(transfer); // 執(zhí)行客戶端送到服務(wù)器的指令操作
oos.writeObject(transfer);// 響應(yīng)客戶端
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
/*
* 執(zhí)行客戶端發(fā)送到服務(wù)器的指令操作
*/
private CommandTransfer execute(CommandTransfer transfer) {
String cmd = transfer.getCmd();// 獲取當(dāng)前操作的指令
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("歡迎你對本系統(tǒng)的支持");
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;// 登陸次數(shù)
while (true) {
count++;
if (count > 3) {
System.out.println("你已連續(xù)3次登陸失敗,程序退出!");
System.exit(0);
}
System.out.print("請輸入用戶名:");
user.setUsename(input.next());
System.out.print("請輸入密碼:");
user.setUsepsd(input.next());
System.out.print("請?jiān)俅屋斎朊艽a:");
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);// 將數(shù)據(jù)發(fā)送到服務(wù)器
transfer = getData();// 獲取服務(wù)器返回的數(shù)據(jù)
System.out.println(transfer.getResult());// 輸出顯示結(jié)果
System.out.println("*****************************");
if (transfer.isFlag()) {
break;// 如果注冊成功,則不再重復(fù)執(zhí)行注冊
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
showLogin();// 注冊成功后顯示登陸
}
// 獲得服務(wù)器的數(shù)據(jù)
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);// 將數(shù)據(jù)發(fā)送到服務(wù)器
transfer = getData();// 獲取服務(wù)器返回的數(shù)據(jù)
System.out.println(transfer.getResult());// 輸出顯示結(jié)果
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
// 向服務(wù)器發(fā)送數(shù)據(jù)
public static void sendData(CommandTransfer cmd) throws IOException {
// TODO Auto-generated method stub
ObjectOutputStream oos = null;
try {
if(socket.isClosed())//判斷socket是否被關(guān)閉,如果關(guān)閉,就打開
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);// 將數(shù)據(jù)發(fā)送到服務(wù)器
transfer = getData();// 獲取服務(wù)器返回的數(shù)據(jù)
System.out.println(transfer.getResult());// 輸出顯示結(jié)果
System.out.println("*****************************");
if (transfer.isFlag()) {
break;// 如果注冊成功,則不再重復(fù)執(zhí)行注冊
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
showUploadFile();// 登陸成功后進(jìn)行文件的上傳
}
}
運(yùn)行效果圖如下:


文件已保存到數(shù)據(jù)庫中了,這個(gè)項(xiàng)目對于想練練Socket通信和mysql的朋友來說,還是挺不錯(cuò)的。
以上所述是小編給大家介紹的Java Socket+mysql實(shí)現(xiàn)簡易文件上傳器,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- Java 基于TCP Socket 實(shí)現(xiàn)文件上傳
- Socket+JDBC+IO實(shí)現(xiàn)Java文件上傳下載器DEMO詳解
- Java中用Socket實(shí)現(xiàn)HTTP文件上傳實(shí)例
- JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例解析
- JAVA中使用FTPClient實(shí)現(xiàn)文件上傳下載實(shí)例代碼
- java實(shí)現(xiàn)FTP文件上傳與文件下載
- JavaWeb實(shí)現(xiàn)文件上傳下載功能實(shí)例詳解
- java web圖片上傳和文件上傳實(shí)例
- Java實(shí)現(xiàn)文件上傳至服務(wù)器的方法
- java使用Socket實(shí)現(xiàn)文件上傳功能
相關(guān)文章
java IO流 之 輸出流 OutputString()的使用
這篇文章主要介紹了java IO流 之 輸出流 OutputString()的使用的相關(guān)資料,需要的朋友可以參考下2016-12-12
springboot用thymeleaf模板的paginate分頁完整代碼
本文根據(jù)一個(gè)簡單的user表為例,展示 springboot集成mybatis,再到前端分頁完整代碼,需要的朋友可以參考下2017-07-07
Spring Boot 通過CORS實(shí)現(xiàn)跨域問題
這篇文章主要介紹了Spring Boot 通過CORS實(shí)現(xiàn)跨域,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
spring?retry方法調(diào)用失敗重試機(jī)制示例解析
這篇文章主要為大家介紹了spring?retry方法調(diào)用失敗重試機(jī)制的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03

