import java.awt.*;
    import java.net.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    import java.io.*;
    import javax.swing.Timer;     class Server extends Thread {
        ServerSocket skt;        Socket Client[]=new Socket[10];;
            int i = 0;        TextArea in;        int port,k=0,l=0;        //BufferedReader theInputStream;        PrintStream theOutputStream;        //String readin;        Face chat;        public Server(int port, Face chat) {
            try {
                this.port = port;
                skt = new ServerSocket(port);
                this.chat = chat;
            } catch (IOException e) {
                chat.ta.append(e.toString());
            }
        }        public void run() {            chat.ta.append("等待连线......");            while (true) {
                //System.out.print(""+i+"\n");
                try {
                Client[k] = skt.accept(); /* 接收客户连接 */                //当有客户端连接时就新建一个子线程
                if (i < 2) {
                    ServerThread server[] = new ServerThread[10];
                     server[k]= new ServerThread(Client[k], this.chat, i);
                     l=server.length;
                     server[k].start();
                    chat.ta.append("客户端" + Client[k].getInetAddress() + "已连线\n");
                    /*theInputStream = new BufferedReader(new InputStreamReader(Client
                            .getInputStream()));*/
                    //for(int j=0;j<server.length;j++)
                    theOutputStream = new PrintStream(server[k].getClient().getOutputStream());
                    i = server[k].getI();
                    k++;
                } else {
                    //theOutputStream = new PrintStream(null);
                }            }  catch (IOException e) {
                    chat.ta.append(e.toString());
                    
                  
                }
                finally{
                 skt.close();
                 }
            }        }        public void dataout(String data) {
            //for(int j=0;j<l;j++)
            theOutputStream.println(data);
        }
    }    class ServerThread extends Thread {
        //ServerSocket skt;        Socket Client;        TextArea in;        int port;        int i;        BufferedReader theInputStream;        PrintStream theOutputStream;        String readin;        Face chat;    //服务端子线程        public ServerThread(Socket s, Face chat, int i) {
            this.i = ++i;
            Client = s;
            //this.port = port; 
            //skt = new ServerSocket(port);
            this.chat = chat;        }        public int getI() {
            return this.i;
        }
        public Socket getClient() {
            return this.Client;
        }
        public void run() {            //chat.ta.append("等待连线......");            try {
                //Client = skt.accept(); /* 接收客户连接 */                //chat.ta.append("客户端" + Client.getInetAddress() + "已连线\n");
                theInputStream = new BufferedReader(new InputStreamReader(Client
                        .getInputStream()));
                theOutputStream = new PrintStream(Client.getOutputStream());                while (true) {
                    readin = theInputStream.readLine();
                    chat.ta.append(readin + "\n");
                }            } catch (SocketException e) {
                chat.ta.append("连线中断!\n");                chat.clientBtn.setEnabled(true);
                chat.serverBtn.setEnabled(true);
                chat.tfaddress.setEnabled(true);
                chat.tfport.setEnabled(true);
                try {
                    i--;
                   
                    Client.close();
                } catch (IOException err) {
                    chat.ta.append(err.toString());
                }
            } catch (IOException e) {
                chat.ta.append(e.toString());
            }
        }        public void dataout(String data) {
            theOutputStream.println(data);
        }
    }    //Client.java    
    class Client extends Thread {
        Socket skt;
        InetAddress host;
        int port;        BufferedReader theInputStream;
        PrintStream theOutputStream;
        String readin;        Face chat;        public Client(String ip, int p, Face chat) {
            try {
                host = InetAddress.getByName(ip);
                port = p;
                this.chat = chat;
            } catch (IOException e) {
                chat.ta.append(e.toString());
            }
        }        public void run() {
            try {
                chat.ta.append("尝试连线......");                skt = new Socket(host, port);
                chat.ta.append("连线成功\n");                theInputStream = new BufferedReader(new InputStreamReader(skt
                        .getInputStream()));                theOutputStream = new PrintStream(skt.getOutputStream());
                //Timer myTimer = new Timer();
                while (true) {
                    readin = theInputStream.readLine();
                    chat.ta.append(readin + "\n");
                }
            } catch (SocketException e) {
                chat.ta.append("连线中断!\n");
                chat.clientBtn.setEnabled(true);
                chat.serverBtn.setEnabled(true);
                chat.tfaddress.setEnabled(true);
                chat.tfport.setEnabled(true);
                try {
                    skt.close();
                } catch (IOException err) {
                    chat.ta.append(err.toString());
                }
            } catch (IOException e) {
                chat.ta.append(e.toString());
            }
        }        public void dataout(String data) {
            theOutputStream.println(data);
        }
    }//软件界面,进行按键监听调用。    //face.java        class Face extends Frame {
        /**
         *
         */
        private static final long serialVersionUID = 1L;
        Button clientBtn, serverBtn;
        TextArea ta;
        TextField tfaddress, tfport, tftype;
        int port;
        Client client;
        Server server;
        boolean iamserver;
        static Face frm;        public Face() {
            clientBtn = new Button("客户端");
            serverBtn = new Button("服务器");
            ta = new TextArea("", 10, 50, TextArea.SCROLLBARS_BOTH);
            tfaddress = new TextField("192.168.1.104", 20);
            tfport = new TextField("2000");
            tftype = new TextField(50);            tftype.addKeyListener(new TFListener());
            ta.setEditable(false);            setLayout(new FlowLayout());
            add(tfaddress);
            add(tfport);
            add(clientBtn);
            add(serverBtn);
            add(ta);
            add(tftype);
            setSize(400, 300);
            setTitle("我的聊天室");
            this.setVisible(true);            clientBtn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {                    port = Integer.parseInt(tfport.getText());                    client = new Client(tfaddress.getText(), port, frm);                    client.start();                    tfaddress.setEnabled(false);
                    tfport.setEnabled(false);
                    serverBtn.setEnabled(false);
                    clientBtn.setEnabled(false);
                }
            });            serverBtn.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {                    port = Integer.parseInt(tfport.getText());                    server = new Server(port, frm);                    server.start();                    iamserver = true;
                    tfaddress.setText("成为服务器");                    tfaddress.setEnabled(false);
                    tfport.setEnabled(false);
                    serverBtn.setEnabled(false);
                    clientBtn.setEnabled(false);
                }
            });            addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });        }        public static void main(String args[]) {
            frm = new Face();
        }        private class TFListener implements KeyListener {
            public void keyPressed(KeyEvent e) {                if (e.getKeyCode() == KeyEvent.VK_ENTER) {                    ta.append(">" + tftype.getText() + "\n");                    if (iamserver)
                        server.dataout(tftype.getText());
                    else
                        client.dataout(tftype.getText());                    tftype.setText("");
                }
            }            public void keyTyped(KeyEvent e) {
            }            public void keyReleased(KeyEvent e) {
            }
        }
    }我写的这个程序在客户断开连接之后,服务器也断开了连接,现在的问题是断开连接的服务器怎么不能在作为服务器了。我已经关闭了serversock连接了啊!!!
大家帮我看看。一个作为服务器,一个做客户端,客户端断开连接,服务器端不能再作为服务器。

解决方案 »

  1.   

    可以直接运行的
    你直接拷到你的编译器里
    主要还是这里
    (一个作为服务器,一个做客户端,客户端断开连接,服务器端不能再作为服务器。)
    我觉得错误就是Serversock占用的端口没有被释放。
    但是我已经close了啊。
    问题应该不是太复杂的,应该就是些小问题,大家帮我看看吧
      

  2.   


    import java.awt.*;
        import java.net.*;
        import java.io.*;
        import java.awt.*;
        import java.awt.event.*;
        import java.net.*;
        import java.io.*;
        import javax.swing.Timer;    class Server extends Thread {
            ServerSocket skt;        Socket Client[]=new Socket[10];;
               int i = 0;        TextArea in;        int port,k=0,l=0;        //BufferedReader theInputStream;        PrintStream theOutputStream;        //String readin;        Face chat;        public Server(int port, Face chat) {
                try {
                    this.port = port;
                    skt = new ServerSocket(port);
                    this.chat = chat;
                } catch (IOException e) {
                    chat.ta.append(e.toString());
                }
            }        public void run() {            chat.ta.append("等待连线......");            while (true) {
                    //System.out.print(""+i+"\n");
                    try {
                    Client[k] = skt.accept(); /* 接收客户连接 */                //当有客户端连接时就新建一个子线程
                    if (i < 2) {
                        ServerThread server[] = new ServerThread[10];
                        server[k]= new ServerThread(Client[k], this.chat, i);
                        l=server.length;
                        server[k].start();
                        chat.ta.append("客户端" + Client[k].getInetAddress() + "已连线\n");
                        /*theInputStream = new BufferedReader(new InputStreamReader(Client
                                .getInputStream()));*/
                        //for(int j=0;j <server.length;j++)
                        theOutputStream = new PrintStream(server[k].getClient().getOutputStream());
                        i = server[k].getI();
                        k++;
                    } else {
                        //theOutputStream = new PrintStream(null);
                    }            }  catch (IOException e) {
                        chat.ta.append(e.toString());
                       
                     
                    }
                    finally{
                    skt.close();
                    }
                }        }        public void dataout(String data) {
                //for(int j=0;j <l;j++)
                theOutputStream.println(data);
            }
        }    class ServerThread extends Thread {
            //ServerSocket skt;        Socket Client;        TextArea in;        int port;        int i;        BufferedReader theInputStream;        PrintStream theOutputStream;        String readin;        Face chat;    //服务端子线程        public ServerThread(Socket s, Face chat, int i) {
                this.i = ++i;
                Client = s;
                //this.port = port;
                //skt = new ServerSocket(port);
                this.chat = chat;        }        public int getI() {
                return this.i;
            }
            public Socket getClient() {
                return this.Client;
            }
            public void run() {            //chat.ta.append("等待连线......");            try {
                    //Client = skt.accept(); /* 接收客户连接 */                //chat.ta.append("客户端" + Client.getInetAddress() + "已连线\n");
                    theInputStream = new BufferedReader(new InputStreamReader(Client
                            .getInputStream()));
                    theOutputStream = new PrintStream(Client.getOutputStream());                while (true) {
                        readin = theInputStream.readLine();
                        chat.ta.append(readin + "\n");
                    }            } catch (SocketException e) {
                    chat.ta.append("连线中断!\n");                chat.clientBtn.setEnabled(true);
                    chat.serverBtn.setEnabled(true);
                    chat.tfaddress.setEnabled(true);
                    chat.tfport.setEnabled(true);
                    try {
                        i--;
                     
                        Client.close();
                    } catch (IOException err) {
                        chat.ta.append(err.toString());
                    }
                } catch (IOException e) {
                    chat.ta.append(e.toString());
                }
            }        public void dataout(String data) {
                theOutputStream.println(data);
            }
        }    //Client.java   
        class Client extends Thread {
            Socket skt;
            InetAddress host;
            int port;        BufferedReader theInputStream;
            PrintStream theOutputStream;
            String readin;        Face chat;        public Client(String ip, int p, Face chat) {
                try {
                    host = InetAddress.getByName(ip);
                    port = p;
                    this.chat = chat;
                } catch (IOException e) {
                    chat.ta.append(e.toString());
                }
            }        public void run() {
                try {
                    chat.ta.append("尝试连线......");                skt = new Socket(host, port);
                    chat.ta.append("连线成功\n");                theInputStream = new BufferedReader(new InputStreamReader(skt
                            .getInputStream()));                theOutputStream = new PrintStream(skt.getOutputStream());
                    //Timer myTimer = new Timer();
                    while (true) {
                        readin = theInputStream.readLine();
                        chat.ta.append(readin + "\n");
                    }
                } catch (SocketException e) {
                    chat.ta.append("连线中断!\n");
                    chat.clientBtn.setEnabled(true);
                    chat.serverBtn.setEnabled(true);
                    chat.tfaddress.setEnabled(true);
                    chat.tfport.setEnabled(true);
                    try {
                        skt.close();
                    } catch (IOException err) {
                        chat.ta.append(err.toString());
                    }
                } catch (IOException e) {
                    chat.ta.append(e.toString());
                }
            }        public void dataout(String data) {
                theOutputStream.println(data);
            }
        }//软件界面,进行按键监听调用。    //face.java       class Face extends Frame {
            /**
            *
            */
            private static final long serialVersionUID = 1L;
            Button clientBtn, serverBtn;
            TextArea ta;
            TextField tfaddress, tfport, tftype;
            int port;
            Client client;
            Server server;
            boolean iamserver;
            static Face frm;        public Face() {
                clientBtn = new Button("客户端");
                serverBtn = new Button("服务器");
                ta = new TextArea("", 10, 50, TextArea.SCROLLBARS_BOTH);
                tfaddress = new TextField("192.168.1.104", 20);
                tfport = new TextField("2000");
                tftype = new TextField(50);            tftype.addKeyListener(new TFListener());
                ta.setEditable(false);            setLayout(new FlowLayout());
                add(tfaddress);
                add(tfport);
                add(clientBtn);
                add(serverBtn);
                add(ta);
                add(tftype);
                setSize(400, 300);
                setTitle("我的聊天室");
                this.setVisible(true);            clientBtn.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {                    port = Integer.parseInt(tfport.getText());                    client = new Client(tfaddress.getText(), port, frm);                    client.start();                    tfaddress.setEnabled(false);
                        tfport.setEnabled(false);
                        serverBtn.setEnabled(false);
                        clientBtn.setEnabled(false);
                    }
                });            serverBtn.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {                    port = Integer.parseInt(tfport.getText());                    server = new Server(port, frm);                    server.start();                    iamserver = true;
                        tfaddress.setText("成为服务器");                    tfaddress.setEnabled(false);
                        tfport.setEnabled(false);
                        serverBtn.setEnabled(false);
                        clientBtn.setEnabled(false);
                    }
                });            addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });        }        public static void main(String args[]) {
                frm = new Face();
            }        private class TFListener implements KeyListener {
                public void keyPressed(KeyEvent e) {                if (e.getKeyCode() == KeyEvent.VK_ENTER) {                    ta.append(">" + tftype.getText() + "\n");                    if (iamserver)
                            server.dataout(tftype.getText());
                        else
                            client.dataout(tftype.getText());                    tftype.setText("");
                    }
                }            public void keyTyped(KeyEvent e) {
                }            public void keyReleased(KeyEvent e) {
                }
            }
        }我写的这个程序在客户断开连接之后,服务器也断开了连接,现在的问题是断开连接的服务器怎么不能在作为服务器了。我已经关闭了serversock连接了啊!!!
    大家帮我看看。一个作为服务器,一个做客户端,客户端断开连接,服务器端不能再作为服务器。
    贴代码,记得格式化。方便别人看。
      

  3.   

    代码写的问题比较多,你Server是个线程,还有个专门处理客户端请求的线程。还new 了一个数组,写的太复杂,也问题很多,改起来也不方便。我原来写过一个这方面的东西,是起一个服务端,再起一个线程去监听,一但监听到了就放到处理线程中去就行了,要那么多数组做什么?
    这个我没做过多的异常处理,也没写Swing的界面,你自己修改一下应该可以用了,我看了一下你的服务端实在看不下去了,我不知道你要那么多数组做什么用的。。package demo;import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.LinkedList;
    import java.util.List;public class Server {
    private ServerSocket ss = null; private List<Socket> list = new LinkedList<Socket>(); private class ReceiveThread extends Thread {
    private Socket socket = null; public ReceiveThread(Socket socket) {
    super("ReceiveThread");
    this.socket = socket;
    } @Override
    public void run() {
    InputStream in = null;
    DataInputStream dis = null;
    while (true) {
    try {
    sleep(50);
    } catch (InterruptedException e1) {
    e1.printStackTrace();
    } if (socket == null || socket.isClosed()
    || !socket.isConnected()) {
    continue;
    }
    try {
    in = socket.getInputStream();
    dis = new DataInputStream(in);
    String readUTF = dis.readUTF();
    System.out.println("receive client message :" + socket
    + " " + readUTF);
    send(readUTF);
    } catch (IOException e) {
    try {
    in.close();
    dis.close();
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    list.remove(socket);
    e.printStackTrace();
    }
    } }
    } public void send(String msg) throws IOException {
    for (int i = 0; i < list.size(); i++) {
    Socket groupSocket = list.get(i);
    OutputStream out = groupSocket.getOutputStream();
    DataOutputStream dout = new DataOutputStream(out);
    dout.writeUTF(msg);
    dout.flush();
    out.flush();
    }
    } public class AcceptSocketThread extends Thread {
    public AcceptSocketThread() {
    super("AcceptSocketThread");
    } public void run() {
    try {
    ss = new ServerSocket(7788); while (true) {
    Socket socket = ss.accept();
    list.add(socket);
    new ReceiveThread(socket).start();
    }
    } catch (IOException e) {
    e.printStackTrace();
    } }
    } private void start() throws IOException {
    new AcceptSocketThread().start();
    } public static void main(String[] args) throws Exception {
    System.out.println("Server start ....");
    new Server().start();
    }}
    客户端
    package demo;import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Scanner;public class Client {
    private Socket socket = null; private class ReceiveThread extends Thread {
    @Override
    public void run() {
    while (true) {
    try {
    InputStream in = socket.getInputStream();
    DataInputStream din = new DataInputStream(in);
    String readUTF = din.readUTF();
    System.out.println("Server Send Message: " + readUTF); } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    } public void start() throws IOException {
    socket = new Socket(InetAddress.getByName("127.0.0.1"), 7788); new ReceiveThread().start();
    System.out.println("Client start ....\nPlease input message : ");
    while (true) {
    Scanner scaner = new Scanner(System.in);
    String next = scaner.next();
    OutputStream out = socket.getOutputStream();
    DataOutputStream dout = new DataOutputStream(out);
    dout.writeUTF(next);
    // scaner.close();
    dout.flush();
    }
    } public static void main(String[] args) throws IOException {
    System.out.println("client ...");
    Client client = new Client();
    client.start();
    }}