您的位置:首页 > 理论基础 > 计算机网络

基于socket,实现用户注册,用户登录,以及文件上传的例子

2016-04-04 16:38 956 查看
观看慕课网关于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;

}

@Override
public 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;//客户端socket
Scanner 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.课程链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 网络编程