考虑下面的代码:Client端:
public class FrmClient extends JFrame {

private IOThread io = null;
private String name = "";
public FrmClient(String name, String sex, String age) {
super();
this.name = name;
io = new IOThread();
io.start();
} private class IOThread extends Thread {

private Socket sk = null;
private ObjectInputStream in = null;
private ObjectOutputStream out = null;

final private int port = 8005;

public void sendMsg(Msg m) {
try {
out.writeObject(m);
} catch (IOException e) {
//e.printStackTrace();
}
}

public void run() {
try {
sk = new Socket("127.0.0.1", port);
System.out.println("Client Begin Get IOStream");
in = new ObjectInputStream(sk.getInputStream());
out = new ObjectOutputStream(sk.getOutputStream());
System.out.println("Client End Get IOStream");
} catch (IOException e) {
//e.printStackTrace();
}
}

}  
服务器端:
public class ServerConsole extends Thread{ private ArrayList list = new ArrayList();
final int port = 8005;

public void run() {
try {
ServerSocket ssk = new ServerSocket(port);
while (!ssk.isClosed() && !Thread.interrupted()) {
Socket sk = ssk.accept();
(new IOThread(sk)).start();
}
ssk.close();
} catch (IOException e) {
//e.printStackTrace();
}
}

private class IOThread extends Thread {

private Socket sk = null;
private ObjectInputStream in = null;
private ObjectOutputStream out = null;

public void sendMsg(Msg m) {
try {
out.writeObject(m);
} catch (IOException e) {
//e.printStackTrace();
}
}

public IOThread(Socket sk) {
super();
this.sk = sk;
synchronized(list) {
list.add(this);
}
}

public void run() {
try {
System.out.println("Server Begin Get IOStream");
in = new ObjectInputStream(sk.getInputStream());
out = new ObjectOutputStream(sk.getOutputStream());
System.out.println("Server End Get IOStream");
} catch (Exception e) {
//e.printStackTrace();
}
while(sk.isConnected() && !Thread.interrupted()) {
try {
Msg m = (Msg)in.readObject();
synchronized(list) {
for (int i = 0; i < list.size(); i++) {
IOThread io = (IOThread)list.get(i);
io.sendMsg(m);
}
}
} catch (Exception e) {
//e.printStackTrace();
}
}
synchronized(list) {
list.remove(this);
}
}

}

}
分别运行客户端和服务端,结果客户端阻塞在Client Begin Get IOStream,服务器端阻塞在Server Begin Get IOStream处,两个地方都没出现Client(Server) End Get IOStream。为什么会在Socket.getInputStream()处阻塞?请大家指教。

解决方案 »

  1.   

    完整的代码如下:客户端
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;public class Client extends Thread{

    private Socket sk = null;
    private ObjectInputStream in = null;
    private ObjectOutputStream out = null;

    final private int port = 8005;

    public void run() {
    try {
    sk = new Socket("127.0.0.1", port);
    System.out.println("Client Begin Get IOStream");
    in = new ObjectInputStream(sk.getInputStream());
    out = new ObjectOutputStream(sk.getOutputStream());
    System.out.println("Client End Get IOStream");
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    (new Client()).start();
    }}
    务服器端
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;public class Server extends Thread{ final int port = 8005;

    public void run() {
    try {
    ServerSocket ssk = new ServerSocket(port);
    while (!ssk.isClosed() && !Thread.interrupted()) {
    Socket sk = ssk.accept();
    (new IOThread(sk)).start();
    }
    ssk.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    private class IOThread extends Thread {

    private Socket sk = null;
    private ObjectInputStream in = null;
    private ObjectOutputStream out = null;

    public IOThread(Socket sk) {
    this.sk = sk;
    }

    public void run() {
    try {
    System.out.println("Server Begin Get IOStream");
    in = new ObjectInputStream(sk.getInputStream());
    out = new ObjectOutputStream(sk.getOutputStream());
    System.out.println("Server End Get IOStream");
    } catch (Exception e) {
    //e.printStackTrace();
    }
    }

    }

    public static void main(String[] args) {
    (new Server()).start();
    }}
    运行Server和Client,都阻塞在Server(Client) Begin Get IOStream里,不会打印出Server(Client) End Get IOStream,请大家指教。
      

  2.   

    你的服务端和客户端,同时都在读,没有一个发送数据,你先任意一端的流交换位置就OK了
    要让他们错开,
    就是一个要取输入流,另一个就取输出流.
    我改了一个客户端就OK了!import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;public class Client extends Thread{private Socket sk = null;
    private ObjectInputStream in = null;
    private ObjectOutputStream out = null;final private int port = 8005;public void run() {
    try {
    sk = new Socket("127.0.0.1", port);
    System.out.println("Client Begin Get IOStream");
    out = new ObjectOutputStream(sk.getOutputStream());
    in = new ObjectInputStream(sk.getInputStream());
    System.out.println("Client End Get IOStream");
    } catch (IOException e) {
    e.printStackTrace();
    }
    }public static void main(String[] args) {
    (new Client()).start();
    }}