我对Java不太满意,我想编写一个简单的客户端-服务器程序(迄今为止的书),但是我不知道如何在线程之间共享变量termins
(或我在哪里编写)错误)。任何建议都会被接受。我已经坚持了几个小时。
这是我的代码:
Termin.java:
public class Termin {
public volatile int hour;
public volatile boolean reserved = false;
public volatile String user = null;
public Termin(int hour) {
this.hour = hour;
}
public void setHour(int value) {
this.hour = value;
}
...
Server.java:
public class Server {
public static final int PORT = 4444;
public volatile static Termin[] termins = new Termin[] {
new Termin(8),
new Termin(9),
new Termin(10),
new Termin(11),
new Termin(12),
new Termin(13),
new Termin(14),
new Termin(15),
new Termin(16),
new Termin(17),
};
public static void main(String[] args) throws IOException{
Server server = new Server();
server.runServer();
}
public void runServer() throws IOException{
ServerSocket serverSocket = new ServerSocket(PORT);
System.out.println("Server up and ready for connections...");
while(true){
Socket socket = serverSocket.accept();
new ServerThread(socket).start();
}
}
}
ServerThread.java:
public class ServerThread extends Thread {
Socket socket;
ServerThread(Socket socket){
this.socket = socket;
}
public void run(){
try {
String message = null;
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("user '" + bufferedReader.readLine() + "' is now connected to the server");
while ((message = bufferedReader.readLine()) != null) {
System.out.println("incoming client message: " + message);
printWriter.println(message);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
我如何连接 Clint.java:
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException{
String name = args[0];
Socket socket = new Socket("localhost", Server.PORT);
BufferedReader bufferedReaderFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println(name);
BufferedReader bufferedReaderFromCmdPrompt = new java.io.BufferedReader(new InputStreamReader(System.in));
还有 Client.java 中的片段,我在其中更改了termins的值:
try {
String newReaderInput = bufferedReaderFromCmdPrompt.readLine();
printWriter.println(newReaderInput);
int var = Integer.parseInt(bufferedReaderFromClient.readLine());
if(var == 10 || var == 1 || var == 2 || var == 3 || var == 4 || var == 5 || var == 6 || var == 7 || var == 8 || var == 9 ) {
if(Server.termins[var].reserved == false) {
Server.termins[var-1].setReserved(true);
Server.termins[var-1].setUser(name);
System.out.println("\n\nTermin reserved.\n\n");
x=0;
} else {
System.out.println("\n\nError. Termin already booked\n\n");
}
} else {
System.out.println("\n\nError. No termin like this.!!!\n\n");
displayYourTermins(name);
}
} catch (NumberFormatException e) {
System.out.println("\n\nError. Write a number!!!\n\n");
displayYourTermins(name);
}
答案 0 :(得分:0)
您可以通过您的自定义线程类的构造函数在不同线程之间共享变量。
例如, 您的 Server.java 要使用 ServerThread.java 发送对象,您应该将此对象作为构造函数的参数传递。
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static final int PORT = 4444;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
try {
while(true) {
Socket socket = serverSocket.accept();
// Your Object that you want to share with another thread
Termin termin = new Termin(20);
// Pass objects in constructor of another thread, So that another thread can use it.
// If you want to share more than one object, then change constructor and pass it via constructor.
new ServerThread(socket, termin).start();
}
} catch(Exception e) {
System.out.println("Exception occurred in Server Program");
e.printStackTrace();
} finally {
serverSocket.close();
System.out.println("Server Program Ended");
}
}
}
如果要从 ServerThread.java 使用此对象,则应保存该对象的引用,然后可以在另一个线程中使用此对象。例如: ServerThread.java
public class ServerThread extends Thread {
private Socket socket;
private Termin termin;
public ServerThread(Socket socket, Termin termin) {
this.socket = socket;
this.termin = termin;
}
@Override
public void run() {
// Your logic...
// Here you can use termin which was passed from main thread.
// If you change termin object here, it will also affect termin object in main thread.
}
}
在这里您可以使用在主线程和ServerThread线程之间共享的termin和socket。