finally { close();}你在服务器端干嘛要加这名呢? 
while (true) {
                Socket socket = accept();
                new CreateServerThread(socket);
                System.out.println("men : " + men);
            }
而这里又是一个死循环, 当Close()后,又要服务端重新连接. 把这句删掉就可以了.

解决方案 »

  1.   

    不懂SOCKET
    怎么没有用户输入的端
      

  2.   

    回复人: zhangji__2000(无奈的工作者) ( ) 信誉:100  2005-12-09 16:02:00  得分: 0  
     
     
       不懂SOCKET
    怎么没有用户输入的端
      
     
    回复:
    在客户端的控制台,输入字符串,回车后就把消息发到服务器里了,然后服务器再发一条新的消息显示在客户端的控制台上,通知客户端已经收到消息。
      

  3.   

    import java.io.*;
    import java.net.*;
    /*
     设计原理:
       主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,
     将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。
     这个程序监听10000端口,并将接入交给CreateServerThread线程运行。CreateServerThread线程接受输入,
     并将输入回应客户,直到客户输入"bye",线程结束。我们可以在createMessage方法中,对输入进行处理,
     并产生结果,然后把结果返回给客户。
     */
    public class Server extends ServerSocket {
        private static final int SERVER_PORT = 10000;//端口
        static int men = 0;
        public Server() throws IOException {
            super(SERVER_PORT);
            try {
                while (true) {
                    Socket socket = accept();
                    new CreateServerThread(socket);
                    System.out.println("men : " + men);
                }
            } catch (IOException e) {} finally {
                close();
            }
        }//--- CreateServerThread
        class CreateServerThread extends Thread {
            private Socket client;
            private BufferedReader in;
            private PrintWriter out;        public CreateServerThread(Socket s) throws IOException {
                Server.men = Server.men+1;
                client = s;            in = new BufferedReader(new InputStreamReader(client.getInputStream(),
                        "GB2312"));
                out = new PrintWriter(client.getOutputStream(), true);
                start();
            }        public void run() {
                try {
                
                    String line = in.readLine();//客户端发出的text
                    while (!line.equals("bye")) {
                        String msg = createMessage(line);
                        try {
                            out.println(msg); //输出给客户端
                        } catch (Exception ex) {
                            System.out.println("out error");
                        }
                        
                        line = in.readLine();//A   继续获取客户消息 
                        //System.out.println("client input is : " + line);
                    }
                    out.println("--- See you, bye! ---");
                    System.out.println("client is closee");
                    client.close();
                } catch (IOException e) {}
            }        private String createMessage(String line) {
                String str = "Welcome! sever has get your input : " + line;
                return str;
            }
        }    public static void main(String[] args) throws IOException {
            new Server();
        }
    }// 客户端
    import java.io.*;
    import java.net.*;public class Client extends Thread{
        Socket socket = null;
        BufferedReader in = null;
        PrintWriter out = null;
        Thread thread = null;
        BufferedReader line = null;    public Client() {        try {
                socket = new Socket("127.0.0.1", 10000); //对网络上的服务器(192.168.0.5)的端口(10000)发出连接请求
                
                 in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //从服务器读入流
                 out = new PrintWriter(socket.getOutputStream(), true); //用来向服务器发送控制台输入流的对象
                 line = new BufferedReader(new InputStreamReader(System.in)); //从控制台得到输入流
                 
                 start();
            } catch (IOException e) {
                socket = null;
            } 
        }
        
        public void run()
        {
         while(true) {
           try {
                 if (socket == null)
                     return;
                 String linestr = line.readLine(); //从控制台得到的text             
                 out.println(linestr); //将从控制台得到的输入流发送到服务器 
                 out.flush();         
                 System.out.println("str from control:" + linestr);
                 String STR = in.readLine(); //得到从服务器发过来的text
                 System.out.println(STR);
                 
                // 客户提出终止则退出
                if (linestr.equals("bye")){
                  out.close();
                  in.close();
                 socket.close();
                 System.out.println("socket closed");
                 break ; // 退出
                   }            
             } catch (IOException e) {
                 System.out.println(e.toString());
            }
    }
        }    public static void main(String[] args) {
            //for (int i = 0; i < 2; i++)
                new Client();
        }
    }
      

  4.   

    运行如下:
    F:\>java Client
    h
    str from control:h
    Welcome! sever has get your input : h
    f
    str from control:f
    Welcome! sever has get your input : f
    g
    str from control:g
    Welcome! sever has get your input : g
    bye
    str from control:bye
    --- See you, bye! ---
    socket closedF:\>
      

  5.   

    TO:楼主
    你的问题在于,你在客户端发送完成一次msg后,没有关闭连接
    但你的服务器端已经将连接关闭了,所以你再次发送msg时会抛出
    java.net.SocketException: Socket is closed 异常你这样做是不行的,要么连服务器端也改,要么两边都不要改
      

  6.   

    to yanjieqing(晴晴) 说明:
    CreateServerThread 类中更改run如下,使之持续获取客户请求并回发给客户public void run() {
                try {
                
                    String line = in.readLine();//客户端发出的text
                    while (!line.equals("bye")) {
                        String msg = createMessage(line);
                        try {
                            out.println(msg); //输出给客户端
                        } catch (Exception ex) {
                            System.out.println("out error");
                        }
                        
                        line = in.readLine();   //A   继续获取客户消息 
                        //System.out.println("client input is : " + line);
                    }
                    out.println("--- See you, bye! ---");
                    System.out.println("client is closee");
                    client.close();
                } catch (IOException e) {}
            }客户端Client类的run 方法中:while(true) {
           try {
                 if (socket == null)
                     return;
                 String linestr = line.readLine(); //从控制台得到的text             
                 out.println(linestr); //将从控制台得到的输入流发送到服务器 
                 out.flush();         
                 System.out.println("str from control:" + linestr);
                 String STR = in.readLine(); //得到从服务器发过来的text
                 System.out.println(STR);
                 
                // 客户提出终止则退出
                if (linestr.equals("bye")){
                  out.close();
                  in.close();
                 socket.close();
                 System.out.println("socket closed");
                 break ; // 退出
                   }            
             } catch (IOException e) {
                 System.out.println(e.toString());
            }
    }