Java套接字编程——连接完成之前套接字超时

标签 java sockets

我有一个套接字编程代码......

Server Program

import java.net.*;
import java.io.*;

public class GreetingServer extends Thread
{
private static int port;
  private ServerSocket serverSocket;

  public GreetingServer(int port) throws IOException
   {
  serverSocket = new ServerSocket(port);
  serverSocket.setSoTimeout(50000);
   }

 public void run()
  {
     while(true)
     {
        try
         {
           System.out.println("Waiting for client on port " +
           serverSocket.getLocalPort() + "...");
           Socket server = serverSocket.accept();
           System.out.println("Just connected to "
                + server.getRemoteSocketAddress());
           DataInputStream in =
              new DataInputStream(server.getInputStream());
           System.out.println(in.readUTF());
           DataOutputStream out =
             new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to "
             + server.getLocalSocketAddress() + "\nGoodbye!");
        server.close();
     }catch(SocketTimeoutException s)
     {
        System.out.println("Socket timed out!");
        break;
     }catch(IOException e)
     {
        e.printStackTrace();
        break;
       }
    }
 }
     public static void main(String [] args)
     {
       port=9000;
       try
     {
       Thread t = new GreetingServer(port);
       t.start();
     }catch(IOException e)
    {
      e.printStackTrace();
    }
   }
 }

客户端代码是...

import java.io.*;
import java.net.*;
public class GreetingClient
 {
   private static String serverName;
   public static void main(String [] args)
    {
      String sName = "MyServerName";
      int port = 9000;
      try
       {
        System.out.println("Connecting to " + sName
                         + " on port " + port);
     Socket client = new Socket(sName, port);
     System.out.println("Just connected to "
                  + client.getRemoteSocketAddress());
     OutputStream outToServer = client.getOutputStream();
     DataOutputStream out =
                   new DataOutputStream(outToServer);

     out.writeUTF("Hello from "
                  + client.getLocalSocketAddress());
     InputStream inFromServer = client.getInputStream();
     DataInputStream in =
                    new DataInputStream(inFromServer);
     System.out.println("Server says " + in.readUTF());
     client.close();
  }catch(IOException e)
    {
    }
  }
 }

代码编译良好。但是当我运行该程序时,首先是服务器,然后是客户端,服务器显示

Waiting for client on port 9000...
Socket timed out!

客户端显示

Connecting to MyServerName on port 9000

代码有什么问题吗?我尝试增加和减少超时值,但它给出相同的输出。

最佳答案

What is wrong with the code?

你的代码没有任何问题。您设置了 50 秒的接受超时,接受阻塞了 50 秒而没有客户端尝试连接,因此抛出了 SocketTimeoutException。这里的一切都按设计运行。

当然有可能:

  • 您的接受超时时间太短
  • 您不想仅仅因为接受超时而中止服务器
  • 您根本不希望接受超时。

所有这些都是取决于您的要求的设计决策。

也有可能您在客户端中输入了错误的主机名,但由于您忽略了客户端中的异常:

catch(IOException e)
{
}

你永远不会知道。永远不要忽略IOExceptions

关于Java套接字编程——连接完成之前套接字超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33931221/

相关文章:

java - Proguard:无法读取 C:\Program Files\Java\jdk-15.0.1\lib\rt.jar (没有这样的文件或目录)

java - 在 MacO 上的 R 中加载 rJava 库失败

java - 从 Spring Boot 下载字节数组到 Vue 前端

java - 在 Fragment 中设置代码时需要帮助(Android 开发)

android - Android 上类似 teamviewer 的应用程序技术

sockets - 运行脚本时,Julia 套接字 TCP 连接被拒绝,而不是 REPL

apache-flex - ActionScript 3 Socket 跨域文件帮助

java - 新 PrintWriter(新 BufferedWriter(新 PrintWriter(s.getOutputStream,真)))

python - 在python中生成一个包含套接字连接的QThread

java - 使用 ESRI android API 打开文件地理数据库