[英]Client doesn't receive message from Server - using select() call on server
我的常規 TCP 客戶端與常規 TCP 服務器配合使用效果很好,但不是 SelectServer,它基本上是一個 TCP 服務器使用 select() 調用非阻塞 TCP 服務器
class TCPClient {
public static void main(String args[]) throws Exception
{
if (args.length != 2)
{
System.out.println("Usage: TCPClient <Server IP> <Server Port>");
System.exit(1);
}
// Initialize a client socket connection to the server
Socket clientSocket = new Socket(args[0], Integer.parseInt(args[1]));
// Initialize input and an output stream for the connection(s)
DataOutputStream outBuffer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inBuffer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// Initialize user input stream
String line;
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
// Get user input and send to the server
// Display the echo meesage from the server
System.out.print("Please enter a message to be sent to the server ('logout' to terminate): ");
line = inFromUser.readLine();
while (!line.equals("logout") )
{
try{
// Send to the server
outBuffer.writeBytes(line + '\n');
// Getting response from the server
System.out.println("Bytes written.. waiting for response");
line = inBuffer.readLine();
System.out.println("Message received!");
System.out.println("Server: " + line);
}catch(SocketException e){}
System.out.print("Please enter a message to be sent to the server ('logout' to terminate): ");
line = inFromUser.readLine();
}
// Close the socket
clientSocket.close();
}
}
這個 TCP 客戶端卡在line = inBuffer.readLine();
因為它沒有收到任何消息。
我的服務器使用 select() 調用非阻塞 IO:
public class SelectServer {
public static void main(String[] args)throws Exception {
//InetAddress host = InetAddress.getByName("some host or ip"); //Enter some host or ip here
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
InetSocketAddress isa1 = new InetSocketAddress(9000);
serverSocketChannel.socket().bind(isa1);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
if (selector.select(500) < 0) //500miliseconds
{
System.out.println("select() failed");
System.exit(1);
}
Set selectedKeys = selector.selectedKeys();
Iterator iterator = selectedKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
iterator.remove();
if (key.isAcceptable()) {
//System.out.println("Acceptable");
SocketChannel sc = serverSocketChannel.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
System.out.println("Connection Accepted: " + sc.getLocalAddress() + "\n");
}
if (key.isReadable()) {
//System.out.println("Readable");
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer bb = ByteBuffer.allocate(1024);
int bytesRead = sc.read(bb);
String result = new String(bb.array()).trim();
System.out.println("Message received: " + result + " ,Message length= " + result.length());
if (result.equals("logout")) {
sc.close();
System.out.println("Connection closed...");
System.out.println("Server will keep running. " +"Try running another client to " + "re-establish connection");
}
sc.register(selector, SelectionKey.OP_WRITE);
}
if (key.isWritable()){
System.out.println("Writable");
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer bb = ByteBuffer.wrap("text".getBytes());
int bytesWritten = sc.write(bb);
System.out.println(bytesWritten); //Prints 4
bb.rewind();
sc.register(selector, SelectionKey.OP_READ);
}
}
}
}
}
在行int bytesWritten = sc.write(bb);
,寫入的字節數打印 4。因此字節已發送..但未收到。 客戶卡在我上面提供的行中。
如果我不“弄亂”ByteBuffer,而只是回顯消息,它就會完美發送。 但是,如果我真的嘗試將自定義消息輸入到 ByteBuffer,客戶端不會收到它。
為什么會這樣?
只需在末尾添加一個新行即可解決問題,例如“text\n”。 不敢相信事情就這么簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.