先写总结:
本次项目遇到的问题:
1.Object所读/写的对象忘记序列化
2.如果一端使用Object读写对象,必须另一端也使用
3.修改有关Object读写时,必须将所有出现的地方都修改后再调试
修改内容:
将服务器和客户端实现了真正的面向对象
便于扩展功能
package SocketS;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import Cards.Cards;
import Cards.CardsDao;
import User.Users;
import User.UsersDao;
/**
* 服务的操作
*
* @author Administrator
*
*/
public class ServerDao {
UsersDao ud = new UsersDao();
File file = new File("D:\\Users.txt");
HashMap<String, Users> users = new HashMap<>();
/**
* 服务器接收Client发来的注册信息。并且将用户信息保存到文件中
* 暗
* @param bufferedReader
* @param socket
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public Users isRegistCheck(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
Users u = (Users)objectInputStream.readObject();
// 将读取的User对象写入文件中
PrintWriter printWriter = new PrintWriter(new FileOutputStream(file,true));
printWriter.println(u);
printWriter.flush();
return u;
}
/**
* 检查登录信息是否正确 ,
* @param bufferedReader2
*
* @param socket
* @return 返回登录的对象
* @throws IOException
* @throws ClassNotFoundException
*/
public Users isLoginCheck(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
String str = objectInputStream.readUTF();
String[] str3= str.split(":", 2);
for (String name : users.keySet()) {
if (name.equals(str3[0]) && users.get(name).getAge()==Integer.parseInt(str3[1])) {
return users.get(name);
}
}
return null;
}
private Cards[] getCards(String choiceCards, ObjectOutputStream objectOutputStream){
CardsDao cardsDao = new CardsDao();
if ("1".equals(choiceCards)) {
Cards card = cardsDao.once();
return new Cards[]{card};
}else if ("2".equals(choiceCards)) {//10连
Cards[] cards = new Cards[10];
for (int i = 0; i < 10; i++) {
cards[i] = cardsDao.once();
}
return cards;
}
return null;
}
/**
* 服务器接收用户传来的操作信息提供菜单
*
* @param socket
* @throws IOException
* @throws ClassNotFoundException
*/
public void Menu(Socket socket) throws IOException, ClassNotFoundException {
//服务器启动时,将文件中的Users信息加载到User集合中
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String userStr= bufferedReader.readLine();
while (userStr!=null) {
String[] str3= userStr.split(":", 2);
users.put(str3[0], new Users(str3[0], Integer.parseInt(str3[1])));
userStr= bufferedReader.readLine();
}
// 先处理玩家发来的注册登录选项
InputStream in = socket.getInputStream();
// Scanner sc = new Scanner(in);
ObjectInputStream objectInputStream = new ObjectInputStream(in);
byte[] by = new byte[10];
in.read(by, 0, by.length);
String str = new String(by);
String str1 = "1";
String str2 = "2";
System.out.println(str);
str =str.trim();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
Users u2 = null;
if (str1.equals(str)) { // 登录
objectOutputStream.writeUTF("请输入登录信息");
objectOutputStream.flush();
u2= isLoginCheck(objectInputStream);
} else if (str2.equals(str)) {//
objectOutputStream.writeUTF("请输入注册信息");
objectOutputStream.flush();
Users u = isRegistCheck(objectInputStream);
users.put(u.getName(), u);
u2= isLoginCheck(objectInputStream);
}
// objectOutputStream.writeObject(u2);
// objectOutputStream.flush();
while (true) {
//获取玩家的选择抽卡方式
byte[] by2 = new byte[10];
objectInputStream.read(by2, 0, by2.length);
String choiceCards = new String(by2);
choiceCards = choiceCards.trim();
if (!choiceCards.equals("0")) {
//调取抽卡游戏:
Cards[] cards = getCards(choiceCards, objectOutputStream);
//将卡牌存入对象卡包中
ArrayList<Cards> arr = new ArrayList<>(Arrays.asList(cards));
// Users uu = u2;
u2.getMyCards().addAll(arr);
// for (Cards cards2 : u2.getMyCards()) {
// System.out.println(cards2.getName());
// }
// objectOutputStream.flush();
objectOutputStream.writeObject(cards);
objectOutputStream.flush();
}else{
objectOutputStream.writeObject(users);
socket.close();
break;
}
}
}
}
客户端
package SocketS;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.HashMap;
import java.util.Scanner;
import org.apache.log4j.Logger;
import com.sun.security.ntlm.Client;
import Cards.Cards;
import User.Users;
import User.UsersDao;
/**
* 客户端调用登录/注册 后绑定用户操作
*
* @author Administrator
*
*/
public class Cilent {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 11536);
Menu(socket);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 客户端执行流程
* @param socket
* @throws IOException
* @throws ClassNotFoundException
*/
private static void Menu(Socket socket) throws IOException, ClassNotFoundException {
Scanner sc = new Scanner(System.in);
OutputStream outputStream = socket.getOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
// PrintWriter printwriter = null;
// BufferedReader bufferedReader = null;
ObjectInputStream objectInputStream = null;
String choice;
String name = null;
do {
System.out.println("请您选择:1.老用户立即登录 2.新用户注册即玩\n" + "请输入正确的数,输入0退出系统");
choice = sc.next();
System.out.println(choice);
// 先传入玩家的操作选项
if (Integer.parseInt(choice) > 0 && Integer.parseInt(choice) < 3) {
byte[] by = choice.getBytes();
outputStream.write(by, 0, by.length);
outputStream.flush();
// socket.shutdownOutput();
}
// bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
objectInputStream = new ObjectInputStream(socket.getInputStream());
System.out.println(objectInputStream.readUTF());
switch (choice) {
case "0":
System.exit(0);
break;
case "1":
name= ClientLogin(objectOutputStream,sc);
break;
case "2":
ClientRegist(objectOutputStream);// 注册
name =ClientLogin(objectOutputStream,sc);
break;
}
} while (Integer.parseInt(choice) > 3 || Integer.parseInt(choice) < 1);
// Users u = (Users) objectInputStream.readObject();
// Users u = null;
while (true) {
//登录完成!
//获取服务器传来的消息!
System.out.println("请选择:1.单抽过过瘾!2.10连抽任性 0.退出");
String choiceCards = sc.next();
if ("0".equals(choiceCards)) {
byte[] by = choiceCards.getBytes();
objectOutputStream.write(by);
objectOutputStream.flush();
break;
}
byte[] by = choiceCards.getBytes();
objectOutputStream.write(by);
objectOutputStream.flush();
// socket.shutdownInput();
Cards[] cards= (Cards[]) objectInputStream.readObject();
// System.out.println("===============================");
// for (Cards cards : uu.getMyCards()) {
// System.out.println(cards.getName()+" ");
// }
//
//抽卡日志信息保存到文件
Logger logger = Logger.getLogger(Client.class);
StringBuffer str = new StringBuffer();
for (int i = 0; i < cards.length; i++) {
str.append(cards[i].getName()+" ");
}
logger.info(name+":"+str.toString());
// System.out.println(str.toString());
}
HashMap<String, Users> users = (HashMap<String, Users>) objectInputStream.readObject();
Users thisu = users.get(name);
System.out.println("===============================");
for (Cards cards : thisu.getMyCards()) {
System.out.println(cards.getName()+" ");
}
socket.close();
}
/**
* 客户端用户注册//注册,并将对象通过对象写出到网络流中
*
* @param socket
* @throws IOException
*/
private static void ClientRegist(ObjectOutputStream objectOutputStream) throws IOException {
UsersDao uersDao = new UsersDao();
Users u = uersDao.UserRegister();
objectOutputStream.writeObject(u);
objectOutputStream.flush();
// socket.shutdownOutput();
}
private static String ClientLogin(ObjectOutputStream objectOutputStream,Scanner sc){
String name = null;
int age = 0 ;
while (true) {
try {
System.out.println("请输入昵称");
name = sc.next();
System.out.println("请输入年龄");
age = sc.nextInt();
break;
} catch (Exception e) {
System.err.println("您的输入不合法,请重新输入");
e.printStackTrace();
}
}
String checkstr = name+":"+age;
//将字符串传入网络流后对服务器的文件进行判断
try {
objectOutputStream.writeUTF(checkstr);
objectOutputStream.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return name;
}
}