站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题Socket.getInputStream()阻塞的问题

Socket.getInputStream()阻塞的问题

摘要: Socket.getInputStream()阻塞的问题


考虑下面的代码:

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()处阻塞?请大家指教。


完整的代码如下:

客户端
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了
要让他们错开,
就是一个要取输入流,另一个就取输出流.
我改了一个客户端就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();
}

}


学习了


↑返回目录
前一篇: 急问:java中如何进行中文简体和繁体之间的转化
后一篇: 如何编写代码实现从access数据库中将几个表的数据导入到sql serve/Oracle中去?