socket编程发送消息出现socket closed求大神,急

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.IOException;

import java.net.ServerSocket;
import java.net.Socket;

public class Server {

ServerSocket ss;
Socket  s ; 
Clients clients;
DataInputStream dis;

boolean startServer = false;

public void startServer(){


    try {
        ss   = new ServerSocket(8888);//8888是TCP端口号
        startServer = true;
        while(startServer){

             s = ss.accept();
            System.out.println(" connected!");

             clients = new Clients(s);
            new Thread(clients).start();    
        }
    }catch(IOException e){
        e.printStackTrace();
}finally{
    try {
        ss.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
public static void main(String[] args) {

    new Server().startServer();
}

}

class Clients implements Runnable{//包装类,把外部连接的client包装

private Socket s;
private boolean isConnected = false ;
private DataInputStream dis;


public Clients(Socket s) {

    this.s = s;

    try {
        isConnected = true;
        dis = new DataInputStream(s.getInputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {

    while(isConnected){

        try {
            String str = dis.readUTF();//阻塞:它会一直等待

System.out.println(str);
} catch (EOFException e){
System.out.println("Client is closed!");
}catch (IOException e1) {
e1.printStackTrace();
}finally{
try {
if(dis!=null)
{
dis.close();
}else{
;
}
if(s!=null)
{
s.close();
}else{
;
}
} catch (IOException e) {
e.printStackTrace();
}

}

    }   
}

}

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {

Socket s;
PrintWriter pw;
DataOutputStream dos;
String line = "";
Scanner reader = new Scanner(System.in);

public void startClient(){

    try {
        s  = new Socket("127.0.0.1", 8888);

        dos = new DataOutputStream(s.getOutputStream());
        System.out.println("connected");
        do{
            System.out.print("please input:");

            line = reader.next();
            dos.writeUTF(line);
            dos.flush();

        }while(!line.equals("bye"));

            dos.close();
            s.close();

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public static void main(String[] args) {

    new Client().startClient();
}

}

java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at Clients.run(Server.java:75)
at java.lang.Thread.run(Unknown Source)

socket closed,是不是你访问的服务端关闭了,或者被防火墙等拦截禁止你访问
或者你的服务端程序直接出错退出了

发现了问题,是在while循环那里大括号扩大了范围。
然而新的问题出现了,我开了两个客户端,在控制台输入一个字符串时两个客户端都会有显示。不知道为什么

你的客户端监测的是同一个输入--System.in