高分请教,关于socket阻塞问题

xzm2000 2004-01-05 09:02:15
我在很多地方看到是编写接收socket流的列子,但是我按照列子中的代码书写,总是会在读完数据后阻塞,原因可能是 服务器端写完流后并不关闭socket,还要等待用户输入后在继续输出,请问这种情况我的代码该如何修改?

Socket client = new Socket(host, port);
InputStream is = client.getInputStream();
DataInputStream dis = new DataInputStream(is);
String line = "";
while((line = dis.readLine()) != null)
{
System.out.println(line);
}
...全文
37 点赞 收藏 15
写回复
15 条回复
lapwing2002 2004年01月06日
建议你使用线程池吧
回复 点赞
xzm2000 2004年01月05日
up
回复 点赞
xzm2000 2004年01月05日
up
回复 点赞
xzm2000 2004年01月05日
-->"原因可能是 服务器端写完流后并不关闭socket"
那就处理完后自己把Socket关掉嘛 !

服务器端的程序不是我写的,比如一个ftp服务器,我要下载一个文件,首先连上后验证用户,验证通过后服务器端等待我发命令,而不能关闭socket,但是客户端又因为被阻塞不能继续发命令,就耗在这了
回复 点赞
wisure 2004年01月05日
web应用不像windows应用,web是无状态的,要做线程处理很麻烦,而且我的web程序放在服务器机群中,对于发送数据的服务器来说web是客户端,对于终端用户来说web是服务端,当用户并发一上来,线程的消耗就相当客观。

不开线程就没有办法了吗?
回复 点赞
honkyjiang 2004年01月05日
"原因可能是 服务器端写完流后并不关闭socket"
那就处理完后自己把Socket关掉嘛 !
回复 点赞
tiger_wkh52741 2004年01月05日
虽然是web,但是一个好的线程控制能力所用的网络资源开销换来的相比之下的顺畅的服务端和客户端数据的畅通的代价是值得的!你说呢?
回复 点赞
xzm2000 2004年01月05日
可是我做的是web应用,启动线程可能开销太大
回复 点赞
lapwing2002 2004年01月05日
启动一个单独的线程监听Socket,在读到数据后触发一个事件或者调用回调函数
回复 点赞
CoolAbu 2004年01月05日
你下面这段代码只是和服务器建立了某种连接,你没有发送讯息给服务器,服务器所以也不会给你发送讯息。你可以改改服务器段代码,在接收到连接的时候发送一个消息到连接端。
Socket client = new Socket(host, port);
InputStream is = client.getInputStream();
DataInputStream dis = new DataInputStream(is);
String line = "";
while((line = dis.readLine()) != null)
{
System.out.println(line);
}
回复 点赞
CharmingChen 2004年01月05日
回复 点赞
betterjonah 2004年01月05日
让服务器发送一个结束命令
回复 点赞
xinshou1979330 2004年01月05日
关注
帮楼主顶一下吧
回复 点赞
xzm2000 2004年01月05日
web程序应该可以用socket的,简单的比如数据库的数据获取,web服务器上的jsp提交sql搜索语句,然后从数据库服务器上得到结果集返回,这种通讯低层肯定是用socket实现的,不然还有什么方式传送数据?
回复 点赞
javacofe 2004年01月05日
web应用不能用socket这个是肯定的。
你说的可能是cs的程序,服务器端阻塞是为了监听客户端的请求,有请求了就对客户端返回数据,得以继续工作。要是想关掉socket的话就没法工作了,socket是保持状态的。
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告