一个关于java输入流的问题。。

时间:2023-02-24 22:15:43
这是服务端代码

import java.net.*;
import java.io.*;
public class Server{
private ServerSocket ss;
private Socket socket;
public Server(){
try{
ss = new ServerSocket(10000);
while(true){

socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String string = br.readLine();
bw.write(string,0,string.length());
br.close();
bw.close();
socket.close();
}
}
catch(IOException e){
System.err.println(e.toString());
}

}
public static void main(String args[]){
new Server();
}
}

以下是客户端代码

import java.net.*;
import java.io.*;
public class Client{
private Socket socket;
public Client(){
try{
while(true){
socket = new Socket("127.0.0.1",10000);
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
String string = br.readLine();
System.out.println(string);
br.close();
socket.close();
}
}
catch(IOException e){
System.err.println(e.toString());
}
}
public static void main(String args[]){
new Client();
}
}

请大虾们帮帮我,我的目的是可以在服务端不断地给客户端发送信息,为什么在服务端代码那边加上  br.close();  也就是关闭了输入流之后就只能发送一次信息,这究竟是为什么!!!

7 个解决方案

#1


BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后:
br.close();

也就是你把控制台的标准输入流(一般就是键盘)给关闭了,当然就再也得不到东西了。


所以把:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
放在循环体外。
br.close(),完全不需要,JVM会在程序结束的时候搞定它。

#2


引用 1 楼  的回复:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后:
br.close();

也就是你把控制台的标准输入流(一般就是键盘)给关闭了,当然就再也得不到东西了。


所以把:
BufferedReader br = new BufferedReader(new InputStrea……

谢谢!确实如您所说!我还有一个问题,为什么我把服务端的   bw.close();   这段代码注释掉的话,为什么我在服务端发信息时,客户端都是接收到null,关闭输出流那么重要吗?如果我把服务端的   socket.close()   也一并注释掉的话,那么我在服务端发的信息客户端就接受不了,而且只能在服务端进行一次输入,这又是为什么?不好意思。。我大一,刚学java,希望您能回答我,我感激不尽!

#3


引用 1 楼  的回复:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后:
br.close();

也就是你把控制台的标准输入流(一般就是键盘)给关闭了,当然就再也得不到东西了。


所以把:
BufferedReader br = new BufferedReader(new InputStrea……

谢谢!确实如您所说!我还有一个问题,为什么我把服务端的   bw.close();   这段代码注释掉的话,为什么我在服务端发信息时,客户端都是接收到null,关闭输出流那么重要吗?如果我把服务端的   socket.close()   也一并注释掉的话,那么我在服务端发的信息客户端就接受不了,而且只能在服务端进行一次输入,这又是为什么?不好意思。。我大一,刚学java,希望您能回答我,我感激不尽!

#4


你没有关闭的话是在缓存中的。所以没有发送。

#5



你单纯这样模拟,没有一点现实意义。
既然你做通信,那么就该附加于线程之上。没有线程的socket,还叫socket吗?
你可以参考这个:
http://hi.baidu.com/kai1379/blog/item/dc2362dc41d7c7086327980e.html

#6


因为流都有缓存,不是你write它就立即写给对方的,这样性能太低;那么在数据没写给对方之前,你直接把端口给关闭了,缓存中的数据就废了。而流的close()会先处理缓冲区,再关闭流本身(不是端口,注意)。

如果急于立即发送数据但又不想close流(不是端口),可以用 flush() 函数。


不过你目前的程序模型,是每次连接只发送一段数据。你想改成一次连接内连续发送数据的话,改动量不小。最好能买本书学习学习,自己摸索在入门阶段效率太低,不划算。

#7


谢谢你们的耐心回答,我现在大致了解了,感激不尽!!!

#1


BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后:
br.close();

也就是你把控制台的标准输入流(一般就是键盘)给关闭了,当然就再也得不到东西了。


所以把:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
放在循环体外。
br.close(),完全不需要,JVM会在程序结束的时候搞定它。

#2


引用 1 楼  的回复:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后:
br.close();

也就是你把控制台的标准输入流(一般就是键盘)给关闭了,当然就再也得不到东西了。


所以把:
BufferedReader br = new BufferedReader(new InputStrea……

谢谢!确实如您所说!我还有一个问题,为什么我把服务端的   bw.close();   这段代码注释掉的话,为什么我在服务端发信息时,客户端都是接收到null,关闭输出流那么重要吗?如果我把服务端的   socket.close()   也一并注释掉的话,那么我在服务端发的信息客户端就接受不了,而且只能在服务端进行一次输入,这又是为什么?不好意思。。我大一,刚学java,希望您能回答我,我感激不尽!

#3


引用 1 楼  的回复:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
然后:
br.close();

也就是你把控制台的标准输入流(一般就是键盘)给关闭了,当然就再也得不到东西了。


所以把:
BufferedReader br = new BufferedReader(new InputStrea……

谢谢!确实如您所说!我还有一个问题,为什么我把服务端的   bw.close();   这段代码注释掉的话,为什么我在服务端发信息时,客户端都是接收到null,关闭输出流那么重要吗?如果我把服务端的   socket.close()   也一并注释掉的话,那么我在服务端发的信息客户端就接受不了,而且只能在服务端进行一次输入,这又是为什么?不好意思。。我大一,刚学java,希望您能回答我,我感激不尽!

#4


你没有关闭的话是在缓存中的。所以没有发送。

#5



你单纯这样模拟,没有一点现实意义。
既然你做通信,那么就该附加于线程之上。没有线程的socket,还叫socket吗?
你可以参考这个:
http://hi.baidu.com/kai1379/blog/item/dc2362dc41d7c7086327980e.html

#6


因为流都有缓存,不是你write它就立即写给对方的,这样性能太低;那么在数据没写给对方之前,你直接把端口给关闭了,缓存中的数据就废了。而流的close()会先处理缓冲区,再关闭流本身(不是端口,注意)。

如果急于立即发送数据但又不想close流(不是端口),可以用 flush() 函数。


不过你目前的程序模型,是每次连接只发送一段数据。你想改成一次连接内连续发送数据的话,改动量不小。最好能买本书学习学习,自己摸索在入门阶段效率太低,不划算。

#7


谢谢你们的耐心回答,我现在大致了解了,感激不尽!!!