首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaNIO多线程服务器不工作

JavaNIO多线程服务器不工作
EN

Stack Overflow用户
提问于 2011-04-16 21:47:55
回答 3查看 1K关注 0票数 0

各位专家好!

有没有人能找出这个服务器的问题,为什么它不能连接多个客户端

代码语言:javascript
复制
import java.io.*;
import java.net.*;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.*;

public class MultithreadedServer extends Thread {

    private ServerSocketChannel ssChannel;

    private Thread tRunSer = new Thread(this, "ServerSelectThread");

    public static void main(String argv[]) throws Exception {
        new MultithreadedServer();
    }

    public MultithreadedServer() throws Exception {
        this.start();
    }

    public void run() {
        while (true) {
            try {

                ssChannel = ServerSocketChannel.open();
                ssChannel.configureBlocking(false);
                int port = 2345;
                ssChannel.socket().bind(new InetSocketAddress(port));
            } catch (Exception e) {
            }
        }
    }
}

class Connect extends Thread {
    private ServerSocketChannel ssChannel;
    private SimManager SM;
    private BallState BS = new BallState(10, 5);

    public Connect(ServerSocketChannel ssChannel) {
        this.ssChannel = ssChannel;

        SM = new SimManager(BS);
        SM.start();
    }

    public void run() {
        try {
            SocketChannel sChannel = ssChannel.accept();
            while (true) {
                ObjectOutputStream oos = new ObjectOutputStream(sChannel
                        .socket().getOutputStream());
                oos.writeObject(BS);
                System.out.println("Sending String is: '" + BS.X + "'" + BS.Y);
                oos.flush();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

我的意图是将对象发送到网络上。

请帮帮忙

新代码:

代码语言:javascript
复制
import java.io.*;
import java.net.*;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.*;

public class MultithreadedServer extends Thread {

    private ServerSocketChannel ssChannel;
    private SimManager SM;
    private BallState BS = new BallState(10, 5);
    private Thread tRunSer = new Thread(this, "ServerSelectThread");

    public static void main(String argv[]) throws Exception {
        new MultithreadedServer();
    }

    public MultithreadedServer() throws Exception {
        this.start();
    }

    public void run() {
        // create the server socket once
        try {
            ssChannel = ServerSocketChannel.open();
            ssChannel.configureBlocking(false);
            ssChannel.socket().bind(new InetSocketAddress(2345));
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        while (true) {
            // accept new connections on the socket

            SocketChannel accept;
            try {
                accept = ssChannel.accept();
                ObjectOutputStream oos;
                oos = new ObjectOutputStream(accept.socket().getOutputStream());

                oos.writeObject(BS);
                System.out.println("Sending String is: '" + BS.X + "'" + BS.Y);
                oos.flush();

            }

            catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-16 22:04:04

您正在为每个循环迭代创建一个新的服务器套接字(反复使用相同的端口)。您必须只创建一次服务器套接字,然后接受新的传入连接。

类似于:

代码语言:javascript
复制
 public void run() {
    // create the server socket once
    ssChannel = ServerSocketChannel.open();
    ssChannel.configureBlocking(false);
    ssChannel.socket().bind(new InetSocketAddress(2345));

    while (true) {
        // accept new connections on the socket
        try {
            SocketChannel accept = ssChannel.accept();
            System.out.println("new client: " + accept.getRemoteAddress());
        } catch (Exception e) {
            System.out.println("exception: " + e.getMessage());
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2011-04-16 21:49:51

如果你把一些东西放在catch块中,你可能会自己找到它。(e.printStackTracer()可能暂时有帮助)。

票数 0
EN

Stack Overflow用户

发布于 2011-04-17 00:32:13

以下是您使用NPE的原因:

如果此通道处于非阻塞模式,则如果没有挂起的连接,此方法将立即返回null。

这是来自ServerSocketChannel.accept()的。

您的accept调用返回null,然后尝试在此null对象上调用一个方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5686903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档