繁体   English   中英

codenameone顺序套接字写/读

[英]codenameone sequential socket write/read

我正在尝试在我的应用程序中实现SMTP协议,但是我在使用codenameone SocketConnectionInputStream/OutputStream上进行多次写入/读取时遇到问题。
这是我到目前为止:

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!

程序卡在这里。

这意味着“HELO ...”及其响应工作正常,但随后它试图从BufferedInputStream再次读取它。

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

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

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

您可以检查的另一件事:我看到的SMTP示例在MAIL FROM:之后没有空格MAIL FROM:

顺便说一下,有几个用于SMTP的开源Java库,您可以使用它而不是构建自己的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM