2017-04-14 84 views
0

下面我有我的服务器代码在这里:服务器不发送回一个确认信息给客户

public void startServer() { 
     ServerSocket listener = selectUnusedPortFromRange(1024, 65535); 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        String command = null; 
        while (true) { 
         Socket socket = listener.accept(); 
         System.out.println("Got a connection from: " + socket.getLocalPort()); 
         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         command = in.readLine(); 
         System.out.println("GOT HERE"); //Not being printed out 
         if (command != null && !"".equals(command)) { 
          if ("connection".equals(command)) { 
           Writer writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
           writer.write("success\n"); 
           writer.flush(); 
          } 
         } 
        } 
       } 
      } 
     } 
     t.start(); 
} 

这是我的客户端:

public void makeConnection() { 
    try { 
     Socket socket = new Socket(IP, PORT); 
     Writer writer = new PrintWriter(socket.getOutputStream(), true); 
     writer.write("connection\n"); 
     BufferedReader socketRead = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     String str; 
     while ((str = socketRead.readLine()) != null) { 
      if ("success".equals(str)) { 
       System.out.println("Successfully saved all hosts to: " + listOfHosts.get(i)); 
       socketRead.close(); 
       socket.close(); 
       iStream.close(); 
       writer.close(); 
      } 
     } 
    }catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 

在客户端后,我创造我插座连接到服务器我写入“连接”到套接字的outputStream,并等待服务器回应确认成功。出于某种原因,连接不会发送到服务器。在服务器System.out.println("Got a connection from: " + socket.getLocalPort());这一行没有被打印出来。

有没有什么问题,我正在做。我无法发现它。当我尝试连接到我的服务器时,我没有收到异常。

+0

进行仔细的检查...你的客户端是否使用服务器绑定的同一端口?我不知道'selectUnusedPortFromRange()'做了什么,但我的猜测是它绑定到指定范围内的一个随机未使用的端口?确保你的客户知道它绑定到哪个端口。 – SnakeDoc

+0

@cricket是的,我刚刚注意到并改变了它。那是我的打字错误。我已经将其更改为我的帖子中的正确代码。 – CapturedTree

+1

看过这个吗? https://docs.oracle.com/javase/tutorial/networking/sockets/readingWriting.html –

回答

1

1)请确保您为客户端和服务器使用相同的端口。他们必须通过同一个端口进行通信。看来你可能正在使用不同的端口。

2)确保你真的开始你的服务器线程。按照上面的代码,您创建了一个新线程,但从未启动它。必须在某处调用t.start()

3)如果这是在您的本地机器上,最好使用localhost而不是实际的IP地址。防火墙可能会以不同方式处理您的外部IP

4)使用换行符(如\n)终止您的消息,以便您的BufferedReader可以使用它的readLine()方法。为了更好的衡量,还需要刷新作者的缓冲区,以防万一换行符没有触发。 writer.flush();

最后,确保在尝试再次运行代码之前终止JVM。你的代码没有关闭机制来解除服务器与端口的绑定...所以你可能会得到一个异常,告诉你端口和/或地址已经被使用了。如果发生这种情况,请更改端口,或终止在后台运行的java进程。

这里是你的代码,稍作修改后在我的系统上运行。它按照您的预期工作。我试图尽可能少地改变它以使其在我的系统上运行。一本笔记,我硬编码的端口号为服务器和客户端 - 这不是必需的,这只是便于我与测试:

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.io.Writer; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Test { 
    public static void main(String[] args) throws IOException { 
     Test test = new Test(); 
     test.startServer(); 
     test.makeConnection(); 
    } 

    public void startServer() throws IOException { 
     final ServerSocket listener = new ServerSocket(60001); 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        String command = null; 
        while (true) { 
         Socket socket = listener.accept(); 
         System.out.println("Got a connection from: " + socket.getLocalPort()); 
         BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
         command = in.readLine(); 
         System.out.println("GOT HERE"); 
         if (command != null && !"".equals(command)) { 
          if ("connection".equals(command)) { 
           Writer writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
           writer.write("success\n"); 
           writer.flush(); 
          } 
         } 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
     t.start(); 
    } 

    public void makeConnection() { 
     System.out.println("Making Connection");; 
     try { 
      Socket socket = new Socket("localhost", 60001); 
      Writer writer = new PrintWriter(socket.getOutputStream(), true); 
      writer.write("connection\n"); 
      writer.flush(); 
      BufferedReader socketRead = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String str; 
      while ((str = socketRead.readLine()) != null) { 
       if ("success".equals(str)) { 
        System.out.println("Successfully saved all hosts to: "); //+ listOfHosts.get(i)); 
        socketRead.close(); 
        socket.close(); 
        //iStream.close(); 
        writer.close(); 
       } 
      } 
     }catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 
    } 

} 
+0

OMG非常感谢。数字1被排除,数字2我忘了在我的问题(我的输入错误)中添加't.start()',对此感到遗憾,数字3(没有防火墙),数字4是主要的东西,你的示例代码有帮助很多。谢谢!! – CapturedTree

+1

@ 1290很高兴你的工作。快乐编码! :) – SnakeDoc

+0

现在还有一个问题....在我的服务器'writer.write(“success \ n”);'部分没有被发送回客户端。它进入'if(“connection”.equals(command)){}块,但它不会发回'writer.write(“success \ n”);'。 – CapturedTree

1

我面对完全一样的问题。我通过使用ACK机制克服了它(这不是我的想法,而是我建议的)。这个想法是,客户端会向服务器发送请求,并且保持套接字连接处于活动状态(并且输出流打开),直到服务器通过相同的通道响应同意的ACK消息。客户端收到ACK消息后,才会关闭连接。

下面是服务器的代码: -

final ServerSocket listener = new ServerSocket(11111); 
    Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       String command = null; 
       while (true) { 
        System.out.println("About to accept"); 
        Socket socket = listener.accept(); 
        System.out.println("Got a connection from: " + socket.getLocalPort()); 
        DataInputStream inputStream = new DataInputStream(socket.getInputStream()); 
        StringBuilder str = new StringBuilder(inputStream.readUTF()); 
        //command = in.readLine(); 
        System.out.println("GOT HERE. Msg received : "+str); 
        if (str != null && !"".equals(str.toString())) { 
         command = str.toString(); 
         if ("connection".equals(command)) { 
          System.out.println("Got connection message"); 
          DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 
          outputStream.writeUTF("connection"); 
          outputStream.close(); 

         } 
        } 
        inputStream.close(); 
        System.out.println("Done"); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      } 
     } 
}); 
    t.start(); 

} 

客户: -

public void makeConnection() { 
    try { 
     System.out.println("In makeConnection"); 
     Socket socket = new Socket("127.0.0.1", 11111); 
     DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); 
     outputStream.writeUTF("connection"); 
     InputStream inputStream = socket.getInputStream(); 
     DataInputStream dataInputStream = new DataInputStream(inputStream); 
     StringBuilder str; 
     do { 
      str = new StringBuilder(dataInputStream.readUTF()); 
      } while (!str.toString().equals("connection")); 
     System.out.println("Successfully saved all hosts to: "); 
     outputStream.close(); 
     dataInputStream.close(); 
     socket.close(); 
     outputStream.close(); 
    }catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 

的调用来启动程序: -

public void start() throws IOException, InterruptedException { 
    System.out.println("Starting server"); 
    startServer(); 
    Thread.sleep(1000); 
    System.out.println("Starting connection"); 
    makeConnection(); 
} 
相关问题