gpt4 book ai didi

java - 我如何使用从服务器到客户端的列表

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:32 25 4
gpt4 key购买 nike

我正在为飞机问题(学校)创建服务器和客户端。

问题是我如何使用带有Java套接字的列表,以便客户端能够在飞机上选择某个座位(如果有)。

通过使用案例,客户可以查看哪些座位可用,但是我不确定是否有更好的方法来解决此问题

// It contains two classes : Server and ClientHandler 
// Save file as Server.java

import java.io.*;
import java.text.*;
import java.util.*;
import java.net.*;

// Server class
public class Server
{
public static void main(String[] args) throws IOException
{
// server is listening on port 5056
ServerSocket ss = new ServerSocket(5056);

// running infinite loop for getting
// client request
while (true)
{
Socket s = null;

try
{
// socket object to receive incoming client requests
s = ss.accept();

System.out.println("A new client is connected : " + s);

// obtaining input and out streams
DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());

System.out.println("Assigning new thread for this client");

// create a new thread object
Thread t = new ClientHandler(s, dis, dos);

// Invoking the start() method
t.start();

}
catch (Exception e){
s.close();
e.printStackTrace();
}
}
}
}

// ClientHandler class
class ClientHandler extends Thread
{
DateFormat fordate = new SimpleDateFormat("yyyy/MM/dd");
DateFormat fortime = new SimpleDateFormat("hh:mm:ss");
final DataInputStream dis;
final DataOutputStream dos;
final Socket s;


// Constructor
public ClientHandler(Socket s, DataInputStream dis, DataOutputStream dos)
{
this.s = s;
this.dis = dis;
this.dos = dos;
}

@Override
public void run()
{
String received;
String toreturn;
while (true)
{
try {

// Ask user what he wants
dos.writeUTF("What do you want?[Date | Time]..\n"+
"Type Exit to terminate connection.");

// receive the answer from client
received = dis.readUTF();

if(received.equals("Exit"))
{
System.out.println("Client " + this.s + " sends exit...");
System.out.println("Closing this connection.");
this.s.close();
System.out.println("Connection closed");
break;
}

// creating Date object
Date date = new Date();

// write on output stream based on the
// answer from the client
switch (received) {

case "Date" :
toreturn = fordate.format(date);
dos.writeUTF(toreturn);
break;

case "Time" :
toreturn = fortime.format(date);
dos.writeUTF(toreturn);
break;
case "Seat" :
toreturn=

default:
dos.writeUTF("Invalid input");
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}

try
{
// closing resources
this.dis.close();
this.dos.close();

}catch(IOException e){
e.printStackTrace();
}
}
}

最佳答案

如果要将列表从服务器发送到客户端,则可以使用java对象序列化,如下所示:

您可以使用这样的类来存储仍然可用的座位。重要的部分是该类必须实现接口Serializable

package serializeList;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Seats implements Serializable {

//recommended for serializable classes (but not needed)
private static final long serialVersionUID = -2916554242169592691L;

private List<String> availableSeats;

public Seats(List<String> availableSeats) {
this.availableSeats = availableSeats;
}

public static Seats findAvailableSeats() {
List<String> seats = new ArrayList<String>();
//TODO find the avialable seats somehow...
return new Seats(seats);
}

public List<String> getAvailableSeats() {
return availableSeats;
}
public void setAvailableSeats(List<String> availableSeats) {
this.availableSeats = availableSeats;
}
}


然后,您可以像这样更改服务器代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

// ClientHandler class
class ClientHandler extends Thread {

DateFormat fordate = new SimpleDateFormat("yyyy/MM/dd");
DateFormat fortime = new SimpleDateFormat("hh:mm:ss");
final DataInputStream dis;
final DataOutputStream dos;
final Socket s;
ObjectOutputStream oos;

// Constructor
public ClientHandler(Socket s, DataInputStream dis, DataOutputStream dos) {
this.s = s;
this.dis = dis;
this.dos = dos;
try {
this.oos = new ObjectOutputStream(dos);
}
catch (IOException e) {
e.printStackTrace();
}
}

@Override
public void run() {
String received;
String toreturn;
while (true) {
try {

// Ask user what he wants
dos.writeUTF("What do you want?[Date | Time]..\n" + "Type Exit to terminate connection.");

// receive the answer from client
received = dis.readUTF();

if (received.equals("Exit")) {
System.out.println("Client " + this.s + " sends exit...");
System.out.println("Closing this connection.");
this.s.close();
System.out.println("Connection closed");
break;
}

// creating Date object
Date date = new Date();

// write on output stream based on the
// answer from the client
switch (received) {

case "Date":
toreturn = fordate.format(date);
dos.writeUTF(toreturn);
break;

case "Time":
toreturn = fortime.format(date);
dos.writeUTF(toreturn);
break;
case "Seat":
Seats seatsToReturn = Seats.findAvailableSeats();
oos.writeObject(seatsToReturn);
default:
dos.writeUTF("Invalid input");
break;
}
}
catch (IOException e) {
e.printStackTrace();
}
}

try {
// closing resources
this.dis.close();
this.dos.close();

}
catch (IOException e) {
e.printStackTrace();
}
}
}


当然,您必须在客户端添加一些更改。可能是这样的:

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class SeatClient {

private DataOutputStream dos;
private ObjectInputStream ois;

public SeatClient() {
//TODO create the object input stream (from your socket streams)
//TODO also create the data output stream to send to the server
}

public void getSeats() {
String toSend = "Seat";
try {
dos.writeUTF(toSend);//to let the server know you want to know the available seats
Seats seats = (Seats) ois.readObject();//assuming that the next received object is from type Seats
//TODO do something useful with the seats...
}
catch (IOException e) {
e.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}


因此,现在您可以将可用席位列为客户列表。如果您不希望列表包含字符串,那么只要通用类型(替换字符串的类型)还实现了Serializable(许多诸如List,String和许多als这样的类),这也是可能的。

关于java - 我如何使用从服务器到客户端的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56446116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com