我有两个程序一个是服务器,另一个是客户端,我有一些其他类谁代表几何图形。在客户端用扫描器把用户写的特征形状的宽度,长度作为一个矩形的例子。他创建一个对象并将其发送给服务器,服务器接收对象计算面积和周长并将其发送给客户端。在用户在客户机中按enter键而不是按Characteristics键之前,应该会发生这种情况。我不知道为什么,但是第一个循环很好,但是第二个循环我输入了我的特征,然后什么也没有发生,我的程序卡住了。也许你能看到我的错误,这里是2个程序:
ps:我是法国人,很抱歉我的变量名称服务器使用法语:
ServerSocket sockConn = null;
Socket sockComm = null;
try{
sockConn = new ServerSocket();
InetSocketAddress isa = new InetSocketAddress(portServ);//port + wildcard.
sockConn.bind(isa);
System.out.println("Server Launched !");
int nbForme = 0;
int compteur = 0;
while(true){
sockComm = sockConn.accept();
ObjectInputStream is = new ObjectInputStream(sockComm.getInputStream());
ObjectOutputStream os = new ObjectOutputStream(sockComm.getOutputStream());
//nbForme = is.readInt();
//System.out.println("nombre de forme a traiter recu : "+nbForme);
FormeGeo forme = (FormeGeo)is.readObject();
System.out.println("Forme recu "+forme.toString());
os.writeDouble(forme.perimetre());
os.flush();
os.writeDouble(forme.aire());
os.flush();
//compteur++;
//System.out.println("Nombre de forme demande atteint");
//is.close();
//os.close();
}
我的委托人:
String ipServ = args[0];
sockComm = new Socket();
InetSocketAddress connect= new InetSocketAddress(ipServ,portServ);
sockComm.connect(connect);
// System.out.print("Entrez un nombre de forme a saisir : ");
//sc = new Scanner(System.in);
//nbForme = sc.nextInt();
//sc = null;
//System.out.println(nbForme);
//System.out.println("Envoi du nombre de forme a traiter");
//os.writeInt(nbForme);
//os.flush();
while(!line.equals("")){
System.out.println("Saisissez les valeurs d'une forme ou appuyer sur entrer pour stopper le programme");
sc = new Scanner(System.in);
line = sc.nextLine();
os = new ObjectOutputStream(sockComm.getOutputStream());
is = new ObjectInputStream(sockComm.getInputStream());
if(line.equals("")){
System.out.println("Fin du programme");
break;
}else if(!line.contains(",")){
rayon = Double.parseDouble(line);
if(rayon<=0.0){
System.out.println("Longueur du rayon doit être positive");
System.exit(2);
}
FormeGeo rond = new Rond(rayon);
os.writeObject(rond);
}else{
String[] numbers = line.split(",");
if(numbers.length==2){
longueur = Double.parseDouble(numbers[1]);
largeur = Double.parseDouble(numbers[0]);
FormeGeo rec= new Rectangle(largeur,longueur);
os.writeObject(rec);
}else{
System.out.println("Erreur trop d'arguments pour un rectangle !");
System.exit(3);
}
}
os.flush();
double perimetre = is.readDouble();
double aire = is.readDouble();
System.out.println("perimetre et aire renvoye par le serveur respectivement : "+perimetre+" et "+aire);
//compteur++;
//is.close();
}
is.close();
os.close();
1条答案
按热度按时间ijnw1ujt1#
服务器套接字执行以下操作:
等待连接发生,然后接受它(这是
sockConn.accept()
)从该连接接收请求
向该连接发送响应
等待连接发生,然后接受它。
从该连接接收请求
向该连接发送响应
...
i、 e.您的服务器每个连接只需要一个请求。
你的客户会这样做:
连接到服务器
发送请求
收到回复
发送请求
收到回复
...
当您的客户机正在等待第二个响应时,您的服务器正在等待第二个连接,因此什么也没有发生。
您可以通过执行以下操作之一来修复它:
使客户端为每个请求启动一个新连接
使服务器处理同一连接上的多个请求(而不是等待新的请求)
使服务器为每个连接启动一个新线程,以便它可以同时处理多个连接