基于socket,实现用户注册,用户登录,以及文件上传的例子
来源:互联网 发布:全国电视台直播软件 编辑:程序博客网 时间:2024/05/20 12:21
观看慕课网关于socket的视频,完成的一个小练习,demo源码和课程链接会放在后面。
1.项目截图:
2.源码分析
1.server.java 服务器端socket 需要首先启动
package lmq.socket;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server {public static void main(String[] args) {ServerSocket serverSocket = null;try {//创建一个服务器socket,并绑定监听端口serverSocket = new ServerSocket(8888);System.out.println("************服务器已启动,等待客户端连接*************");Socket socket = null;//记录客户端的数量int count = 0;//循环监听客户端的连接while(true){//调用accept方法进行监听,等待客户端连接socket = serverSocket.accept();//创建一个线程,处理与客户端的交互SocketThread st = new SocketThread(socket);Thread thread = new Thread(st);thread.start();count++;System.out.println("当前连接的客户端数量为:"+count);}} catch (IOException e) {e.printStackTrace();}finally{try {serverSocket.close();} catch (IOException e) {e.printStackTrace();}}}}
2. SocketThread.java 线程处理类
package lmq.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.io.PrintWriter;import java.net.Socket;import lmq.entity.File;import lmq.entity.User;import lmq.service.FileService;import lmq.service.UserService;import lmq.util.CommandTransfer;public class SocketThread implements Runnable {private Socket socket = null ;private ObjectInputStream ois = null;private ObjectOutputStream oos = null;private UserService userService = new UserService();private FileService fileService = new FileService();public SocketThread(Socket socket) {this.socket = socket;}@Overridepublic void run() {try {InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();ois = new ObjectInputStream(is);oos = new ObjectOutputStream(os);CommandTransfer commandTransfer = (CommandTransfer) ois.readObject();commandTransfer = excute(commandTransfer);//执行客户端指令操作oos.writeObject(commandTransfer);} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}/** * 执行客户端指令操作 * @param commandTransfer * @return */private CommandTransfer excute(CommandTransfer commandTransfer) {String cmd = commandTransfer.getCmd();if(cmd.equals("register")){//用户注册User user = (User) commandTransfer.getData();boolean flag = userService.addUser(user);commandTransfer.setFlag(flag);if(flag){commandTransfer.setResult("注册成功,请登录!");}else{commandTransfer.setResult("注册失败");}}if(cmd.equals("login")){//用户登录User user = (User) commandTransfer.getData();boolean flag = userService.loginUser(user);commandTransfer.setFlag(flag);if(flag){commandTransfer.setResult("登陆成功!");}else{commandTransfer.setResult("登录失败");}}if(cmd.equals("upload")){File file = (File) commandTransfer.getData();boolean flag = fileService.addFile(file);commandTransfer.setFlag(flag);if(flag){commandTransfer.setResult("文件上传成功!");}else{commandTransfer.setResult("文件上传失败");}}return commandTransfer;}}
3. 客户端启动类
package lmq.socket;/** * 客户端启动类 * @author I * */public class StartClient {public static void main(String[] args) {Client client = new Client();client.showMenu();}}
4.客户端处理类 client
package lmq.socket;import java.io.BufferedInputStream;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;import java.util.Scanner;import lmq.entity.File;import lmq.entity.User;import lmq.util.CommandTransfer;public class Client {Socket socket = null;//客户端socketScanner sc = new Scanner(System.in);User user = null;File file = null;public void showMenu() {System.out.println("**************欢迎使用lmq的文件上传器************");System.out.println("注册用户:1 \n用户登录:2 \n 退出:3");System.out.println("*****************************************");System.out.print("请选择:");switch (sc.nextInt()) {case 1:doRegister();break;case 2:doLogin();break;case 3:System.out.println("谢谢,再见!");System.exit(0);default:System.out.println("输入有误!");break;}}private void doLogin() {user = new User();CommandTransfer commandTransfer = new CommandTransfer();int count = 0;while(true){count++;//三次登录if(count > 3){System.out.println("抱歉,您已经用完三次机会,请下次登录!");System.exit(0);}System.out.print("请输入用户名:");user.setUserName(sc.next());System.out.print("请输入密码:");user.setUserPwd(sc.next());commandTransfer.setData(user);commandTransfer.setCmd("login");try {socket = new Socket("localhost",8888);sendData(commandTransfer);//向服务器发送数据commandTransfer = getData();//获取服务器的数据System.out.println(commandTransfer.getResult());System.out.println("**************************");if(commandTransfer.isFlag()){break;}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally{try {socket.close();} catch (IOException e) {e.printStackTrace();}}}doUpload();}/** * 上传文件 */private void doUpload() {CommandTransfer commandTransfer = new CommandTransfer(); file = new File();while(true){InputStream is = null;BufferedInputStream bis = null;String fname = null;byte[] buffer = null;System.out.println("请选择需要上传的文件路径:例如(d:/1.jpg)");String path = sc.next();//通过输入流读取本地文件try {is = new FileInputStream(path);bis = new BufferedInputStream(is); buffer = new byte[bis.available()]; //获取文件名 fname = path.substring(path.lastIndexOf("/")+1); bis.read(buffer); //封装file数据对象 file.setFname(fname); file.setFcontent(buffer);} catch (FileNotFoundException e1) {System.out.println("文件不存在!");continue;} catch (IOException e) {e.printStackTrace();}finally{//关闭io流if(null!=bis){try {bis.close();} catch (IOException e) {e.printStackTrace();}finally{bis = null;}}if(null!=is){try {is.close();} catch (IOException e) {e.printStackTrace();}finally{is = null;}}}try {socket = new Socket("localhost",8888);commandTransfer.setData(file);commandTransfer.setCmd("upload");sendData(commandTransfer);commandTransfer = getData();System.out.println(commandTransfer.getResult());if(commandTransfer.isFlag()){break;}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {socket.close();} catch (IOException e) {e.printStackTrace();}}} System.out.println("谢谢使用文件本上传器");}private void doRegister() {user = new User();CommandTransfer commandTransfer = new CommandTransfer();while(true){System.out.print("请输入用户名:");user.setUserName(sc.next());System.out.print("请输入密码:");user.setUserPwd(sc.next());System.out.print("请再次确认密码:");String rePassword = sc.next();if(!rePassword.equals(user.getUserPwd())){System.out.println("**********两次输入的密码不一致***********");continue;}commandTransfer.setCmd("register");commandTransfer.setData(user);try {socket = new Socket("localhost", 8888);sendData(commandTransfer);//发送数据给服务器commandTransfer = getData();//获取服务器返回的数据System.out.println(commandTransfer.getResult());System.out.println("***************************");if(commandTransfer.isFlag()){break;//如果注册成功,则不再重复注册}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally{try {socket.close();} catch (IOException e) {e.printStackTrace();}}}//注册成功直接登入 doLogin();}/** * 获取服务器返回的数据 * @return */private CommandTransfer getData() {InputStream is;ObjectInputStream osi;CommandTransfer commandTransfer = null;try {is = socket.getInputStream();osi = new ObjectInputStream(is);commandTransfer= (CommandTransfer) osi.readObject();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return commandTransfer;}/** * 向服务器发送数据 * @param commandTransfer */private void sendData(CommandTransfer commandTransfer) {try {OutputStream os = socket.getOutputStream();ObjectOutputStream oos = new ObjectOutputStream(os);oos.writeObject(commandTransfer);oos.flush();} catch (IOException e) {e.printStackTrace();}}}
最关键的是util包下的CommandTransfer.java 用于客户端与服务器之间指令数据的封装
package lmq.util;import java.io.Serializable;/** * 表示客户机和服务器之间传输的指令数据 * @author I * */public class CommandTransfer implements Serializable{/** * */private static final long serialVersionUID = 1L;private Object data;//传输数据private String result;//返回结果private boolean flag;//操作是否成功private String cmd;//操作指令public CommandTransfer() {super();}public Object getData() {return data;}public void setData(Object data) {this.data = data;}public String getResult() {return result;}public void setResult(String result) {this.result = result;}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}public String getCmd() {return cmd;}public void setCmd(String cmd) {this.cmd = cmd;}}
其他数据库操作就不提了,下面是链接:
1.demo连接
2.课程链接
1 0
- 基于socket,实现用户注册,用户登录,以及文件上传的例子
- 基于TCP协议的Socket通信 实现用户登录 以及服务端的相应
- 使用php完成一个用户注册以及管理的demo(php实现单文件与多文件的上传)
- 实现PHP用户的注册与登录
- 实现PHP用户的注册与登录 .
- 用户注册与登录功能的实现
- 用户注册时上传头像的实现
- 基于Spring+CXF实现用户文件上传的WebService
- 基于ajax+php+mysql数据库实现用户注册登录
- 用户注册登录案例分析以及简单实现
- 网站用户登录注册实现
- Android实战简易教程-第二十三枪(基于Baas的用户注册和登录模块实现!)
- Android基于人脸识别的用户注册/登录实现思路
- Java 实现基于UDP的用户登录
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
- Espresso自动化测试(十三)- UiAutomator2与Espresso的结合
- 八皇后问题-回溯算法
- 杭电2955-0-1背包
- LPS最长回文子序列
- 抽象工厂模式
- 基于socket,实现用户注册,用户登录,以及文件上传的例子
- 自定义的一个App搜索框
- hdoj 1429 胜利大逃亡(续)【bfs好题】
- 匹配极其相关问题(一)
- LeetCode 1 - Two Sum ( JAVA )
- CSP考试 2013年12月第4题 C语言实现
- choice 详解
- gmtime和ctime的区别(补)
- AlertDialog 的简单用法效果图