站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题流问题:flush()方法为什么刷不出去?

流问题:flush()方法为什么刷不出去?

摘要: 流问题:flush()方法为什么刷不出去?


BufferedWriter bw_output=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));

bw_output.write(-#34;login:-#39;11-#39;:-#39;22-#39;:select stPwd from T_student where stName=-#39;11-#39;-#34;.trim());
bw_output.flush();

代码如上,socket中,用BufferedWriter建立一个输出的流,调用write方法后,应该可以用bw_output.flush()方法把缓冲区内容刷出去。但实际上Server端却接收不到任何内容。

如果把bw_output.flush()改成bw_output.close()就可以了。

另外,调用close()后会扑捉到socket closed异常,完全不明白为什么。

望高人指点一二。谢谢!


看样子不像是“Server端却接收不到任何内容”,更像是由于服务器端程序的问题没有把收到的东西打印出来。


不可能吧,你调用了flush方法的话,它就一定会把缓存区的数据冲刷出去的


你再用PrintWriter包装一下
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);


我怀疑你服务器调用ReadLine了,结果你的Write并没有发送回车。所以Server的ReadLine还不会返回


这个问题我也碰到过,如楼上所说就是因为调用ReadLine方法了,结果Write并没有发送回车,只要用PrintWriter包装一下,调用PrintWriter类的println()方法就可以了,
Socket s = new Socket(ip,port) ;
OutputStream os = s.getOutputStream() ;
OutputStreamWriter osw = new OutputStreamWrite(os) ;
PrintWriter pw = new PrintWriter(osw,true) ;
pw.println(-#34;hello-#34;) ;


我也怀疑是调用了readLine,哈哈


我试了一下,还是不行,不管用write,还是println(),都必须将流关闭,out.close();才能正常输出,不报异常;
希望高手指点,这个问题挺奇怪!


你在定义PrintWriter对象时构造里面的参数是否有true?


有啊


问题解决了吗?



import java.awt.* ;
import java.awt.event.* ;
import javax.swing.* ;
import javax.swing.event.* ;
import java.io.* ;
import java.net.* ;
public class TcpServer extends JFrame implements Runnable
{
private JTextField jtf_address ;
private JLabel jl_address ;
private List list ;
private JTextField jtf_message ;
private Socket s ;
private InputStream is ;
private OutputStream os ;
private InputStreamReader isr ;
private BufferedReader br ;
private OutputStreamWriter osw ;
private PrintWriter pw ;
public TcpServer(Socket s)
{
this.s = s ;
try
{
is = s.getInputStream() ;
os = s.getOutputStream() ;
isr = new InputStreamReader(is) ;
br = new BufferedReader(isr) ;
osw = new OutputStreamWriter(os) ;
pw = new PrintWriter(osw,true) ;
}
catch(Exception e)
{
e.printStackTrace() ;
}

jtf_address = new JTextField() ;
jtf_address.setBounds(10,10,150,20) ;
String str_port = s.getRemoteSocketAddress().toString() ;
jtf_address.setText(str_port) ;
jl_address = new JLabel(-#34;客户端的IP地址和端口号-#34;) ;
jl_address.setBounds(170,10,150,20) ;
list = new List(15) ;
list.setBounds(10,40,300,300) ;
jtf_message = new JTextField() ;
jtf_message.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
String str = jtf_message.getText() ;
str = -#34;服务器说:-#34;+str ;
pw.println(str) ;
list.add(str) ;
jtf_message.setText(-#34;-#34;) ;
}
}) ;
jtf_message.setBounds(10,350,300,20) ;
Container c = this.getContentPane() ;
c.setLayout(null) ;
c.add(jtf_address) ;
c.add(jl_address) ;
c.add(list) ;
c.add(jtf_message) ;
this.setSize(400,400) ;
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
this.setVisible(true) ;
}
public void run()
{
String str ;
try
{
while((str=br.readLine())!=null)
{
str = -#34;客户端说:-#34;+str ;
list.add(str) ;
}
}
catch(Exception e)
{
e.printStackTrace() ;
}

}
public static void main(String[] args)
{
try
{
ServerSocket ss = new ServerSocket(3000) ;
while(true)
{
Socket s = ss.accept() ;
System.out.println (-#34;有一个客户端己经连接-#34;) ;
TcpServer ts = new TcpServer(s) ;
Thread t = new Thread(ts) ;
t.start() ;
}
}
catch(Exception e)
{
e.printStackTrace() ;
}

}
}
上面是服务器端
import java.awt.* ;
import java.awt.event.* ;
import javax.swing.* ;
import javax.swing.event.* ;
import java.io.* ;
import java.net.* ;
public class TcpClient extends JFrame implements Runnable
{
private JTextField jtf_address ;
private JLabel jl_address ;
private List list ;
private JTextField jtf_message ;
private Socket s ;
private InputStream is ;
private OutputStream os ;
private InputStreamReader isr ;
private BufferedReader br ;
private OutputStreamWriter osw ;
private PrintWriter pw ;
public TcpClient()
{

try
{
s = new Socket(-#34;127.0.0.1-#34;,3000) ;
is = s.getInputStream() ;
os = s.getOutputStream() ;
isr = new InputStreamReader(is) ;
br = new BufferedReader(isr) ;
osw = new OutputStreamWriter(os) ;
pw = new PrintWriter(osw,true) ;
}
catch(Exception e)
{
e.printStackTrace() ;
}

jtf_address = new JTextField() ;
jtf_address.setBounds(10,10,150,20) ;
String str_port = s.getRemoteSocketAddress().toString() ;
jtf_address.setText(str_port) ;
jl_address = new JLabel(-#34;服务器的IP地址-#34;) ;
jl_address.setBounds(170,10,150,20) ;
list = new List(15) ;
list.setBounds(10,40,300,300) ;
jtf_message = new JTextField() ;
jtf_message.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
String str = jtf_message.getText() ;

pw.println(str) ;
str = -#34;客户端说:-#34;+str ;
list.add(str) ;
jtf_message.setText(-#34;-#34;) ;
}
}) ;
jtf_message.setBounds(10,350,300,20) ;
Container c = this.getContentPane() ;
c.setLayout(null) ;
c.add(jtf_address) ;
c.add(jl_address) ;
c.add(list) ;
c.add(jtf_message) ;
this.setSize(400,400) ;
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
this.setVisible(true) ;
}
public void run()
{
String str ;
try
{
while((str=br.readLine())!=null)
{

list.add(str) ;
}
}
catch(Exception e)
{
e.printStackTrace() ;
}

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

TcpClient tc = new TcpClient() ;
Thread t = new Thread(tc) ;
t.start() ;
}
}
这是客户端


Server端的确调用了readline,原来还有这样的缘故在里面,看来需要学的东西还有好多阿~

多谢大家~我先去试试看~然后来告诉大家结果~


好啦~已经解决了~多谢各位`


↑返回目录
前一篇: 一直未得到解决的笔试题目
后一篇: 对象比较问题!在线等待......及时揭帖