日期:2014-05-20  浏览次数:20674 次

网络,线程问题。第一次能正确查询,第二次执行不了
我在客户端建立一个BOOK类,里面有查询图书的方法query(),调用一次程序能正常执行,但调用第二次时就执行不了。弄了好半天也没解决。 客户端与服务器的连接是在主程序中写的,之后将ObjectInputStream 对象传到CBook类中,共其查询方法query()使用.
客户端代码如下:
public class CBook() implements Serializable{
public static void main(String args[]){
try{
Socket socket = new Socket("127.0.0.1",5000);//与服务器建立连接
ObjectInputStream ins = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream outs = new ObjectOutputStream(socket.getOutputStream());

CBook book = new CBook(ins,outs);
book.setBookId("TS00001");
CBook [] bookResult = book.query();//第一次查询,可正常执行
System.out.println(bookResult[0].getBookName());
book.setBookId("TS00002");
bookResult = book.query(); //再查询一次,执行不了了
System.out.println(bookResult[0].getBookName());
System.out.println("over...");
}catch(Exception e){...}
}
public CBook[] query(){
try{
strNotice = new String[2];
strNotice[0] = "queryBook";
strNotice[1]= "2";
bag = new String[6];
// socket = new Socket("127.0.0.1",5000);//如果与服务器的连接放在这,即取消注释,则程
// in = new ObjectInputStream(socket.getInputStream());//序可执行多次查询,正常
// out = new ObjectOutputStream(socket.getOutputStream());
out.writeObject(strNotice);
out.flush();
bag[0] = bookId;
bag[1] = bookName ;
  out.writeObject(bag);
out.flush();
System.out.println("\nmy 1\n");
int flag = in.readInt(); // 执行第二次查询时,在此停住了
  System.out.println("\nmy 2\n");
服务器端:
public Server()
{
try{
serve=new ServerSocket(5000);//启动服务器访问端口
while(true)
{
client=serve.accept();//接收要访问的客户端的客户套接字
if(client!=null)//接收到客户端,启动服务进程,多线程
{
ServerThread serveThread=new ServerThread(client);
serveThread.start();//启动线程,执行run函数
}
}
 
  }catch(Exception exp)
{...}
 }
public ServerThread(Socket client)
{
try{
con=new Conn();//建立一个新的数据库连接类
state=con.getStatement();//获得连接状态
  clientSocket=client;
databaseWriter=new ObjectOutputStream(clientSocket.getOutputStream());
databaseReader=new ObjectInputStream(clientSocket.getInputStream());
}catch(Exception exp){...}
}

public void run() // 执行第二次查询时,没有进入这个函数.
{
  try{
  System.out.println("\nserver my 2\n");// 执行第二次查询时,
  buf=(String[])databaseReader.readObject();//获得输入标识以及大小
 ....
}
请问怎样解决 第二次查询顺利执行?? 我是要保证客户端与服务器进行交互时,对一个客户开启一个线程,而不是一个查询开启一个线程.谢谢!!

------解决方案--------------------
public void run() // 执行第二次查询时,没有进入这个函数.
{
try{
System.out.println("\nserver my 2\n");// 执行第二次查询时,
buf=(String[])databaseReader.readObject();//获得输入标识以及大小
 ....


这个方法应该是一个 循环机制