大家帮我看一下,这段代码有问题吗?
我现在用java写的客户端,用VC写的服务端,通过客户端向服务端发送一个请求后,接收服务端返回结果的过程,但是我在客户端使用out.close(),in.close(),cScoket.close();  来关闭时,一运行到in.close() 后,我的服务端程序就开始死循环,客户端无法断开。当把out.close(),in.close(),cScoket.close();注释了,改用out.shutdown()时,服务端显示断开了,但是用netstat -a查看,连接并没有断开,大家帮帮我呀!!!
 Socket cSocket = new Socket("192.168.0.54", 5000);
if(cSocket.isConnected() == true){
  System.out.println("连接服务端成功");
}
else {
System.out.println("连接服务端失败");
return "0";
}
String UserState="";
String retUserState = "";
try{
        BufferedReader in = new BufferedReader(new InputStreamReader(cSocket.getInputStream()));
        PrintWriter out = new PrintWriter(cSocket.getOutputStream(),true);        
        
     String str = "name=john\n";    
    
     out.println(str);
    out.flush();
     retUserState = in.readLine(); 
     System.out.println(retUserState);
    
    out.close();
    in.close();
    cSocket.close();
    }
    catch(Exception e) {
System.out.println(e.getMessage());
}
return UserState;

解决方案 »

  1.   

    我的服务端程序就开始死循环,
    ==========================怎么个死循环?paste server side key code
      

  2.   

    通过多线程的方式
    UINT thread(LPVOID p)
    {

    char buff[1024];
    memset(buff,0,sizeof(buff));
    CString sendBuf;

    CSize size;
    size.cx=0;
    size.cy=30;
    int s=1,loop=1,flag=0;
    CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();

    s=1;
    dlg->msgsock=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));
    if (dlg->msgsock==INVALID_SOCKET)
    {
    dlg->m_edit.SetWindowText("Error accept");
    }
    else
    {
    //启动线程
    AfxBeginThread(thread,0);
    dlg->SetForegroundWindow();
    dlg->m_list.InsertItem(dlg->count++,"连接成功");
    dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
    dlg->m_list.Scroll(size);
    dlg->m_button.EnableWindow(TRUE);
    while(s!=SOCKET_ERROR)
    {
    memset(buff,0,sizeof(buff));
    //循环接收数据
    s=recv(dlg->msgsock,buff,sizeof(buff),0);
    dlg->SetForegroundWindow();
    if (s!=SOCKET_ERROR)
    {

    dlg->m_list.InsertItem(dlg->count++,buff);
    dlg->m_list.Scroll(size);
    //拆分buff中的数据
    sendBuf = AnalyTuxedo(buff,dlg->Ora_DB);//处理客户端传来的数据
    dlg->sendRetVal(sendBuf);//将处理结果返回给客户端
    dlg->m_list.InsertItem(dlg->count++,sendBuf);
    dlg->m_list.Scroll(size);
    }
    } send(dlg->msgsock,"Disconnected",1024,0);

    dlg->m_list.InsertItem(dlg->count++,"Disconnected");
    dlg->m_list.Scroll(size);
    dlg->msgsock=NULL;

    dlg->m_button.EnableWindow(FALSE);


    } //终止线程
    AfxEndThread(0);
    return 0;
    }
      

  3.   

    试着改一下Java客户端的接受方式,不要使用readLine
      

  4.   

    还有循环接受数据为什么要使用while(S!=SOCKET_ERROR)
      

  5.   

    接收完之后,我是将通信阻塞吗?那我如何再返回呢
    dolyp(逗逗),能否给我一段代码呢
      

  6.   

    应该直接返回就可以吧,服务器端不是为每个客户端连连接都建立一个socket并创建线程处理它吗,你现在用的模式应该就是阻塞模式吧