最近在看Java Socket相关的东西,看到其中一段示例程序,我居然运行结果跟书中的不一样,仔细检查代码并无写错,所以贴出来让大伙瞧瞧这个问题到底是什么情况。服务器代码package chapter01.example11;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class SimpleServer { public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket ss=new ServerSocket(8000);
Socket s=ss.accept();
Thread.sleep(5000);
InputStream in=s.getInputStream();
ByteArrayOutputStream buffer=new ByteArrayOutputStream();
byte[] buff=new byte[1024];
int len=-1;
do {
len=in.read(buff);
if(len!=-1)
buffer.write(buff,0,len);
} while (len!=-1);
System.out.println(new String(buffer.toByteArray()));
}
}客户端代码package chapter01.example10;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class SimpleClient { public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket("localhost",8000);
s.setSoLinger(true, 3600);
OutputStream out=s.getOutputStream();
StringBuffer sb=new StringBuffer();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
out.write(sb.toString().getBytes());
System.out.println("开始关闭");
long begin=System.currentTimeMillis();
s.close();
long end=System.currentTimeMillis();
System.out.println("关闭Socket所用的时间未:"+(end-begin)+"ms");
}
}书中解释如下:
socket.setSoLinger(true,3600);
执行Socket的close()方法,该方法不会立即返回,而进入阻塞状态。同时,底层的Socket会尝试发送剩余的数据。只有满足以下两个条件之一,close()方法才返回:
1、底层的Socket已经发送完所有的剩余数据
2、尽管底层的Socket还没有发送完所有的剩余数据,但已经阻塞了3600秒,close()方法的阻塞时间超过3600秒,也会返回,剩余未发送的数据被丢弃。书中上面的程序打印结果如下:
开始关闭
关闭Socket所用的时间未:5648ms而我自己运行的打印结果如下:
开始关闭
关闭Socket所用的时间未:0ms大伙自己拷贝这段代码运行看看是不是跟我一样的,难道书中讲解有误?知道的高手请指教一下。
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class SimpleServer { public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket ss=new ServerSocket(8000);
Socket s=ss.accept();
Thread.sleep(5000);
InputStream in=s.getInputStream();
ByteArrayOutputStream buffer=new ByteArrayOutputStream();
byte[] buff=new byte[1024];
int len=-1;
do {
len=in.read(buff);
if(len!=-1)
buffer.write(buff,0,len);
} while (len!=-1);
System.out.println(new String(buffer.toByteArray()));
}
}客户端代码package chapter01.example10;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class SimpleClient { public static void main(String[] args) throws UnknownHostException, IOException {
Socket s=new Socket("localhost",8000);
s.setSoLinger(true, 3600);
OutputStream out=s.getOutputStream();
StringBuffer sb=new StringBuffer();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
out.write(sb.toString().getBytes());
System.out.println("开始关闭");
long begin=System.currentTimeMillis();
s.close();
long end=System.currentTimeMillis();
System.out.println("关闭Socket所用的时间未:"+(end-begin)+"ms");
}
}书中解释如下:
socket.setSoLinger(true,3600);
执行Socket的close()方法,该方法不会立即返回,而进入阻塞状态。同时,底层的Socket会尝试发送剩余的数据。只有满足以下两个条件之一,close()方法才返回:
1、底层的Socket已经发送完所有的剩余数据
2、尽管底层的Socket还没有发送完所有的剩余数据,但已经阻塞了3600秒,close()方法的阻塞时间超过3600秒,也会返回,剩余未发送的数据被丢弃。书中上面的程序打印结果如下:
开始关闭
关闭Socket所用的时间未:5648ms而我自己运行的打印结果如下:
开始关闭
关闭Socket所用的时间未:0ms大伙自己拷贝这段代码运行看看是不是跟我一样的,难道书中讲解有误?知道的高手请指教一下。
解决方案 »
- 写汇率转换软件时遇到的关于Text的使用问题
- 打印功能:
- 一个高难度的socket编程有谁帮我解决
- 希望大家推荐个学习ant的发好书
- generic
- 我的一个JTextPane不能显示垂直滚动条,有什么方法可以显示吗?
- JavaBeans 是什么?
- 请问哪里有SCJD的中文资料,和MOCK
- 我的理解有没有错,overrriding是参数必须不同,其它的必须相同,而overloading是参数不同外,存取操作符和返回类型可以不同,
- 为什么中文字符串在GridControl中显示不出来,可是在其他控件,如TextField中就是正常的?
- 求大能帮忙分析问题啊!!!
- NetBeans中无法导入java.lang.Math
开始关闭
关闭Socket所用的时间未:5651ms
开始关闭
关闭Socket所用的时间未:5651ms
关闭Socket所用的时间未:5703ms
关闭Socket所用的时间未:0ms
以及,具体的是哪个版本。不同版本的JVM对程序的实现,在细节上是有出入的。还有,操作系统对Socket的设置,也会有所不同,楼主可以看看是不是操作系统的原因。
不过,这个概率比较小,呵呵。
Socket s=new Socket();
s.setSoLinger(true, 3600);
s.connect(InetAddress.getByName("localhost"),8000);你的写法是不对的,new Socket("localhost",8000)返回时TCP握手已经完成,再设置soLinger已经没用了!