基于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
原创粉丝点击