codenameone顺序套接字写/读

时间:2017-11-22 15:17:19

标签: java sockets smtp codenameone

我尝试在我的应用中实施SMTP协议,但是使用codenameone InputStream/OutputStreamSocketConnection上进行多次写入/读取时遇到问题。
这就是我到目前为止所做的:

Socket.connect("<google ip>",25,new SocketConnection(){
    @Override
    public void connectionError [...]

    @Override
    public void connectionEstablished(InputStream is, OutputStream os){
       try{
          BufferedInputStream in = new BufferedInputStream(is);
          BufferedOutputStream out = new BufferedOutputStream(os);
          byte[] response = new byte[1024];
          String z;
          int size;

          out.write( ("HELO mydomain.me").getBytes() );
          out.flush();
          size = in.read(response);
          //in.mark(size);
          //in.reset();
          z = new String(response, 0 ,size);
          System.out.println(z);
          response = new byte[1024];

          out.write( ("MAIL FROM: <myaddress@bubu.me>").getBytes() );
          out.flush();
          System.out.println("I get here!");
          size = in.read(response);
          System.out.println("I NEVER get here!");
          z = new String(response, 0 ,size);
          System.out.println(z);

          [... rest of SMTP that I never reach ...]

       }catch(IOException ex){
          System.out.println("I don't even get connection errors");
       }
    }
}

这是我得到的输出:

220 mx.google.com ESMTP [...] -gsmtp

i get here!

程序卡在这里。

这意味着&#34; HELO ...&#34;并且它的响应工作正常,但是当它试图从BufferedInputStream第二次读取时会遇到困难。

我尝试从BufferedInputStream切换到InputStreamin.mark(size);in.reset()的所有组合,只读取固定数量的字节(in.read(response, 0 , 200)) ,但我没有设法让它工作。

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:0)

我首先要从两个流中删除缓冲,至少目前是这样,因为(a)会缩小嫌疑人列表,(b)这是一个可能不需要的优化,并使示例代码复杂化,(c) )SocketConnection本身可能会在幕后缓冲流。

您可以检查的另一件事:我看到的SMTP示例在<table id="rankTable"> <thead> <tr> <th>First Name</th> <th>Last Name</th> </tr> </thead> <tbody> </tbody> </table> 之后没有空格。

顺便说一句,您可以使用several open source Java libraries for SMTP而不是自己构建。

答案 1 :(得分:0)

您不需要缓冲的流,因为Codename One中的流已默认缓冲。

我真的不记得SMTP协议,但检查你的服务器是否支持这个并尝试ehelo,添加crlf等。坚持读取只是意味着服务器仍在等待你的输入。