javaserversocket&;套接字不等待多线程服务器
因此,我有一个多线程服务器,数据正确地来回发送,但我的写操作在较慢的连接上暂停。我注意到它会随着连接时间而变化。第一个连接的客户端总是首先从服务器接收数据。下一个必须等到第一个完成接收,依此类推。我要找的是一个服务器,它可以在不等待客户机完成接收的情况下向许多客户机发送数据。我已经读过关于NIO(非阻塞)的书,但我更喜欢保留我目前的方法,即为每个客户机使用一个单独的线程 这是密码 服务器:javaserversocket&;套接字不等待多线程服务器,java,multithreading,sockets,Java,Multithreading,Sockets,因此,我有一个多线程服务器,数据正确地来回发送,但我的写操作在较慢的连接上暂停。我注意到它会随着连接时间而变化。第一个连接的客户端总是首先从服务器接收数据。下一个必须等到第一个完成接收,依此类推。我要找的是一个服务器,它可以在不等待客户机完成接收的情况下向许多客户机发送数据。我已经读过关于NIO(非阻塞)的书,但我更喜欢保留我目前的方法,即为每个客户机使用一个单独的线程 这是密码 服务器: public class Server implements Runnable { private Th
public class Server implements Runnable {
private Thread thread;
private ServerSocket serverSocket;
private ArrayList<ClientThread> clients;
public Server(int port) throws IOException {
thread = new Thread(this);
clients = new ArrayList<ClientThread>();
serverSocket = new ServerSocket(port);
thread.start();
}
@Override
public void run() {
while (true) {
try {
//Listens to clients connecting.
ClientThread client = new ClientThread(serverSocket.accept());
clients.add(client);
ServerWindow.addText("-- Someone connected!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void broadcast(String data) {
broadcast(data, null);
}
public void broadcast(String data, ClientThread exclude) {
int amount = clients.size();
for (int i = 0; i < amount; i++) {
if (!clients.get(i).equals(exclude)) { //Don't send it to that client.
try {
clients.get(i).broadcast(data);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}似乎您正在从同一线程调用广播方法 对于刚接触Java多线程的用户来说,这是一个常见的陷阱。
广播方法位于
Thread
的子类中这一事实并不意味着它将在该线程上执行
实际上,它将在调用它的线程上执行。在创建的
ClientThread
上执行的唯一方法是run()
,以及执行时调用的任何方法。如果您希望所述线程不仅从您的连接读取数据,还向其写入数据,则必须修改run方法以侦听外部命令以开始写入。您可以在广播中分配数据变量,并在运行()中使用它。
方法
public class ClientThread implements Runnable {
private Thread thread;
private Socket socket;
private Scanner input;
private PrintWriter output;
public ClientThread(Socket s) throws IOException {
thread = new Thread(this);
socket = s;
socket.setTcpNoDelay(true);
//socket.setSoTimeout(10); //Send little chunk for 10 milliseconds.
input = new Scanner(socket.getInputStream());
output = new PrintWriter(socket.getOutputStream());
thread.start();
}
public void run() {
while (true) {
if (input.hasNext()) {
reciever(input.nextLine());
}
}
}
private void reciever(String data) {
ServerWindow.addText(data);
ServerWindow.server.broadcast(data, this);
}
public void broadcast(String data) throws IOException {
output.println(data);
output.flush();
}