我这样定义一个服务器端的Socket,但是有一个问题,就是只能接受一个客户端;求高手帮改改,什么实现不用多线程就可以实现:来一个命令处理一个,不管是那个客户端的命令。public static void main(String args[]) throws IOException
{  

 readAccounts();
try
{
ServerSocket server = null;
try
{
server = new ServerSocket(4701); //监听4701 端口
}catch(Exception e)
{
System.out.println("can not listen to:" + e);
}
BufferedReader is=null;//读取客户端输入
String cmd;//保存转来命令
String ResultStr="";//保存处理完后向客户端发送信息
PrintWriter os = null;//向客户端发送信息。
Socket socket =server.accept();
while(true)
{

//socket =server.accept(); 
is = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
 cmd=is.readLine();
 ResultStr=checkCommand(cmd);
 os=new PrintWriter(socket.getOutputStream());
 os.println(ResultStr);
 os.flush();

}
}catch(Exception e)
{
System.out.println("Error" + e);
} }

解决方案 »

  1.   


    Socket socket =server.accept();
    这段代码是接受客户端连接的,你应该把它放到一个侦听线程中,没上来一个连接再用新线程去操作该socket,说白了,你写的代码是单线程的
      

  2.   

    给你个连接吧。http://www.bitscn.com/java/networkprogram/200605/21390.html
      

  3.   


     Socket socket =server.accept();
    这句代码放到while循环里,每接受到一个客户端,就另起一个线程处理
      

  4.   


                   这个socket也应该当成一个参数给服务端的线程传进去,这样线程之间的socket才独立
      

  5.   


    public class BroadcastServer implements Runnable {    public static final int LOCAL_PORT = 6999;// 本地打开的端口,用于接收数据    private Socket receSock;    public BroadcastServer(Socket socket) {
            try {
                receSock = socket;        } catch (Exception ee) {
                ee.printStackTrace();
            }
        }    public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(LOCAL_PORT);
            while (true) {
                Socket connectSocket = serverSocket.accept();
                BroadcastServer server = new BroadcastServer(connectSocket);//把socket传进去了
                Thread thread = new Thread(server);
                thread.start();        }
        }    public void run() {        try {
                DataInputStream dis = new DataInputStream(receSock.getInputStream());
                DataOutputStream dos = new DataOutputStream(receSock.getOutputStream());            while (true) {
                    String strReceive = dis.readUTF();
                    System.out.println(strReceive);
                    /*
                     * 自己写代码
                     * 
                     */
                
                }        } catch (IOException ee) {
                ee.printStackTrace();
            }    }}         参考下
      

  6.   

    如果是c++可以采用异步的socket,java好像都是同步的吧,只能用多线程了
      

  7.   

    很显然,你这个服务器端只监听到一个就不在阻塞监听了,需要将其放到while循环里面,这样才能循环监听萨!
      

  8.   

    刚才又看了下你的程序,你怎么放到主线程中能,既然是服务程序就再写个服务器的类来实现功能萨!如何在主线程中启动服务线程就可以循环监听了,这样的例子很多,而且是个很简单的程序HOHO
      

  9.   

    这样就ok了异步的可以用nio他有一些开源的框架像mina什么的
    都可以看看
    这些框架就不用自己注意底层管理了,直接处理业务逻辑就可以了