考虑下面的代码: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()处阻塞?请大家指教。
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()处阻塞?请大家指教。
解决方案 »
- JDK不能安装
- Timer和TimerTask类
- 请教如何通过swing写的窗口界面打开一个IE页面
- 环境变量里并没有设置,可是还是能找到路径?
- 请...问... 把List a 中的数据倒到List b 中, 要保留其排序顺序请问如何实现.
- 怎样更改jbuilder生成的exe文件的图标?
- 怎么样设置classpath
- 请教在Linux8.0下安装JBuilder7企业版的方法?
- socket编程中的server端如何实现重连接?
- 给applet加一个安全证书是怎么实现的呢?最好有例子!
- 有难度-----怎样在Java中实现不规则的窗体呢?
- Socket.getInputStream()阻塞的问题——提供完整代码测试
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,请大家指教。
要让他们错开,
就是一个要取输入流,另一个就取输出流.
我改了一个客户端就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();
}}