一道题了解IO流和网络编程问题
1、服务器端
package com.atclass.lasttest05;
import java.net.ServerSocket;
import java.net.Socket;
public class TestServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(1313);
while (true) {
Socket socket = serverSocket.accept();//相当于监控器(监控接收)
ServerThread serverThread=new ServerThread(socket);
serverThread.start();//线程开启
}
}catch (Exception e){
e.printStackTrace();
}
}
}
package com.atclass.lasttest05;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.List;
public class ServerThread extends Thread {
/**
* 当一个类中想要引用另一个(another)类时候,建议把another做成该类的属性,
* 之后便于使用;
*/
private Socket socket;
ServerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//①接收从客户端输入;
ObjectInputStream ois =
new ObjectInputStream(socket.getInputStream());
MyData myData = (MyData) ois.readObject();
//没有确认命令的时候不能确定是否泛型指的是User类型;所以直接创建
// 一个没有泛型的去接收客户端信息;
socket.shutdownInput();
//输入结束;
//②创建输入的条件判断;并为提供给需要返回给客户端信息;
MyData returnData = new MyData();
if (myData.getOrder().equals("login")) {
MyData<User> myData1 = (MyData<User>) myData; //确认泛型指的是user
// 时候可以直接创建MyData类型去接收之前接收到的并存入程序中的信息
// (需要将之前的信息强转成泛型为User的MyData类型)
User user = myData1.getData();//调用myData1的data属性;
//从硬盘文件中获取信息,并与客户端输入信息进行比较;
// 并将信息返回给returnData;
TestServerInputContent testServer1 =
new TestServerInputContent();
List<User> list = testServer1.getAllClients();
boolean flag = false;
//遍历list来查询匹配;
for (User user1 : list) {
if (user1.getName().equals(user.getName())
&& user1.getPassword().equals(user.getPassword())) {
flag=true;
break;
}
}
//返回信息给returnData;
if (flag) {
returnData.setInfo("登录成功!");
returnData.setFlag(true);
} else {
returnData.setInfo("密码或者用户名输入有误,请重新输入");
returnData.setFlag(false);
}
//③为客户端输出信息;
ObjectOutputStream oos =
new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(returnData);
oos.flush();
oos.close();
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、客户端
package com.atclass.lasttest05;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;
public class TestClient {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
boolean flag;
try {
do {
flag=false;
//①创建与服务器的连接;给出IP地址和端口;
Socket socket = new Socket("localhost", 1313);
//②对服务器进行信息传输;
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
MyData<User> myData=new MyData<>();
User user=new User();
System.out.println("请输入用户名:");
user.setName(input.next());
System.out.println("请输入密码:");
user.setPassword(input.next());
myData.setOrder("login");
myData.setData(user);
oos.writeObject(myData);
oos.flush();//清除程序空间;(输出后需要使用)
socket.shutdownOutput();
//③信息传输结束;
//④从服务器接收信息开始;
ObjectInputStream ois=
new ObjectInputStream(socket.getInputStream());
//存储从服务器接收的信息;
MyData<User> myData1=(MyData<User>) ois.readObject();
//循环判断
if (!myData1.isFlag()){
flag=true;
}
//输出服务器送来的判断信息;
System.out.println(myData1.getInfo());
ois.close();
socket.close();
} while (flag);
System.out.println("程序结束!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3、各个类
package com.atclass.lasttest05;
import java.io.Serializable;
public class User implements Serializable {
private String name;
private String password;
public User() {
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
package com.atclass.lasttest05;
import java.io.Serializable;
public class MyData<T> implements Serializable {
//该处的泛型T是为了方便以后对代码的扩展;遵循开闭原则(对修改关闭,对扩展开放)
//Serializable接口是为了实现序列化;
private String order;
private T data;
private boolean flag;
private String info;
public MyData() {
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}