大家好,我有一个程序,用于从客户端到服务器交换消息,然后通过TCP交换。消息来自作为文件的命令行参数。该文件每行至少有一个整数,每个整数之间总是有一个空格。
这是一个示例文件:
7 3 21
23 2 8
3
每一行都被视为一条消息,因此上面的示例共有3条消息。
我的程序所做的是客户端向服务器发送一条消息(一行整数),然后服务器发回一条消息,其中包含每个数字下面的最大素数(如果数字为素数,它什么也不做,并返回该数字)。这适用于我的程序。我的问题是,在发送每一行之后,客户端必须在发送另一条消息(即文件中的另一行)之前等待服务器的响应。我无法找到如何做到这一点的解决方案,坦率地说,我不知道如何判断我的程序是否正在执行此操作(我正在使用eclipse)。我怀疑地雷没有这样做,因为我的输出全部打印在同一行,而不是像文本文件那样在单独的行上打印。这就是我的意思。
示例文件:
8 3 21
5 2 31 3
我的输出:
7 3 19 5 2 31 3
预期产出:
7 3 19
5 2 31 3
正如您所看到的,一切正常,直到发送另一行。
以下是我的3个班级的代码:
public class TCPClient {
public static void main(String[] args) throws Exception{
try{
int port = (new Integer(args[1])).intValue();
Socket mySock = new Socket(args[0], port);
Scanner in = new Scanner(
new InputStreamReader(mySock.getInputStream()));
PrintStream out = new PrintStream( mySock.getOutputStream());
Scanner scan = new Scanner(new File(args[2]));
while(scan.hasNextLine()){
String msg = scan.nextLine();
out.println(msg);
}
while(in.hasNextLine()){
System.out.println(in.nextLine());
}
mySock.close();
}catch (Exception e){
}
}
}
更多代码:
public class TCPServer {
public static void main(String[] args) throws Exception {
int port = (new Integer(args[0])).intValue();
ServerSocket socket = new ServerSocket(port);
while(true){
Socket connection = socket.accept();
PrimeFunction request = new PrimeFunction(connection);
Thread thread = new Thread(request);
thread.start();
}
}
}
最后一点代码:
final class PrimeFunction implements Runnable {
Socket socket;
public PrimeFunction (Socket socket) throws Exception{
this.socket = socket;
}
public void run() {
try{
processRequest();
}catch (Exception e){
System.out.println(e);
}
}
private void processRequest() throws Exception {
Scanner in = new Scanner(
new InputStreamReader(socket.getInputStream()));
PrintStream out = new PrintStream(socket.getOutputStream(), true);
while(in.hasNextLine()){
String[] arr = in.nextLine().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] + " ");
}
}
}
in.close();
out.close();
socket.close();
}
public static boolean prim(int m){
int n = m;
for(int i = 2; i< n/2; i++){
if(n % i == 0){
return false;
}
}
return true;
}
}
最后的想法:我不确定如何判断我的客户端在发送另一条消息之前是否等待响应。
更新了PrimeFunction类,它现在以正确的格式打印。但是,仍然不知道客户端是否正在等待。
新代码(在ProcessRequest中添加了String输出):
final class PrimeFunction implements Runnable {
Socket socket;
public PrimeFunction (Socket socket) throws Exception{
this.socket = socket;
}
public void run() {
try{
processRequest();
}catch (Exception e){
System.out.println(e);
}
}
private void processRequest() throws Exception {
Scanner in = new Scanner(
new InputStreamReader(socket.getInputStream()));
PrintStream out = new PrintStream(socket.getOutputStream(), true);
while(in.hasNextLine()){
String[] arr = in.nextLine().split(" ");
int[] intarr = new int[arr.length];
String output = "";
for(int i = 0; i <arr.length; i++){
intarr[i] = Integer.parseInt(arr[i]);
if (prim(intarr[i]) == true){
output += intarr[i] + " ";
//out.println(intarr[i] + " ");
}else{
while (!prim(--intarr[i])){
}
output += intarr[i] + " ";
//out.println(intarr[i] + " ");
}
}
out.println(output);
output = "";
}
in.close();
out.close();
socket.close();
}
public static boolean prim(int m){
int n = m;
for(int i = 2; i < n / 2; i++){
if(n % i == 0){
return false;
}
}
return true;
}
}