嗨,我的程序有一个小问题,这是一个简单的客户端/服务器。客户端将文本文件的内容发送到服务器。文本文件只是整数,然后服务器假设发送回文本文件中每个int的最大素数(如果它的素数应该只发回素数而什么都不做)。所以比如说文本文件是5 15 28.运行程序后的结果应该是5 13 23。
这是我的客户端代码:
public class TCPClient {
public static void main(String[] args) throws Exception{
try{
Socket mySock = new Socket("127.0.0.1", 12001);
BufferedReader in = new BufferedReader(
new InputStreamReader(mySock.getInputStream()));
PrintStream out = new PrintStream( mySock.getOutputStream());
Scanner scan = new Scanner(new File(args[0]));
String msg = scan.nextLine();
out.println(msg);
System.out.println(in.readLine());
mySock.close();
}catch (Exception e){
}
}
}
这是我的服务器端代码:
public class TCPServer {
public static void main(String[] args) throws Exception {
try{
ServerSocket mySock = new ServerSocket(12001);
Socket client = mySock.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
PrintStream out = new PrintStream( client.getOutputStream());
String[] arr = in.readLine().split(" ");
int[] intarr = new int[arr.length];
for(int i = 0; i <arr.length; i++){
intarr[i] = Integer.parseInt(arr[i]);
if (prim(intarr[i]) == true){
out.println(intarr[i]);
}else{
while (!prim(--intarr[i])){
}
out.println(intarr[i]);
}
}
client.close();
mySock.close();
}catch (Exception e){
}
}
public static boolean prim(int m){
int n=m;
for(int i=2;i<n;i++){
if(n%i == 0){
return false;
}
}
return true;
}
}
当我运行这个程序时,我的输出只是文本文件中的第一个数字。因此,如果我的文本文件是1 3 5.我的输出只是1.但是,我的主要算法至少是有效的,因为如果我的文本文件例如是8,我的程序将返回7.有人知道为什么会发生这种情况吗?
通过将您的服务器代码更改为简单的测试并打印到System.out
String[] arr = "1 3 5 6".split(" ");
int[] intarr = new int[arr.length];
for(int i = 0; i <arr.length; i++){
intarr[i] = Integer.parseInt(arr[i]);
if (prim(intarr[i]) == true){
System.out.println(intarr[i]);
}else{
while (!prim(--intarr[i])){
}
System.out.println(intarr[i]);
}
}
您可以看到它工作正常,但在您的代码中,您的输出使用println
写入,因此您的客户端需要循环System.out.println(in.readLine());
或更改您的服务器使用一行和一些分隔符写入
在TCPServer中,当打印到outputstream时使用print而不是println
for(int i = 0; i <arr.length; i++){
intarr[i] = Integer.parseInt(arr[i]);
if (prim(intarr[i]) == true){
out.print(intarr[i]); // use print instead of println
}else{
while (!prim(--intarr[i])){
}
out.print(intarr[i]); // use print instead of println
}
}