多线程,Java服务器/客户端项目
您好,我目前正在使用Java开发一个服务器/客户端程序,其中客户端连接到服务器并向服务器发送一个数字,然后服务器将该数字添加到全局变量并返回全局变量。 我遇到的问题是,当我有多个客户端时,一个客户端不工作,而另一个客户端工作,在后期创建的客户端工作。 我为每个客户机创建了单独的线程,并在一定程度上起作用 这是创建新线程的服务器类的片段多线程,Java服务器/客户端项目,java,multithreading,Java,Multithreading,您好,我目前正在使用Java开发一个服务器/客户端程序,其中客户端连接到服务器并向服务器发送一个数字,然后服务器将该数字添加到全局变量并返回全局变量。 我遇到的问题是,当我有多个客户端时,一个客户端不工作,而另一个客户端工作,在后期创建的客户端工作。 我为每个客户机创建了单独的线程,并在一定程度上起作用 这是创建新线程的服务器类的片段 public static Integer globalSum = 0; public static void main(String[] args) thro
public static Integer globalSum = 0;
public static void main(String[] args) throws IOException
{
ServerSocket server = new ServerSocket(8888);
Socket s;
System.out.println("Server running. Waiting for a client to connect...");
while(true) {
s = server.accept();
ThreadHandler th=new ThreadHandler(s);
Thread t=new Thread(th);
t.start();
System.out.println("Client is now connected");
}
}
这是我的客户端类
public class Client2 {
public static void main(String[] args) throws IOException {
Socket s = new Socket("localhost", 8888);
InputStream instream = s.getInputStream();
OutputStream outstream = s.getOutputStream();
Scanner in = new Scanner(instream);
Scanner input= new Scanner(System.in);
PrintWriter out = new PrintWriter(outstream);
for(int i=0;i<5;i++){
System.out.println("Please enter a value "+(i+1));
String response=input.nextLine();
String request="SUBMIT"+" "+response+"\n";
out.print(request);
out.flush();
System.out.println(in.nextLine());
}
out.print("QUIT\n");
out.flush();
s.close();
}
}
公共类客户端2{
公共静态void main(字符串[]args)引发IOException{
套接字s=新套接字(“本地主机”,8888);
InputStream instream=s.getInputStream();
OutputStream outstream=s.getOutputStream();
扫描仪输入=新扫描仪(流内);
扫描仪输入=新扫描仪(System.in);
PrintWriter out=新的PrintWriter(分流);
对于(int i=0;i你确定这件事:
private static PrintWriter out;
必须是静态的?这意味着所有线程共享您的输出流
你们有什么样的错误
为什么打印输出是静态的
不管怎样,我要换一个
public static Integer globalSum = 0;
与
并一次性获取值:
myValueAtThisTime = globalSum.addAndGet(valueInt);
也许这不是你问题的答案,但我看到了一些看起来像是一个大错误(也是很常见的错误)
我没有看到ServerInstance.globalSum的声明,但我可以猜,它是一个整数,对吗
每次指定它时,都会创建一个新对象:
ServerMultipleClients.globalSum=ServerMultipleClients.globalSum+valueInt;
这意味着,当您的代码在服务器multipleclients.globalSum
上同步时,每个线程都可能在不同的整数对象上同步。这意味着,任意数量的线程都可以同时进入“synchronized”块
无论何时编写synchronized(foo)
,您都可能希望foo成为最终变量。例如
private final Object foo = new Object();
这样,您就可以绝对确保不同的线程不会在不同的实例上同步
另请注意!如果使用同步(foo)保护静态数据,则foo本身必须是静态的。“客户端崩溃”;你能详细说明一下吗?也许是堆栈跟踪?你确定静态PrintWriter out
应该是静态的
?你真的想让所有结果都转到创建的最后一个ThreadHandler
吗?我怀疑这是你的意图。很好!谢谢
ServerMultipleClients.globalSum=ServerMultipleClients.globalSum+valueInt;
private final Object foo = new Object();