[英]Client-Server Multi-Threading
我在用Java实现简单的多线程服务器时遇到问题。
我的想法是让服务器向所有客户端广播消息(不使用多播)。
为此,我正在实现一种广播方法。 该方法将使用for循环,并循环遍历我存储在集合中的每个客户端线程。 它将调用每个线程send(),后者输出writeUTF()。
我的问题是2个客户A + B。
A输出:你好B输出:你好
B不会收到问候,并且当B再次键入时,它将收到A的消息。代码示例:
import java.net.*;
导入java.io。 ; 导入java.util。 ;
公共类ServerThreadHandler扩展了线程{
private AuctionServer server = null;
private Socket socket = null;
private String name = null;
private int ID = -1;
private DataInputStream dataIn = null;
public DataOutputStream dataOut = null;
private Thread thread;
protected static Vector handlers = new Vector();
// reason server is used here is because ian was calling a server method broadcast
// from inside the
public ServerThreadHandler(AuctionServer server, Socket socket, String name) throws IOException{
this.server = server;
this.socket = socket;
this.name = name;
dataIn = new DataInputStream( new
BufferedInputStream(socket.getInputStream()));
dataOut = new DataOutputStream(socket.getOutputStream());
}
// handles a specific client.
public void run(){
System.out.println("Server running..");
while(true){
try{
// broadcast to all clients. This will only be one client in this case.
server.broadcast(dataIn.readUTF());
int pause = (int)(Math.random() * 3000);
Thread.sleep(pause);
}
catch(IOException e){
System.out.println(e.getMessage());
}
catch(InterruptedException e){
System.out.println(e.getMessage());
}
}
}
public void send(String msg){
try{
dataOut.writeUTF(msg);
dataOut.flush();
}
catch(IOException e){
}
}
服务器代码:
// broadcast this to clients.
public void broadcast(String msg){
for(int i = 0; i < clientCount; i++){
clients[i].send(msg);
}
}
客户[]在哪里
private ServerThreadHandler clients[] = new ServerThreadHandler[3];
我将给您一个大概的轮廓,您可以填写其余的详细信息:
public class Server {
private ServerSocket serverSocket;
private List<Socket> clientSockets;
// constructor(s)
private class ThreadTask implements Runnable {
private Socket clientSocket;
public ThreadTask(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
while(true) {
// read message from clientSocket
for(Socket peerSocket: clientSockets) {
// send message on peerSocket
}
}
}
}
private void acceptConnections() {
while(true) {
try {
Socket clientSocket = serverSocket.accept();
clientSockets.add(clientSocket);
Thread t = new Thread(new ThreadTask(clientSocket));
t.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.