服务器提供多个客户端连接时,当连入一个客户端后,当前socket处理完后是否需要关闭呢??我发现关闭和不关闭客户端都可以接收数据,知道的大虾们吼一声,谢谢。
客户端代码:package netsource;import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class ConnetSocketTest { /**
 * @param args
 */
public static void main(String[] args) throws Exception {

try{
// TODO Auto-generated method stub
Socket socket = new Socket("10.10.2.77",8901);
//ͨ������ֽ���
OutputStream out = socket.getOutputStream();
    out.write("hello 10.10.2.77".getBytes("GBK"));
    out.flush();
    byte[] buf = new byte[65536];
    InputStream in=socket.getInputStream();
    int count = in.read(buf);
    System.out.println("�յ����ַ�:" + count +" bytes: ");
    System.out.println(new String(buf,"GBK"));
}catch(Exception e ){
e.printStackTrace();
}
}
}服务器端代码:
package netsource;public class SocketTest {
public static void main(String[] args){

new CreateSocket();
}
}
package netsource;
import java.net.ServerSocket;
import java.net.Socket;
public class CreateSocket extends Thread{
/**
 * ���캯��
 */
public CreateSocket(){
start();
}
/**
 * �Զ����к���
 */
public void run(){
try{
      ServerSocket serversocket  = new ServerSocket(8901);       
      System.out.println("start listen,port:"+8901);
      while(true){
        Socket socket=serversocket.accept();
        new CreateSocketnew(socket);
        
    }
    }catch(Exception e){
       e.printStackTrace();
    }
}}package netsource;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.*;public class CreateSocketnew extends Thread{
/** ����l��*/
private Socket socket; /** �������������*/
private InputStream in;
/** ������������*/
private OutputStream out;
public CreateSocketnew(Socket s){
socket = s;
 try{
      //socket.setSoTimeout(40000);//��ֹread����block
      in=socket.getInputStream();
      out=socket.getOutputStream();
      start();
    } catch(Exception e){       
     e.printStackTrace();  
    }
}
public void run(){
try{
    byte[] tmp=new byte[6553];
    byte[] buf=new byte[6553];
    int count=0,received=1; 
     try{
       count=in.read(tmp);
       System.out.println("count:"+count);
       System.out.println("客户端发送过来的:"+new String(tmp,0,count,"GBK"));
       //System.arraycopy(tmp,0,buf,received,count);
         //received+=count;  
     }catch(Exception e){
       e.printStackTrace();
       //break;
     }       

if(received>0){
String str ="----------wo shi fuwuqi----------";
buf =str.getBytes("GBK");
        out.write(buf);
        out.flush(); 
        System.out.println("--我关闭了当前客户端的socket--"+socket.getInetAddress().getHostAddress());
        socket.close();//这个地方关闭和不关闭客户端都可以接收到数据,为什么????????????????
}
}catch(Exception e){
e.printStackTrace();
}
}
}

解决方案 »

  1.   

    没看懂。
    你不是flush后才关闭么?那会有什么问题?
      

  2.   

    关闭了还能接收,那说明socket关闭不成功,或者不是关闭当前线程开启的socket
      

  3.   

    和对方测试的过程中发现,当我们在这个out.flush(); 后面不写socket.close();的时候,对方接收不到数据,而写上了对方就可以接收到数据,很奇怪。
    另,客户端怎么会知道我是否关闭了??我通过
                           System.out.println("--is bound--"+socket.isBound());
        System.out.println("--is closed--"+socket.isClosed());
        System.out.println("--is connected--"+socket.isConnected());
        socket.close();
        //socket.
        System.out.println("--is bound--"+socket.isBound());
        System.out.println("--is closed--"+socket.isClosed());
        System.out.println("--is connected--"+socket.isConnected());
    结果:  --is bound--true
    --is closed--false
    --is connected--true--is bound--true
    --is closed--true
    --is connected--true
      

  4.   

       当然要关闭啦,在finally里面关闭。
      

  5.   

    那个流是有缓存的默认好像是8k吧,就是那虽然写出去了,但是实际上并没有,会保存起来,当到达一定的大小后才发送出去,而调用flush,会将缓存数据立刻发送出去。
    这样是为了效率考虑,给你一堆砖头你是一块一块的往楼上搬快呢,还是几块一起搬快呢,就是这个意思了。
      

  6.   

    你数据都flush过去了,客户端可以拿到数据,那时候,你关不关都没有关系了
      

  7.   

    给你看个例子。http://blog.csdn.net/xieruilin133/archive/2010/01/28/5267459.aspx
      

  8.   

    1. close是必须的
    2. Socket.TcpNoDelay默认为false, 也就是延迟输出(等数据达到一定数量或延迟足够时间才发送), 只有为ture的时候flush才是立即传输
    3. 客户端只有在read/write之后抛异常了, 才知道socket断了. 只要不read/write, 就不知道服务端已经断开. (此为阻塞式访问, NIO的有些不一样)