这有点难以解释,我不得不将代码缩减到我认为重要的部分,因为它太大而无法发布。
我有一个多线程套接字服务器,它向客户端提供一些数据,一切正常,直到它收到两个或多个同时发出的请求,似乎发生的事情是请求返回的数据不正确,实际上包含一个其他请求的数据。
所以我认为这可能是由于我的主要client()方法被定义为静态,因此其中使用的变量由每个请求更新,并且是全局的,而不是仅针对每个单独的请求。
我的main方法必须声明为static,我相信服务器也应该是静态的,因为只有1个实例,但是线程请求也不能是静态的,否则会导致我现在面临的变量损坏。 / p>
问题是我无法编译它,因为client()方法抛出错误'非静态无法从静态上下文调用'。
那么如何从我的服务器线程中调用一个非静态方法,这些方法的变量有自己的范围,这些范围不是静态的,而是对每个请求进行覆盖。
正如我在开始时所说,有点难以解释,我希望我已经覆盖了它?
public static void main(String[] args) throws Exception {
try {
new Server().start();
}
}
public void client(Socket socket, int conidx){
... code
}
private static class Server {
private void start() {
..code
}
.... code
try {
Socket s = serverSocket.accept();
executorService.submit(new ServiceRequest(s));
}
class ServiceRequest implements Runnable {
... code
public void run() {
client(socket,conidx);
}
}
}
答案 0 :(得分:0)
好吧,你必须先创建主对象的实例(让我们称之为Main,因为你没有包含那段代码)。
其次,Server内部类不能是静态的,因此它存在于封闭类的上下文中:
public static void main(String[] args) throws Exception {
System.exit(run());
}
...
public int run() throws Exception {
try {
new Server().start();
}
}
...
private class /*no static here*/ Server
{
class ServiceRequest implements Runnable {
public void run() {
client(socket, conidx);
// or Main.client(socket, conidx);
...