日期:2014-05-19  浏览次数:20736 次

socket问题求高手
我现在创建了一个服务端socket 和一个socket客户端 

现在每当客户端连接服务端的时候,服务端都向客户端返回信息。

 能不能当有5个客户端连接的时候,共同向所有的客户端返回相同的信息呢?


 比如:客户端1传给服务端传信息“1”,客户端2传给服务端传信息“3” ......客户端5传给服务端传信息“5”

当服务端接受到5个客户端的信息后,才对接受到的5个值进行对比,判断结果“5”最大,并且返回给5个客户端的信息都是

“5”. 这样应该怎么处理? 现在做的只能返回给第5个客户端。

------解决方案--------------------
每个socket保存到一个map或list里,socket关闭的时候就从map或list里删除
分别遍历map或list里的socket,接收socket数据,比较数据,然后把结果分别发送给每个socket
LZ现在只能发送给第5个socket,估计是每次接收socket的地方,用的是同一个成员,所以前4个都丢失了

------解决方案--------------------
每次客户端向服务端请求的时候,都将其socket保存到list中,服务端向客户端发信息的时候,就遍历list,向每一个客户端 发送信息
------解决方案--------------------
要不就建立长连接
------解决方案--------------------
1楼和3楼解释的很好啊,每连上一个就把 socket存起来,你要返回信息时调用就好了啊
------解决方案--------------------
很粗糙,意思一下
server
Java code
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class serverS {
    public static void main(String[] args) throws IOException,InterruptedException {
        serverS s = new serverS();
        s.start(4342);
    }

    // 这里存放请求的clientSocket
    List<ClientThread> clientList = new ArrayList<ClientThread>();

    public void start(int port) throws IOException, InterruptedException {
        ServerSocket server = new ServerSocket(port);
        while (true) {
            Socket clientSocket = server.accept();
            ClientThread client = new ClientThread(clientSocket);
            clientList.add(client);
            client.start();

            Thread.sleep(2000);
            for (ClientThread c : clientList) {
                c.send();
            }
        }
    }
}
/**
 * 把请求的的socket封装成对像,分别处理 接收 和 发送
 * @author GKT
 *
 */
class ClientThread extends Thread {
    private InputStream inputStream;
    private OutputStream outputStream;
    
    public ClientThread(Socket client) throws IOException {
        this.inputStream = client.getInputStream();
        this.outputStream = client.getOutputStream();
    }
    /**
     * 这里向client发消息
     * @throws IOException
     */
    public void send() throws IOException {
        outputStream.write(222);
        System.out.println("callClient");
    }

    /**
     * 这时处理client传来的消息,注意保持长链接,client端也要保持
     */
    public void run() {
        System.out.println("用户连接");
        while (true) {
            try {
                if (inputStream.available() > 0) {
                    System.out.println(inputStream.read());
                } else {
                    Thread.sleep(3000);
                }
            } catch (Exception e) {
                System.out.println("用户退出");
                break;
            }
        }
    }
}