小弟遇到一个问题怎么也想不通!
是一个关于简陋聊天小程序,一个Server,一个Client;
在Server端向Client输出数据的时候,我先用PrintWriter流,结果正确实现目的.可是,我后来改用BufferedWriter流,调用
其write方法写一字符串出去(马上后面跟flush),但是Client却接受不到数据,程序傻死在那里,调试了半天也找不到原因,请各位高手赐教,不胜感激,谢谢!!!

解决方案 »

  1.   

    //PrintWriter pw = new PrintWriter(s.getOutputStream());
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    这是里面主要改动地方
      

  2.   

    把下面的怎么写的和client怎么读的都贴出来,否则判断不了错误,刚才试了下,怎么向外流,都不会死住,是你没贴出来的部分出问题了,
      

  3.   

    server:
    import java.io.*;
    import java.net.*;
    public class TalkServer {
    public static void main(String[] args) {
    try{
    ServerSocket ss = new ServerSocket(5888);
    while(true) {
    Socket s = ss.accept();
    System.out.println("a client connected");
    InputStreamReader isr = new InputStreamReader(s.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    //PrintWriter pw = new PrintWriter(s.getOutputStream());
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    String s1, s2;
    s1 = br.readLine();
    System.out.println("client: " + s1);
    InputStreamReader isr2 = new InputStreamReader(System.in);
    BufferedReader br2 = new BufferedReader(isr2);
    while(true) {
    s2 = br2.readLine();
    //pw.println(s2);
    //pw.flush();
    bw.write(s2);
    bw.flush();
    if(s2.compareToIgnoreCase("bye") == 0) {
    break;
    }
    s1 = br.readLine();
    System.out.println("Client: " + s1);

    }
    br.close();
    br2.close();
    //pw.close();
    bw.close();
    s.close();
    }
    } catch(Exception e) {
    e.printStackTrace();
    }
    }
    }client:
    import java.io.*;
    import java.net.*;public class TalkClient {
    public static void main(String[] args) {
    try{
    Socket s = new Socket("222.71.35.61",5888); InputStreamReader isr = new InputStreamReader(s.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    PrintWriter pw = new PrintWriter(s.getOutputStream()); String s1, s2;
    InputStreamReader isr2 = new InputStreamReader(System.in);
    BufferedReader br2 = new BufferedReader(isr2);
    s2 = br2.readLine();
    pw.println(s2);
    pw.flush();

    while(true) {
    s1 = br.readLine();
    System.out.println("Server: " + s1);

    s2 = br2.readLine();
    pw.println(s2);
    pw.flush();
    if(s2.compareToIgnoreCase("bye") == 0) {
    break;
    }
    }

    br.close();
    br2.close();
    pw.close();
    s.close(); } catch(Exception e) {
    e.printStackTrace();
    } }
    }
      

  4.   

    奇怪了,只要把PrintWriter流改用BufferedWriter流,利马就出问题,想不通啊,请赐教
      

  5.   

    server:
    import java.io.*;
    import java.net.*;public class TalkClient {
    public static void main(String[] args) {
               try{
    Socket s = new Socket("222.71.35.61",5888); InputStreamReader isr = new InputStreamReader(s.getInputStream());
    BufferedReader br = new BufferedReader(isr);
    PrintWriter pw = new PrintWriter(s.getOutputStream()); String s1, s2;
    InputStreamReader isr2 = new InputStreamReader(System.in);
    BufferedReader br2 = new BufferedReader(isr2);
    s2 = br2.readLine();
    pw.println(s2);
    pw.flush();
                            while(true) {
    s1 = br.readLine();
    System.out.println("Server: " + s1);

    s2 = br2.readLine();
    pw.println(s2);
    pw.flush();
    if(s2.compareToIgnoreCase("bye") == 0) {
    break;
    }
    }

    br.close();
    br2.close();
    pw.close();
    s.close();
                   } catch(Exception e) {
    e.printStackTrace();
    } }
    }
      

  6.   

    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;
    import java.util.*;public class ChatClient extends Frame {
    TextField tfTxt = new TextField();
    TextArea taContent = new TextArea();
    String IPAddress=null;
    //此String 型变量用来提取由构造函数所引入的IP地址
    Socket s=null;//成员变量,解决在send信息时的问题
        DataOutputStream dos=null;
        DataInputStream dis=null;
        private boolean bConnected=false;
    //构造函数用来提取IP
    public ChatClient(String IP){
    IPAddress=IP;
    }
    //Main Function
        public void mainfunction(){
    //public static void main(String[] args) {
    new ChatClient(IPAddress).launchFrame(); 
    }

    public void launchFrame() {
    setLocation(400, 300);
    this.setSize(300, 300);
    this.setTitle("嘻嘻QQ-聊天");
    add(tfTxt, BorderLayout.SOUTH);
    add(taContent, BorderLayout.NORTH);
    pack();

    this.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent arg0) {
    disconnect();
    System.exit(0);
    }
    });
    tfTxt.addActionListener(new TextFieldListener());
    setVisible(true);//设置显示属性为可见
    connect();//连接

    new Thread(new RecvThread()).start();//线程启动
    }

    //建立连接服务器端的连接的方法
    public void connect(){
    try{
    s=new Socket(IPAddress,8888);
    dos=new DataOutputStream(s.getOutputStream());
    dis=new DataInputStream(s.getInputStream());

    System.out.println("3:登陆成功");
    bConnected=true;
    }catch(UnknownHostException e){
    e.printStackTrace();
    }catch(IOException e){
    e.printStackTrace();
    }
    }

    //清理结束时的资源
    public void disconnect(){
    try{
    dos.close();
    dis.close();
    s.close();
    }catch(IOException e){
    e.printStackTrace();
    }
    }

    private class TextFieldListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
    String str=new Date()+"--"+tfTxt.getText().trim();
    //去掉两边的空格,然后提取
    tfTxt.setText("");
    try{
    //dos=new DataOutputStream(s.getOutputStream());
    dos.writeUTF(str);
    dos.flush();//良好编程习惯
    //dos.close();
    }catch(IOException e1){
    e1.printStackTrace();
    }//写出字符串
    }
    }//TextField监听 
    private class RecvThread implements Runnable{
    public void run(){
    while(bConnected){
    try{
    String str=dis.readUTF();
    //taContent.setText(taContent.getText()+str+"\n");
    String message=str;
                 taContent.append("\n"+str);
                 taContent.setCaretPosition(taContent.getText().length());
    }catch(SocketException e){
    bConnected=false;
    System.out.println("4:与服务器连接已经断开");
    }catch(EOFException e){
    e.printStackTrace();
    }catch(IOException e){
    e.printStackTrace();
    }//end of catch
    }
    }//end void run()
    }
    }
    -----------------------------------------------
    登陆注册截面就不发出了!
      

  7.   

    你这个问题用了我一个小时,看懂你的代码就用了n长时间,寒啊,
    最后查了下jdk的源码
    bw.write(s2);
    bw.write("\n");
    bw.flush();
    要换行才行,因为你的另一方是readline即读一行嘛.
        /**
         * Terminates the current line by writing the line separator string.  The
         * line separator string is defined by the system property
         * <code>line.separator</code>, and is not necessarily a single newline
         * character (<code>'\n'</code>).
         */
        public void println() {
    newLine();
        }
    关键就在这呢
        private void newLine() {
    try {
        synchronized (lock) {
    ensureOpen();
    out.write(lineSeparator);
    if (autoFlush)
        out.flush();
        }
    }
      

  8.   

    修改你的TalkServer
    BufferedWriter在write后不会输出换行符合的.PrintWriter会输出,重方法名上也看得出来,不过有的时候不一定会联想到,这时候可以debug跟踪下源码.
      

  9.   

    取当前操作系统的换行符号
    System.getProperty("line.separator")BWT:你最后完善下你程序了,读起来真累,中途差点想放弃回答这个问题.
      

  10.   

    Bye The Way 打成BWT了,看来是困了,睡觉....
      

  11.   

    呵呵!你的程序太看很累,帮你改了几次,都乱了!
    我重写过一个给你看看,用多线程的,一个线程写,一个线程收
    Server:package example.socket.test;
    import java.io.*;
    import java.net.*;
    public class EchoServer {
     public static void main(String[] args) throws IOException{
     ServerSocket s = new ServerSocket(8888);
     try{
     while(true){
     Socket socket=s.accept();
     new writerserver(socket).start();
     new getserver(socket).start();
     }
     }catch(Exception e){
     System.out.println(e.getMessage());
     }
     }
    }
    class writerserver extends Thread{
    private PrintWriter pw = null;
    private BufferedReader br = null;
    private Socket socket = null;

    public writerserver(Socket socket){
    this.socket = socket;
    try{
    pw = new PrintWriter(socket.getOutputStream());
    br = new BufferedReader(new InputStreamReader(System.in));
    }catch(Exception e ){
    System.out.println(e.getMessage());
    }
    }

    public void run(){
    while(true){
    try{
    String str = br.readLine();
    pw.println(str);
    pw.flush();
    }catch(Exception e){
    System.out.println("Error getclient.run():"+e.getMessage());
    }
    }
    }
    }

    class getserver extends Thread{
    private BufferedReader br = null;
    private Socket socket = null;

    public getserver(Socket socket){
    this.socket = socket;
    try{
    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }catch(Exception e){
    System.out.println(e.getMessage());
    }
    }

    public void run(){
    while(true){
    try{
    String str = br.readLine().trim();
    System.out.println("收到:"+str);
    }catch(Exception e ){
    System.out.println(e.getMessage());
    }
    }
    }
    }
    Client:package example.socket.test;
    import java.io.*;
    import java.net.*;
    import java.util.*;public class EchoClient {
    public static void main(String[] args){
    String addr = "127.0.0.1";
    try{
    Socket socket = new Socket(addr,8888);
    System.out.println("socket="+socket);
    new writerclient(socket).start();
    new getclient(socket).start();
    }catch(Exception e){
    System.out.println(e.getMessage());
    }finally{
    //socket.close();
    }
    }
    }class writerclient extends Thread{
    private Socket socket = null;
    private BufferedReader br = null;
    private PrintWriter pw = null;

    public writerclient(Socket socket){
    this.socket = socket;
    try{
    br = new BufferedReader(new InputStreamReader(System.in));
    pw = new PrintWriter(socket.getOutputStream());
    }catch(Exception e){
    System.out.println(e.getMessage());
    }
    }

    public void run(){
    while(true){
    try{
    String str = br.readLine();
    pw.println(str);
    pw.flush();
    }catch(Exception e){
    System.out.println("Error getclient.run():"+e.getMessage());
    }
    }
    }
    }class getclient extends Thread {
    private PrintWriter pw = null;
    private Socket socket = null;
    private BufferedReader br = null;

    public getclient(Socket socket){
    this.socket = socket;
    try{
    br =  new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }catch(Exception e){
    System.out.println(e.getMessage());
    }
    }

    public void run(){
    while(true){
    String str = null;
    try{
    if((str = br.readLine().trim())!=null){
    System.out.println("收到:"+str);
    }
    }catch(Exception e){
    System.out.println(e.getMessage());
    }
    }
    }
    }
      

  12.   

    高手啊,楼上的谢谢提醒,不过为什么BufferedWriter在write后不会输出换行会导致这样问题,想请指点下
      

  13.   

    你的程序的readLine(),有些在While循环里,有些又在外面,这方法是阻塞的!!搞的我都不知道那里阻塞了
    那个BufferedWriter,你是想用这个做缓冲流,
    可以用数组啊,你这样byte[] buffer = new byte[10];,再送过去