服务器不接受nio中的一个客户端 [英] server not accepting morethan one client in nio
问题描述
我正在尝试构建一个聊天应用程序。我有一个代码可以将数据从客户端发送到服务器。当一个或多个客户端登录时(当客户端程序运行一次或多次时).server将不接受除第一次连接之外的其余连接。
请帮我解决这个
这里是我的代码:
Am trying to build a chat application.i have a code that sends the data from client to server. when one or more client login(when the client program runs one or more time).server will not accepting the rest of connection other than first connected. please help me to resolve this here is my code:
public class Server
{
//Creating non blocking socket
public void non_Socket() throws Exception {
ServerSocketChannel ssChannel = ServerSocketChannel.open();
int port = 80;
int i=0;
ssChannel.socket().bind(new InetSocketAddress(port));
ssChannel.configureBlocking(false);
while(true)
{
SocketChannel sc = ssChannel.accept();`
if (sc == null)
{
System.out.println("Socket channel is null");
Thread.sleep(5000);
}
else
{
System.out.println("Socket channel is not null");
System.out.println("Received an incoming connection from " +
sc.socket().getRemoteSocketAddress());
new PrintRequest(sc,i).start();
i++;
}
}
}
public static void main(String [] abc) throws Exception
{
new Server().non_Socket();
}
}
class PrintRequest extends Thread {
public PrintRequest(SocketChannel sc,int i) throws Exception
{
WritableByteChannel wbc = Channels.newChannel(System.out);
ByteBuffer b = ByteBuffer.allocateDirect(1024); // read 1024 bytes
int numBytesRead = sc.read(b);
while (numBytesRead != -1)
{
b.flip();
while (b.hasRemaining())
{
wbc.write(b);
System.out.println();
//System.out.println("Stream "+i);
// System.out.println(" KKK "+b.toString());
}
//b.clear();
}
}
}
客户代码:
public class Client extends Thread {
public void non_Client_Socket() throws Exception
{
SocketChannel sChannel = SocketChannel.open();
sChannel.configureBlocking(false);
sChannel.connect(new InetSocketAddress("localhost", 80));
while (!sChannel.finishConnect())
{
System.out.println("Channel is not connected yet");
}
System.out.println("Channel is ready to use");
/* ---------- going to send data to server ------------*/
System.out.println("please enter the text");
BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
while(true)
{
System.out.println("Enter the text");
String HELLO_REQUEST =stdin.readLine().toString();
if(HELLO_REQUEST.equalsIgnoreCase("end"))
{
break;
}
System.out.println("Sending a request to HelloServer");
ByteBuffer buffer = ByteBuffer.wrap(HELLO_REQUEST.getBytes());
sChannel.write(buffer);
}
}
/* ---------- the data is written to sChannel server
will read from this channel ------------ */
public static void main(String [] args) throws Exception
{
new Client().non_Client_Socket();
}
}
推荐答案
那里这里有很多问题。
-
您将
ServerSocketChannel
放入非阻塞模式,然后在不使用选择器的情况下调用accept()
。这意味着99.9999%的时间accept()
将返回null,因此您正在燃烧CPU周期。这毫无意义。在阻止模式下接受或使用选择器。
You are putting your
ServerSocketChannel
into non-blocking mode and then callingaccept()
without using a Selector. That means 99.9999% of the timeaccept()
will return null, so you are burning CPU cycles. This is pointless. Either accept in blocking mode or use a Selector.
您将客户端 SocketChannel
放入非阻止模式,在不使用选择器的情况下调用 connect(),
和调用 finishConnect()
。这意味着99%的时间 finishConnect()
将返回false,因此您正在燃烧CPU周期。这毫无意义。要么以阻止模式连接,要么使用选择器。
You are putting your client SocketChannel
into non-blocking mode, calling connect(),
and the calling finishConnect()
without using a Selector. That means 99% of the time finishConnect()
will return false, so you are burning CPU cycles. This is pointless. Either connect in blocking mode or use a Selector.
你忽略了 SocketChannel.write()$ c $的结果C>。你不能这样做。它会返回您需要了解的信息。
You are ignoring the result of SocketChannel.write()
. You can't do that. It returns information you need to know about.
简而言之,您的代码没有多大意义。
In short, your code doesn't make much sense.
这篇关于服务器不接受nio中的一个客户端的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!