处于阻塞模式的Java NIO服务器不工作
我试图实现一个简单的nio服务器,它接受8070上的连接,并为每个客户机实例化一个新线程。它基本上通过改变大小写将读取的输入文本回显到客户端。我可以连接到服务器,但服务器回显的预期功能不起作用。下面是它的源代码。有人能帮我解决它的问题吗处于阻塞模式的Java NIO服务器不工作,java,multithreading,nio,echo-server,Java,Multithreading,Nio,Echo Server,我试图实现一个简单的nio服务器,它接受8070上的连接,并为每个客户机实例化一个新线程。它基本上通过改变大小写将读取的输入文本回显到客户端。我可以连接到服务器,但服务器回显的预期功能不起作用。下面是它的源代码。有人能帮我解决它的问题吗 public class NewIOServer { public static void main(String[] args) throws IOException { ServerSocketChannel ssc = Server
public class NewIOServer {
public static void main(String[] args) throws IOException {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress("localhost", 8070));
ExecutorService pool = Executors.newFixedThreadPool(1000);
while(true) {
SocketChannel s = ssc.accept();
pool.submit(new Util(s));
}
}
}
public class Util implements Runnable {
SocketChannel sc;
public Util(SocketChannel sc) {
this.sc = sc;
}
@Override
public void run() {
try {
process();
} catch (IOException e) {
e.printStackTrace();
}
}
private void process() throws IOException {
System.out.println("Connection from:" + this.sc);
ByteBuffer buf = ByteBuffer.allocateDirect(1024);
while(sc.read(buf) != -1) {
buf.flip();
for(int i=0; i<buf.limit(); i++) {
buf.put(i, (byte)transmogrify((int)buf.get(i)));
}
}
sc.write(buf);
buf.clear();
}
public static int transmogrify(int data) {
if(Character.isLetter(data)) {
return data ^ ' ';
}
return data;
}
}
公共类NewIOServer{
公共静态void main(字符串[]args)引发IOException{
ServerSocketChannel ssc=ServerSocketChannel.open();
ssc.socket().bind(新的InetSocketAddress(“localhost”,8070));
ExecutorService池=Executors.newFixedThreadPool(1000);
while(true){
SocketChannel s=ssc.accept();
提交(新的Util);
}
}
}
公共类Util实现可运行{
SocketChannel sc;
公共用途(SocketChannel sc){
这个.sc=sc;
}
@凌驾
公开募捐{
试一试{
过程();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有void进程()引发IOException{
System.out.println(“连接源:“+this.sc”);
ByteBuffer buf=ByteBuffer.allocateDirect(1024);
while(sc.read(buf)!=-1){
buf.flip();
对于(int i=0;i我建议您在调试器中单步执行代码。while
循环看起来完全错误。我认为您应该在循环中写入,并且希望在写入后清除。尝试将循环后的两行移到循环内。您必须压缩()或清除()一个缓冲区,在你可以再次读取它之前已经被翻转过。如果那些投反对票的人告诉我这样做的原因,这将是很有帮助的。仅供参考,我只是一个java套接字编程的新手,所以这就是为什么问题很简单。对于初学者来说,你应该添加你的代码是如何不工作的。它不编译吗?它崩溃了吗?你知道吗输出错误?