Java Socket+mysql實(shí)現(xiàn)簡易文件上傳器的代碼
最近跟著某網(wǎng)站學(xué)習(xí)了一個小項(xiàng)目,因?yàn)榘滋煊姓n,所以都是晚上寫的,今天把它完成了。
項(xiàng)目主要是實(shí)現(xiàn)一個文件上傳器,通過客戶端的登陸,把本地文件上傳到服務(wù)器的數(shù)據(jù)庫(本地的)。
首先建兩個表如下:
一個文件信息表
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; /* * 用戶實(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)建一個服務(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)建一個新的線程 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ù)庫中了,這個項(xiàng)目對于想練練Socket通信和mysql的朋友來說,還是挺不錯的。
以上所述是小編給大家介紹的Java Socket+mysql實(shí)現(xiàn)簡易文件上傳器,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(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-12springboot用thymeleaf模板的paginate分頁完整代碼
本文根據(jù)一個簡單的user表為例,展示 springboot集成mybatis,再到前端分頁完整代碼,需要的朋友可以參考下2017-07-07Spring Boot 通過CORS實(shí)現(xiàn)跨域問題
這篇文章主要介紹了Spring Boot 通過CORS實(shí)現(xiàn)跨域,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09spring?retry方法調(diào)用失敗重試機(jī)制示例解析
這篇文章主要為大家介紹了spring?retry方法調(diào)用失敗重試機(jī)制的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03