【发布时间】:2021-02-22 22:50:12
【问题描述】:
我创建了一个基于套接字的客户端服务器应用程序......这就是它基本上必须做的...... 定义一个基于套接字的客户端服务器应用程序。服务器必须能够同时响应多个客户端。 服务器生成一个正整数值 N,用于连接的每个客户端。 连接时,客户端随机生成一个整数 M。 然后客户端向服务器M发送正整数值。 传输以发送值 -1 结束。 每次客户端完成传输时,服务器将迄今为止从所有客户端接收到的大于 N 的值的数量写入屏幕。 如有必要,管理同步问题。
这就是我设法做到的......不过我有一个疑问...... 当我运行客户端时,它会告诉我它发送了多少正整数,例如 40 ...。然后服务器会告诉我其中有多少大于客户端生成的数字 N,例如 10 ...。但是,如果我再次运行客户端,这会将大于 N 的先前整数与大于 N 的新整数相加,给我一个不正确的结果。 现在我想知道......这是正常的还是我做错了什么?
package server;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Server {
public static void main(String[] args) {
try {
ServerSocket s = new ServerSocket(5555);
int N;
N = (int)(Math.random()*100);
System.out.println("Server online, il numero N che adopera è : "+N);
Accumulatore a = new Accumulatore();
while(true){
Socket client = s.accept();
ThreadServer t = new ThreadServer(client,N,a);
t.start();
}
// TODO code application logic here
} catch (IOException ex) {
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
// TODO code application logic here
}
}
}
package server;
import java.io.*;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ThreadServer extends Thread{
Socket s ;
int M;
Accumulatore acc;
public ThreadServer(Socket s, int M, Accumulatore acc) {
this.s = s;
this.M = M;
this.acc = acc;
}
@Override
public void run(){
try {
DataInputStream data = new DataInputStream(new BufferedInputStream(s.getInputStream()));
int n;
while((n = data.readInt())!=-1){
if(n>M){
acc.incrementa();
}
}
System.out.println("Valori più grandi di "+M +" ricevuti : "+ acc.getn());
data.close(); //////diocaneeeeeeeee
s.close();
} catch (IOException ex) {
Logger.getLogger(ThreadServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
package client;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Client {
public static void main(String[] args) {
try(Socket client = new Socket("localhost",5555);
OutputStream i1 = client.getOutputStream();
DataOutputStream out = new DataOutputStream(i1);) {
int M;
M= (int)(Math.random()*100);
System.out.println("Invierò "+M+" interi positivi");
// TODO code application logic here
for(int i = 0; i<M; i++){
int l;
l = (int)(Math.random()*100);
out.writeInt(l);
out.flush();
}
out.writeInt(-1);
out.flush();
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
package server;
public class Accumulatore {
private int n = 0;
synchronized public void incrementa(){
n++;
}
public int getn(){
return n;
}
}
【问题讨论】:
-
您的描述不一致;首先你写服务器生成单个正整数值N,然后你写客户端生成的数字N。关于问题这是正常的还是我做错了什么? - 什么是正常取决于规范,程序应该做什么你必须自己知道。
-
我不明白不一致的地方,服务器生成一个整数N供每个连接的客户端使用,而客户端生成M,即它将发送到服务器的M个整数。 ..
-
那你为什么说客户端生成的数字N? N也不能由服务器和客户端生成。
标签: java sockets server client