一个刚刚开始写代码的新手,做了一个界面,用到了一些最近学到的知识,socket编程,多线程以及序列化,还有很多不足之处,希望大伙们给点建议点拨一下。
Client类
package com.gem.fruitNet;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost", 9997);
Scanner sc = new Scanner(System.in);
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
FruitService fs = FruitService.getFruitService();
topmenu(sc, reader, writer);
reader.close();
writer.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void topmenu(Scanner sc, BufferedReader reader, BufferedWriter writer) throws IOException {
String line1 = reader.readLine();
String line2 = reader.readLine();
String line3 = reader.readLine();
String line4 = reader.readLine();
String line5 = reader.readLine();
String line6 = reader.readLine();
String line7 = reader.readLine();
String line8 = reader.readLine();
String line9 = reader.readLine();
System.out.println(line1);
System.out.println(line2);
System.out.println(line3);
System.out.println(line4);
System.out.println(line5);
System.out.println(line6);
System.out.println(line7);
System.out.println(line8);
System.out.println(line9);
int num = Integer.parseInt(sc.nextLine().trim());
switch (num) {
case 1://展示所有水果信息
showAllFruits(sc, reader, writer);
break;
case 2://添加水果信息
addFruit(sc, reader, writer);
break;
case 3://查看特定水果信息
showByname(sc, reader, writer);
break;
case 4://水果下架
deleteFruit(sc, reader, writer);
break;
case 5://按照价格升序展示
writer.write("5\n");
writer.flush();
String line = reader.readLine();
for (int i = 0; i < Integer.parseInt(line); i++) {
System.out.println(reader.readLine());
}
topmenu(sc, reader, writer);
break;
case 6://6.退出
writer.write("6\n");
writer.flush();
System.exit(0);
break;
default:
break;
}
}
private static void deleteFruit(Scanner sc, BufferedReader reader, BufferedWriter writer) throws IOException {
writer.write("4\n");
writer.flush();
System.out.println(reader.readLine());
String name = sc.nextLine().trim();
writer.write(name + "\n");
writer.flush();
System.out.println(reader.readLine());
topmenu(sc, reader, writer);
}
private static void showByname(Scanner sc, BufferedReader reader, BufferedWriter writer) throws IOException {
writer.write("3\n");
writer.flush();
System.out.println(reader.readLine());
String name = sc.nextLine().trim();
writer.write(name + "\n");
writer.flush();
System.out.println(reader.readLine());
System.out.println(reader.readLine());
topmenu(sc, reader, writer);
}
private static void addFruit(Scanner sc, BufferedReader reader, BufferedWriter writer) throws IOException {
writer.write("2\n");
writer.flush();
System.out.println(reader.readLine());
String name = sc.nextLine().trim();
writer.write(name + "\n");
writer.flush();
System.out.println(reader.readLine());
double price = Double.parseDouble(sc.nextLine().trim());
writer.write(price + "\n");
writer.flush();
System.out.println(reader.readLine());
int num1 = Integer.parseInt(sc.nextLine().trim());
writer.write(num1 + "\n");
writer.flush();
System.out.println(reader.readLine());
String remarks = sc.nextLine().trim();
writer.write(remarks + "\n");
writer.flush();
System.out.println(reader.readLine());
topmenu(sc, reader, writer);
}
private static void showAllFruits(Scanner sc, BufferedReader reader, BufferedWriter writer) throws IOException {
writer.write("1\n");
writer.flush();
String line = reader.readLine();//读到水果个数
for (int i = 0; i < Integer.parseInt(line); i++) {
System.out.println(reader.readLine());
}
topmenu(sc, reader, writer);
}
}
Fruit类:
package com.gem.fruitNet;
import java.io.Serializable;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class Fruit implements Serializable {
private int id;
private String name;
private double price;
private int num;
private String remarks;
public static int fid = 0000;
public Fruit(String name, double price, int num, String remarks) {
super();
this.id = fid++;
this.name = name;
this.price = price;
this.num = num;
this.remarks = remarks;
}
@Override
public String toString() {
return name + "\t" + price + "\t" + num + "\t" + remarks;
}
}
FruitService类:
package com.gem.fruitNet;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class FruitService {
private ArrayList<Fruit> fruitList = new ArrayList<Fruit>();
private static FruitService fs = new FruitService();
private FruitService() {
fruitList = SerializableUtil.FileToList("fruitNet\\msg.txt");
Fruit.fid = 1000 + fruitList.size();
if (fruitList.size() == 0) {
fruitList.add(new Fruit("黄瓜", 1, 30, "好!"));
fruitList.add(new Fruit("西瓜", 2, 50, "好吃"));
fruitList.add(new Fruit("香蕉", 3, 110, "海南香蕉,香蕉中的战斗焦!"));
fruitList.add(new Fruit("苹果", 5, 130, "山东红富士,味道杠杠的!"));
fruitList.add(new Fruit("葡萄", 6, 90, "不错!"));
SerializableUtil.listToFile(fruitList, "fruitNet\\msg.txt");
}
}
public static FruitService getFruitService() {
return fs;
}
//展示所有水果信息
public ArrayList<Fruit> showAllFruits() {
Collections.sort(fruitList, new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
return Integer.valueOf(o1.getId()).compareTo(o2.getId());
}
});
return fruitList;
}
//添加水果信息
public synchronized void addFruit(Fruit newFruit) {
for (Fruit fruit : fruitList) {
if (fruit.getName().equals(newFruit.getName())) {
System.out.println("添加的水果重名了!添加失败!");
}
}
fruitList.add(newFruit);
SerializableUtil.listToFile(fruitList, "fruitNet\\msg.txt");
System.out.println("添加成功");
}
//查看特定水果信息
public String showByName(String name) {
for (Fruit fruit : fruitList) {
if (fruit.getName().equals(name)) {
System.out.println("名称\t价格\t库存\t备注");
return fruit.toString();
}
}
return "查找的水果不存在!";
}
//水果下架
public synchronized String deleteFruit(String name) {
for (int i = 0; i < fruitList.size(); i++) {
if (fruitList.get(i).getName().equals(name)) {
fruitList.remove(i);
SerializableUtil.listToFile(fruitList, "fruitNet\\msg.txt");
return "下架成功!";
}
}
return "下架失败!";
}
//按照价格升序展示
public ArrayList<Fruit> showByPriceUp() {
Collections.sort(fruitList, new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
if (Double.valueOf(o1.getPrice()).compareTo(o2.getPrice()) == 0) {
return Integer.valueOf(o1.getNum()).compareTo(o2.getNum());
}
return Double.valueOf(o1.getPrice()).compareTo(o2.getPrice());
}
});
return fruitList;
}
}
SerializableUtil类:
package com.gem.fruitNet;
import java.io.*;
import java.util.ArrayList;
public class SerializableUtil {
//将对象集合写到文件中,序列化 (T泛型),用泛型统一模板
public static <T> void listToFile(ArrayList<T> list, String filename) {
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream(filename));
objectOutputStream.writeObject(list);//将集合写到文件,序列化
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (objectOutputStream != null) {
try {
objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//将文件内存读成对象集合,反序列化
@SuppressWarnings("unchecked")
public static <T> ArrayList<T> FileToList(String filename) {
ArrayList<T> list = null;
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new FileInputStream(filename));
list = (ArrayList<T>) inputStream.readObject();
return list;//正常情况
} catch (FileNotFoundException e) {
//文件不存在
list = new ArrayList<T>();
File file = new File(filename);
try {
file.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
} //创建文件
} catch (IOException e) {
list = new ArrayList<T>();
e.printStackTrace();
} catch (ClassNotFoundException e) {
list = new ArrayList<T>();
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return list;
}
}
Server类:
package com.gem.fruitNet;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(9997);
Socket socket = null;
while (true) {
socket = serverSocket.accept();
ServerThread serverThread = new ServerThread(socket);
new Thread(serverThread).start();
}
}
}
ServerThread类:
package com.gem.fruitNet;
import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
public class ServerThread implements Runnable {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
String string = "======================\n1.展示所有水果信息\n2.添加水果信息\n3.查看特定水果信息\n4.水果下架\n5.按照价格升序展示\n6.退出\n======================\n请选择:\n";
BufferedWriter writer = null;
BufferedReader reader = null;
try {
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
FruitService fs = FruitService.getFruitService();
menu(writer, reader, string, fs);
writer.close();
reader.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private void menu(BufferedWriter writer, BufferedReader reader, String string, FruitService fs) throws IOException {
writer.write(string);
writer.flush();
String choice = reader.readLine();
switch (choice) {
case "1":
showAllFruits(reader, writer, string, fs);
break;
case "2":
addFruit(reader, writer, string, fs);
break;
case "3":
showByname(reader, writer, string, fs);
break;
case "4":
writer.write("请输入您要查找的水果名称:\n");
writer.flush();
String name = reader.readLine();
writer.write(fs.deleteFruit(name) + "\n");
writer.flush();
menu(writer, reader, string, fs);
break;
case "5":
ArrayList<Fruit> fruits = fs.showByPriceUp();
writer.write(fruits.size() + "\n");
writer.flush();
for (int i = 0; i < fruits.size(); i++) {
writer.write(fruits.get(i) + "\n");
}
writer.flush();
menu(writer, reader, string, fs);
break;
case "6":
break;
default:
break;
}
}
private void showByname(BufferedReader reader, BufferedWriter writer, String string, FruitService fs)
throws IOException {
writer.write("请输入您要查找的水果名称:\n");
writer.flush();
String name = reader.readLine();
writer.write("名称\t价格\t库存\t备注\n");
writer.write(fs.showByName(name) + "\n");
writer.flush();
menu(writer, reader, string, fs);
}
private void addFruit(BufferedReader reader, BufferedWriter writer, String string, FruitService fs)
throws IOException {
writer.write("请输入您要添加的水果名称:\n");
writer.flush();
String name = reader.readLine();
writer.write("请输入您要添加的水果价格:\n");
writer.flush();
double price = Double.parseDouble(reader.readLine());
writer.write("请输入您要添加的水果数量:\n");
writer.flush();
int num = Integer.parseInt(reader.readLine());
writer.write("请输入您要添加的水果备注:\n");
writer.flush();
String remarks = reader.readLine();
Fruit newFruit = new Fruit(name, price, num, remarks);
fs.addFruit(newFruit);
writer.write("添加成功!\n");
writer.flush();
menu(writer, reader, string, fs);
}
private void showAllFruits(BufferedReader reader, BufferedWriter writer, String string, FruitService fs)
throws IOException {
ArrayList<Fruit> fruits = fs.showAllFruits();
writer.write(fruits.size() + "\n");
writer.flush();
for (int i = 0; i < fruits.size(); i++) {
writer.write(fruits.get(i) + "\n");
}
writer.flush();
menu(writer, reader, string, fs);
}
}