黑马程序员技术交流社区
标题:
学习毕老师网络编程时想到的问题
[打印本页]
作者:
李辉
时间:
2013-3-11 15:04
标题:
学习毕老师网络编程时想到的问题
有两个问题: 1.毕老师第23天的例子中,老师做了两个程序,一个负责发送,一个负责接收,那这两个程序肯定是用的一个jre,问题是当jre运行两个java程序时,一个程序如果结束了,另一个程序还没运行完,虚拟机不会停止(我用下面的例子测试过了),这种情况跟多线程有关系吗?
import java.net.*;
class SocketSend
{
public static void main(String[] args)throws Exception
{
DatagramSocket ds=new DatagramSocket();
byte[] bt="hello world".getBytes();
DatagramPacket dp=new DatagramPacket(bt,bt.length,InetAddress.getLocalHost(),10000);
for (int i=0;i<10 ;i++ )
{
ds.send(dp);
}
ds.close();
}
}
class SocketReceive
{
public static void main(String[] args) throws Exception
{
DatagramSocket ds=new DatagramSocket(10000);
byte[] bt=new byte[1024];
DatagramPacket dp=new DatagramPacket(bt,bt.length);
for ( int i=0;i<50 ;i++ )
{
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();
System.out.println(ip+"::"+data+"::"+port);
}
ds.close();
}
}
问题2: 毕老师在演示这个程序时,每次测试发送方用的端口都不一样,他解释说之前用的端口还在占用,可是我想ds.close()操作不是已经释放资源了吗?为什么端口还在占用? 莫非是老师说错了,实际应该是重新运行时系统又随机分配一个端口,恰好和之前不一样而已。 求真相!!!
作者:
沈文杰
时间:
2013-3-11 18:54
问题一:public void receive(DatagramPacket p)
throws IOException从此套接字接收数据报包。当此方法返回时,DatagramPacket 的缓冲区填充了接收的数据。数据报包也包含发送方的 IP 地址和发送方机器上的端口号。
此方法在接收到数据报前一直阻塞。
数据报包对象的 length 字段包含所接收信息的长度。如果信息比包的长度长,该信息将被截短。
问题二,求解答。
作者:
黄基焜
时间:
2013-3-11 18:58
问题2,毕老师视频上也说过,端口不会马上释放的,要隔一段时间,你试下close后1小时再运行会不会再占用。
作者:
郑昌奋
时间:
2013-3-11 23:25
问题二:ds.close()是关闭了释放资源,但是由于可能是内存中有一定的缓存区域,还没有完全释放完的。还处于wait_time状态,过段时间后才可以完全释放。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2