-------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo implements Runnable { private int port = 9990;

private ServerSocket server = null;

private boolean isRunning;

public static void main(String[] args) {
ServerDemo sd = new ServerDemo();
new Thread(sd).start();
} public void run() {
isRunning = true;
try {
server = new ServerSocket(port);
System.out.println(server.getClass().getName());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
while(isRunning) {
try {
Socket client = server.accept();
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));

PrintWriter out = new PrintWriter(client.getOutputStream());

while(true) {
String message = in.readLine();
System.out.println(message);
out.println("has recieved");
out.flush();
if("end".equals(message)) {
System.out.println("It has been completed");
client.close();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
-------------------------------------------------------------------
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class ClientDemo implements Runnable { public void run() {
Socket server = null;
try {
server = new Socket(InetAddress.getLocalHost(), 9990);
System.out.println(server.getClass().getName());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter out;
try {
BufferedReader in = new BufferedReader(new InputStreamReader(server
.getInputStream()));
out = new PrintWriter(server.getOutputStream());
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in)); while (true) {
String str = wt.readLine();
out.println(str);
out.flush();
if (str.equals("end")) {
break;
}
System.out.println(in.readLine());
}
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
-------------------------------------------------------------------public class ClientDemo2 { public static void main(String[] args) throws Exception {
new Thread(new ClientDemo()).start();
}}
-------------------------------------------------------------------
public class ClientDemo3 { public static void main(String[] args) throws Exception {

new Thread(new ClientDemo()).start();
}}
-------------------------------------------------------------------
ServerDemo是服务端,client是客户端功能:客户端发送字符串,服务端接受后打印,并返回"has recieve"表示已经收到问题描述:运行ClientDemo2后,我在控制台打字,没问题,就是打一行,服务端就能接受一行,
然后我再运行ClientDemo3,但他不想ClientDemo2那样,接受一行打印一行,
把ClientDemo2停止后,ClientDemo3的控制台会有很多的"has recieve"打印出来我想是ClientDemo2和3可以同时向服务端发送,服务端也可以同时对这2个线程做出反馈,
请高手帮忙看看,问题出在那里,因为我线程不是很懂,所以还请大家多多指教

解决方案 »

  1.   

    你这段代码: 服务端同时只能跟一个客户端连接,ClientDemo2没有退出时,ClientDemo3连不上;ClientDemo2退出后,ClientDemo3连上了,  并把你以前输入的全传给服务器了, 所以一下子收到很多"has recieve"
      

  2.   


    2退出后,3那边有很多has recieve,而且服务端控制台报错了
    java.net.SocketException: socket closed请问这个程序需要怎么改进
      

  3.   

    服务端这样改一下:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;public class ServerDemo implements Runnable{ private int port=9990; private ServerSocket server=null; private boolean isRunning; public static void main(String[] args){
    ServerDemo sd=new ServerDemo();
    }

    public ServerDemo(){
    try{
    server=new ServerSocket(port);
    System.out.println(server.getClass().getName());
    }
    catch(IOException e){
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    isRunning=true;
    for(int i=0;i<5;i++){
    new Thread(this).start();
    }
    } public void run(){
    while(isRunning){
    try{
    Socket client=server.accept();
    BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out=new PrintWriter(client.getOutputStream()); while(true){
    String message=in.readLine();
    System.out.println(message);
    out.println("has recieved");
    out.flush();
    if("end".equals(message)){
    System.out.println("It has been completed");
    client.close();
    }
    }
    }
    catch(IOException e){
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    }---------------------
    另外 2退出后,  服务端报异常是正常的, 因为服务端还在读,但socket已关闭了,  这是正常的
      

  4.   

    我这样改了一下import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;public class ServerDemo implements Runnable { private int port = 9990;

    private ServerSocket server = null;

    private boolean isRunning;

    public static void main(String[] args) {
    ServerDemo sd = new ServerDemo();
    new Thread(sd).start();
    } public void run() {
    isRunning = true;
    try {
    server = new ServerSocket(port);
    System.out.println(server.getClass().getName());
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    while(isRunning) {
    try {
    Socket client = server.accept();
    DoForServer dfs = new DoForServer();
    dfs.setClient(client);
    new Thread(dfs).start();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }
    }
    --------------------------------------------------------------------------
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintWriter;
    import java.net.Socket;public class DoForServer implements Runnable { private Socket client = null; public void run() {
    BufferedReader in;
    try {
    in = new BufferedReader(new InputStreamReader(client
    .getInputStream())); PrintWriter out = new PrintWriter(client.getOutputStream()); while (true) {
    String message = in.readLine();
    System.out.println(message);
    out.println("has recieved");
    out.flush();
    if ("end".equals(message)) {
    System.out.println("It has been completed");
    client.close();
    }
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } } public Socket getClient() {
    return client;
    } public void setClient(Socket client) {
    this.client = client;
    }
    }
    这样改了后,可以多个控制台一起输入,并且服务端都会返回提示,但是关闭一个后
    (输入"end",关闭socket时,服务端会报错
    java.net.SocketException: socket closed 是正常情况吗
      

  5.   

    这是正常的, 服务端正在socket上都, 结果这个socket被关闭了, 他肯定会抛异常; 没什么影响