2011-11-25 31 views
1

我在写一个小型客户端应用程序来与服务器进行通信。我在我的客户端和服务器之间打开一个套接字,并且可以使用BufferedReader读取从服务器发出的任何内容。这是在一个线程中读取。但是,当我使用BufferedReader在套接字上编写代码时,没有任何反应!无异常,但没有任何服务器响应(和它应该有一个服务器响应) 这里是我的代码:BufferedWriter和java中的套接字写入没有效果

socketWritter.write(message); 
socketWritter.write("\n"); 
System.out.println(socketWritter.toString()); 
socketWritter.flush(); 

我的插座是正确的开放和万亩的BufferedWriter正确初始化:

new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) 

我没有想法为什么这不起作用? 任何帮助将是伟大的! Regards

+1

该代码正确。你可以发布整个代码或链接(对于较大的文件)? – blackcompe

+0

[链接](http://db.tt/9RIqS4wR)这是我写的代码。该视图文件只包含用户界面的东西。感谢您的帮助 – rmonjo

+0

此问题应该关闭为'无法重现'。 – EJP

回答

12

您的代码是正确的。我用一个通用服务器来测试它,它会响应客户端发送的任何内容,并且它工作正常(没有更改)。可能是因为你使用的服务器有问题。我注意到的一件事是,对于我的服务器,每次写入输出流时都需要添加一个新行字符,因为它实际上发送了数据。我敢打赌,这就是为什么你的GUI没有收到任何东西。以下是我的服务器中的客户端线程类:

class ClientThread extends Thread { 

    private Socket   sock; 
    private InputStream  in; 
    private OutputStream out; 

    ClientThread(Socket sock) { 
     this.sock = sock; 
     try { 
      this.in = sock.getInputStream(); 
      this.out = sock.getOutputStream(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    //Echos whatever the client sends to it 
    public void run() { 
     BufferedReader bufIn = new BufferedReader(new InputStreamReader(in)); 
     BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(out)); 
     while (true) { 
      try { 
       String msg = bufIn.readLine(); 
       System.out.println("Received: " + msg); 
       bufOut.write(msg); 
       bufOut.newLine(); //HERE!!!!!! 
       bufOut.flush(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

     } 
    } 

} 
+0

问题是,当使用telnet时,服务器响应如例外。我在java中写入我的套接字的内容与我写入telnet命令行的内容完全相同。谢谢你的帮助。 – rmonjo

+0

这可能是一个字符串编码的问题。例如,服务器是UTF-8,我发送给它Ansi(或类似的东西) – rmonjo

+0

再次阅读您的答案,实际上,我的用户界面接收一切(使用telnet登录到服务器时保持活动数据包或信息)。但是当我写在套接字(不使用telnet)时,服务器就好像它没有得到任何东西:((( – rmonjo

1

在这一点上,没有令人信服的证据表明您的客户端代码不起作用。特别是,这个声明:

System.out.println(socketWritter.toString()); 

不会告诉你任何有用的东西。只有Stream对象的toString()方法很可能只会告诉你对象的类名和它的标识哈希码。它当然不会告诉你你写到流中的内容。

鉴于这一点,没有明确的证据表明flush没有奏效。 (问题可能在服务器端。)

+0

是的,确定toString只是一个绝望的尝试!它不是来自服务器,因为使用telnet,正确键入在消息变量中发送的内容,服务器响应 – rmonjo