You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							78 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							78 lines
						
					
					
						
							3.4 KiB
						
					
					
				| import java.net.*; | |
| import java.nio.*; | |
| import java.nio.channels.*; | |
| 
 | |
| public class TestSocketReadiness { | |
|     public static void main(String[] args) throws Exception { | |
|         String host = args.length > 0 ? args[0] : "localhost"; | |
|         int port = args.length > 1 ? Integer.parseInt(args[1]) : 9093; | |
| 
 | |
|         System.out.println("Testing socket readiness with " + host + ":" + port); | |
| 
 | |
|         // Test 1: Simple blocking connect | |
|         System.out.println("\n=== Test 1: Blocking Socket ==="); | |
|         try (Socket socket = new Socket()) { | |
|             socket.connect(new InetSocketAddress(host, port), 5000); | |
|             System.out.println("Blocking socket connected"); | |
|             System.out.println("   Available bytes: " + socket.getInputStream().available()); | |
|             Thread.sleep(100); | |
|             System.out.println("   Available bytes after 100ms: " + socket.getInputStream().available()); | |
|         } catch (Exception e) { | |
|             System.err.println("Blocking socket failed: " + e.getMessage()); | |
|         } | |
| 
 | |
|         // Test 2: Non-blocking NIO socket (like Kafka client uses) | |
|         System.out.println("\n=== Test 2: Non-blocking NIO Socket ==="); | |
|         Selector selector = Selector.open(); | |
|         SocketChannel channel = SocketChannel.open(); | |
|         channel.configureBlocking(false); | |
| 
 | |
|         try { | |
|             boolean connected = channel.connect(new InetSocketAddress(host, port)); | |
|             System.out.println("   connect() returned: " + connected); | |
| 
 | |
|             SelectionKey key = channel.register(selector, SelectionKey.OP_CONNECT); | |
| 
 | |
|             int ready = selector.select(5000); | |
|             System.out.println("   selector.select() returned: " + ready); | |
| 
 | |
|             if (ready > 0) { | |
|                 for (SelectionKey k : selector.selectedKeys()) { | |
|                     if (k.isConnectable()) { | |
|                         System.out.println("   isConnectable: true"); | |
|                         boolean finished = channel.finishConnect(); | |
|                         System.out.println("   finishConnect() returned: " + finished); | |
| 
 | |
|                         if (finished) { | |
|                             k.interestOps(SelectionKey.OP_READ); | |
| 
 | |
|                             // Now check if immediately readable (THIS is what might be wrong) | |
|                             selector.selectedKeys().clear(); | |
|                             int readReady = selector.selectNow(); | |
|                             System.out.println("   Immediately after connect, selectNow() = " + readReady); | |
| 
 | |
|                             if (readReady > 0) { | |
|                                 System.out.println("   Socket is IMMEDIATELY readable (unexpected!)"); | |
|                                 ByteBuffer buf = ByteBuffer.allocate(1); | |
|                                 int bytesRead = channel.read(buf); | |
|                                 System.out.println("   read() returned: " + bytesRead); | |
|                             } else { | |
|                                 System.out.println("   Socket is NOT immediately readable (correct)"); | |
|                             } | |
|                         } | |
|                     } | |
|                 } | |
|             } | |
| 
 | |
|             System.out.println("NIO socket test completed"); | |
|         } catch (Exception e) { | |
|             System.err.println("NIO socket failed: " + e.getMessage()); | |
|             e.printStackTrace(); | |
|         } finally { | |
|             channel.close(); | |
|             selector.close(); | |
|         } | |
| 
 | |
|         System.out.println("\nAll tests completed"); | |
|     } | |
| }
 |