JavaNIO多线程服务器不工作
各位专家您好JavaNIO多线程服务器不工作,java,debugging,nio,Java,Debugging,Nio,各位专家您好 是否有人可以确定此服务器的问题,为什么无法连接多个客户端 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 ServerS
是否有人可以确定此服务器的问题,为什么无法连接多个客户端
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();
}
}
}
我的目的是在网络上发送对象
请帮忙
新代码:
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();
}
}
}
}
如果你把什么东西放在你的捕手块里,你可能会自己找到它。(e.printStackTracer()暂时可能会有所帮助)。您正在为每个循环迭代创建一个新的服务器套接字(反复使用相同的端口)。您必须只创建一次服务器套接字,然后接受新的传入连接 比如:
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());
}
}
}
以下是您进行NPE的原因: 如果此通道处于非阻塞模式,则如果 没有挂起的连接 这是我的
您的accept调用返回
null
,然后您尝试调用此null
对象上的一个方法。@SPeei:添加了新代码,它将服务于我的目标,即抛出NPE@Static:它把NPE扔到哪里?显示堆栈跟踪(将其添加到问题中),并指出行号对应于代码的哪一行。这里您根本没有执行非阻塞IO,因为您只是再次使用套接字及其流。当你不再需要它时,你应该关闭流和套接字。另外,你的tRunSer
在那里什么也没做。非常感谢。那么解决办法是什么呢?我想将对象发送到多个客户端,这是我的具体问题。你必须等到真的有客户端。您可以使用阻塞服务器socketchannel(在accept
中等待客户端连接),也可以使用选择器,在选择器上等待任何关联通道准备好执行IO操作。要将相同的数据发送到多个客户端,您可以序列化为ByteArrayOutputStream,然后在每个socketchannel上使用非阻塞IO发送字节数组。或者像现在这样做,但实际上并不需要非阻塞IO(因为您使用的是(阻塞)输出流)。