黑马程序员技术交流社区
标题:
ServerSocket类中的accept方法(阻塞式方法)何解?与wait()方法
[打印本页]
作者:
huanying
时间:
2012-3-31 17:26
标题:
ServerSocket类中的accept方法(阻塞式方法)何解?与wait()方法
class PicServer
{
public static void main(String[] args)throws Exception
{
ServerSocket ss=new ServerSocket(10000);
//拿到客户端对象
Socket s=ss.accept();//阻塞式的方法
//然后再读这个对象,读取Socket流中的数据
InputStream in=s.getInputStream();
//紧跟着把数据写到文件里面去;
FileOutputStream fos=new FileOutputStream("server.bmp");
//你读一个咱写一个,再来个缓冲区;
byte[] buf=new byte[1024];
//往文件里写
int len=0;
while((len=in.read(buf))!=-1)
{
fos.write(buf, 0, len);
}
//写完以后,Socket输出流给客户端返回个信息
OutputStream out=s.getOutputStream();
out.write("上传成功".getBytes());
fos.close();
s.close();
ss.close();//服务一次就关掉;
}
}
作者:
陈扬
时间:
2012-3-31 18:55
1、ServerSocket的accept()方法是侦听并接受到此套接字的连接,就是一直等待连接,此方法在连接传入之前一直阻塞。直到接受到有socket的连接。
2、wait()涉及到多线程,而在谈到多线程的时候我们常说的一个概念是锁。这里我们把它想象成为一把真正的锁。把线程想象成一个个动态的人,
他们想进去一个屋子,但是通往这个屋子的门有一个洞,这个洞只能同时一个人钻进去。这就相当于synchronized 的作用。
这个屋的们上有一把锁。锁就等于condition。满足这个条件就相当于能打开锁。这时要注意这个锁指只能挂在屋的门上的,
就相当于你说的资源类上面。而不能挂在人上面,因为人是动态的,挂在某个人身上别的人就找不到了。
所以说一个对象的wait()方法只能在此对象的同步方法中被调用,意思是,这个对象在wait前是被加了锁的。
作者:
王运科
时间:
2012-3-31 20:28
一、Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket。不能使用返回的这个 Socket 接受连接队列中的任何附加连接。然而,可以调用返回的 Socket 的 RemoteEndPoint 方法来标识远程主机的网络地址和端口号。在阻止模式中,Accept 将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的 Socket 继续将传入的连接请求排入队列,直到您关闭它。
二、wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
作者:
高铭
时间:
2012-3-31 21:59
accept是挂起 也就说服务端在这停着不动.. 需要一个客户端来激活他 然后他在给客户端反馈一个信息
wait是本线程等待机制其他线程执行 需要notify唤醒 才可以继续执行 一次只能执行一个线程
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2