Tcp通信实践注册登入保存文件

Tcp通信实践

注册

登入

保存文件

package com.Client;

import java.io.Serializable;
public class User implements Serializable {
/**
* 用户类 将用户setObj() 储存于CommandTransfer 传输给服务器 服务器处理 返回 commandtransfer 类型 客户端
*/
private static final long serialVersionUID = 1L;
private String username;
private String password;
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public User() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}

}

package com.Client;
import java.io.Serializable;
public class File implements Serializable{
/**
* 重写文件类 将文件转换成 文件名和文件字节组
*/
private String fname;
private byte[] fcontent;
private static final long serialVersionUID = 1L;
public File(String fname, byte[] fcontent) {
super();
this.fname = fname;
this.fcontent = fcontent;
}
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;
}
}

//启动客户端

package com.Client;
public class StartClient {
public static void main(String[] args) {
ScoketClient sc = new ScoketClient();
sc.show();
}
}

package com.Client;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
import com.Util.CommandTransfer;

//客户端   
public class ScoketClient {
private static Socket socket;
private static User user = new User();
private static CommandTransfer transfer = new CommandTransfer();
private static OutputStream os;
private static ObjectOutputStream oos;
private static InputStream is;
private static ObjectInputStream ois;
Scanner console = new Scanner(System.in);

// 客户端socket
public void socket() {
try {
socket = new Socket("localhost", 8888);
os = socket.getOutputStream();
oos = new ObjectOutputStream(os);
if (transfer != null) {
oos.writeObject(transfer);
}
is = socket.getInputStream();
ois = new ObjectInputStream(is);
transfer = (CommandTransfer) ois.readObject();
socket.shutdownInput();
}catch(ClassNotFoundException e) {
System.out.println("******* ois.readObject();*****");
}
catch (IOException e) {
e.printStackTrace();
System.out.println("fffffff");
} finally {
try {
if (is != null)
is.close();
if (oos != null)
oos.close();
if (os != null)
os.close();
if (ois != null)
ois.close();
if (socket != null)
socket.close();
} catch (IOException e) {
System.out.println("关闭IO流有误");
e.printStackTrace();
}
}
}
public void show() {
System.out.print("请输入选择\n1.注册用户\n2.登入\n3.退出\n请输入选择");
int i = console.nextInt();
switch (i) {
case 1:
register();
break;
case 2:
login();
if(transfer.isFlag())
savafile();
break;
case 3:
System.exit(0);
break;
default:
System.exit(0);
}
}

//用户端登入
public void login() {
String str = null;
int count = 0;
System.out.println("输入姓名:");
str = console.next();
user.setUsername(str);
System.out.println("输入密码");
str = console.next();
user.setPassword(str);
transfer.setCmd("login");
transfer.setObj(user);
socket();
System.out.println(transfer.getResult());
while(!transfer.isFlag()) {
System.out.println("输入姓名:");
str = console.next();
user.setUsername(str);
System.out.println("输入密码");
str = console.next();
user.setPassword(str);
transfer.setCmd("login");
transfer.setObj(user);
count++;
if(count ==2) {
System.out.println("已经错了三次,请重新登入");
break;
}
}
}

//客户端注册
public void register() {
String str = null;
System.out.println("输入姓名:");
str = console.next();
user.setUsername(str);
System.out.println("输入密码");
str = console.next();
user.setPassword(str);
transfer.setCmd("register");
transfer.setObj(user);
socket();
}

//客户端保存文件 需登入后
public void savafile() {
String str = null;
System.out.println("\n请输入上传文件路径");
str = console.next();
File file = null;
try {
String fname = str.substring(str.lastIndexOf("/") + 1);
FileInputStream fis = new FileInputStream(str);
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] fcontent = new byte[fis.available()];
bis.read(fcontent);
file = new File(fname, fcontent);
transfer.setCmd("savefile");
transfer.setObj(file);
fis.close();
bis.close();
socket();
} catch (FileNotFoundException e) {
System.out.println("文件读取有误");
e.printStackTrace();
} catch (IOException e) {
System.out.println("输入流有误");
e.printStackTrace();
}
}
}

package com.request;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.Client.File;
import com.Util.DBUtil;
// 文件请求    由服务端执行  客户端需将CommandTransfer 中cmd 修改
public class FileServer {
Connection conn;
PreparedStatement pstmt;
ResultSet rs;


public void save(File file) {
conn = DBUtil.getConnection();
String sql = "insert into tb_file(filename,filecontent) values(?,?);";
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, file.getFname());
pstmt.setBytes(2, file.getFcontent());
pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("***********");
e.printStackTrace();
} finally {
DBUtil.closeAll(conn, pstmt, rs);
}
}
}

package com.request;
//请求包 服务器端执行
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.Client.User;
import com.Util.DBUtil;
//用户请求  login() register()  由服务器执行切判断 可修改完善
public class UserServer {
Connection conn;
PreparedStatement pstmt;
ResultSet rs;
public void register(User user) {
String sql = "insert into tb_users values(?,?);";
conn = DBUtil.getConnection();
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getUsername());
pstmt.setString(2,user.getPassword());
pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("register");
e.printStackTrace();
}
finally {
DBUtil.closeAll(conn, pstmt,rs);
}
}
public boolean login(User user) {
//     ? 不能用单引号标记 会无法传参
String sql ="select *from tb_users where username=? and password=?;";
conn = DBUtil.getConnection();
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getUsername());
pstmt.setString(2, user.getPassword());
rs = pstmt.executeQuery();
if(rs.next()) {
return true;
}
} catch (SQLException e) {
System.out.println("登入时的执行sql语句出错");
e.printStackTrace();
}
finally {
DBUtil.closeAll(conn, pstmt, rs);
}
return false;
}
}

package com.Sever;
//服务器包
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

//服务器端  可支持多用户连接
public class StartServer {
public static void main(String[] args) {
try {
//1.创建服务器端
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("***服务器创建中,等待客户端链接***");
//2.得到连接上端口8888的客户端

while(true) {
Socket socket = serverSocket.accept();
if(socket!=null) {
System.out.println("链接上的客户端:"+socket.getInetAddress());
}
//3得到客户端输出流 创建服务器端输入流
ServerThread serverthread = new ServerThread(socket);
serverthread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

package com.Sever;

//此类在服务器包中

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import com.Client.File;
import com.Client.User;
import com.request.FileServer;
import com.request.UserServer;
import com.Util.CommandTransfer;

//用线程实现 多用户连接服务器
public class ServerThread extends Thread {
Socket socket = null;
InputStream is = null;
ObjectInputStream ois = null;
OutputStream os = null;
ObjectOutputStream oos = null;
UserServer userver = new UserServer();
FileServer fserver = new FileServer();
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
CommandTransfer transfer;
try {
try {
//服务器端输入流
is = socket.getInputStream();
ois = new ObjectInputStream(is);
transfer= (CommandTransfer) ois.readObject();
transfer = excute(transfer);
socket.shutdownInput();
//服务器端输出流
os = socket.getOutputStream();
oos = new ObjectOutputStream(os);
oos.writeObject(transfer);

} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
if(os!= null)
os.close();
if(oos != null)
oos.close();
if(ois != null)
ois.close();
if(is!=null)
is.close();
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public  CommandTransfer excute(CommandTransfer transfer) {
String cmd = transfer.getCmd();
if(cmd.equals("register"))
{
System.out.println(transfer.getCmd()+"**************");
User user = (User) transfer.getObj();
userver.register(user);
transfer.setResult("注册成功");
}
if(cmd.equals("login"))
{
System.out.println(transfer.getCmd()+"**************");
User user = (User) transfer.getObj();
System.out.println("login........");
boolean falg = userver.login(user);
if(falg) {
transfer.setFlag(true);
transfer.setResult("登入成功");
System.out.println("succesed........");
}
else {
transfer.setFlag(false);
transfer.setResult("登入失败检查账户密码");
}
}
if(cmd.equals("savefile")) {
System.out.println(transfer.getCmd()+"**************");
File file = (File) transfer.getObj();
fserver.save(file);
transfer.setResult("上传成功");
System.out.println("succesed........");
}
return transfer;
}
}

package com.Util;
//工具包 类
import java.io.Serializable;
//将用户请求  信息 打包封装
public class CommandTransfer implements Serializable {
/**
* 包装类
*/
private static final long serialVersionUID = 1L;
private String cmd = null;  //请求
private Object obj = null; //传输对象
private boolean flag; //是否登入成功
private String result; //服务器处理 结果
public String getCmd() {
return cmd;
}
public void setCmd(String cmd) {
this.cmd = cmd;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
}

package com.Util;
//工具包   服务端连接数据库用
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
public static Connection getConnection() {
Connection connection = null;

String url="jdbc:mysql://127.0.0.1/db_users?characterEncoding=utf8&useSSL=true";//我的数据库名为db_uses!

String name="com.mysql.jdbc.Driver";
String user="root";   //我用户为root
String password="123456"; //密码记得对应
try {
Class.forName(name);
} catch (ClassNotFoundException e) {
System.out.println("未启动数据库");
}
try {
connection = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
System.out.println("未链接数据库");
}
return connection;
}
public static void closeAll(Connection connection,Statement statement,ResultSet resultset){
try {
if(connection != null) 
connection.close();
if(statement != null)
statement.close();
if(resultset != null)
resultset.close();
} catch (SQLException e) {
System.out.println("关闭数据库连接有误");
}
}
}

猜你喜欢

转载自blog.csdn.net/lin1094201572/article/details/78942521