我有一个服务器接受多个客户端连接并执行以下操作
客户端1向服务器发送一行信息,等待服务器端操作完成 客户端2将一行信息传输到服务器,等待服务器端操作完成
服务器收到来自两个客户端的信息后执行某个操作,通知两个客户端并再次进入等待状态,两个客户端都传输他们的信息行,但是有些如何用我编写的代码似乎没有以适当的方式工作。
服务器代码段:
class ServerPattern extends Thread{
@Override
public void run() {
try
{
while(moreData){
if(clientId==1){
synchronized (BaseStation.sourceAReadMonitor){
BaseStation.sourceAReadComplete = false;
SourceARead.complete();
BaseStation.sourceAReadMonitor.notifyAll();
}
}
else if(clientId==2){
BaseStation.sourceBReadComplete = false;
}
//this.wait();
synchronized(BaseStation.patternGenerationReadMonitor){
BaseStation.patternGenerationReadMonitor.wait();
}
}
}
newSock.close();
}
catch(Exception e){
e.printStackTrace();
}
}
客户端代码段:
class sReadA extends Thread {
public static void serverJobComplete(){
System.out.println("Source A Server job complete , Notifying Thread");
synchronized(BaseStation.sourceAReadMonitor){
BaseStation.sourceAReadMonitor.notifyAll();
}
}
//public void readFile(){
public void run() {
try {
while((line = br.readLine())!= null){
synchronized (BaseStation.sourceAReadMonitor){
if(BaseStation.patternGenerationComplete == true && BaseStation.sourceAReadComplete == false){
BaseStation.sourceAReadComplete = true;
BaseStation.sourceAReadMonitor.wait();
}
else if (BaseStation.sourceAReadComplete == true)
{
synchronized (BaseStation.patternGenerationReadMonitor){
BaseStation.patternGenerationReadMonitor.notifyAll();
}
}
}
}
//ToDo : Wait for ServerSide Operation to Complete, later iterate till end of file
}
catch(Exception e){
e.printStackTrace();
}
}
}
公共类SourceARead {
public static void complete(){
System.out.println("Complete Called");
sReadA.serverJobComplete();
}
public static void main(String args[]){
sReadA sAR = new sReadA(fName);
sAR.start();
}
}
答案 0 :(得分:0)
您能描述一下您面临的问题吗?
您应该使用HTTP服务器端口来满足此要求。在服务器端打开服务器类型的端口,客户端将连接到此端口。 java.net API对此很有用。
您不应该使用wait / notify来满足此要求,因为它们是线程级别控制,它们取决于JVM实现。一旦当前正在运行的线程退出等待线程,所有对象都将拥有其线程等待列表。
如果这是您的要求,请确保您正在同步正确的对象。
wait notify或notify all用于在同一JVM下运行的多个线程
BaseStation.patternGenerationReadMonitor.notifyAll();将通知等待当前对象而不是BaseStation的线程。
希望这能解决您的问题