服务器提供多个客户端连接时,当连入一个客户端后,当前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();
}
}
}
客户端代码: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();
}
}
}
你不是flush后才关闭么?那会有什么问题?
另,客户端怎么会知道我是否关闭了??我通过
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
这样是为了效率考虑,给你一堆砖头你是一块一块的往楼上搬快呢,还是几块一起搬快呢,就是这个意思了。
2. Socket.TcpNoDelay默认为false, 也就是延迟输出(等数据达到一定数量或延迟足够时间才发送), 只有为ture的时候flush才是立即传输
3. 客户端只有在read/write之后抛异常了, 才知道socket断了. 只要不read/write, 就不知道服务端已经断开. (此为阻塞式访问, NIO的有些不一样)