CodenameOne序列套接字的写入/读取

3

我正在尝试在我的应用程序中实现SMTP协议,但是使用codenameone的SocketConnection进行多个InputStream/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 我在这里停下来了。
这意味着 "HELO ..." 和它的响应正常工作,但是接下来它在尝试第二次从 BufferedInputStream 读取时卡住了。
我尝试过从 BufferedInputStream 切换到 InputStream,使用 all combination of in.mark(size); , in.reset() ,只读取固定数量的字节(in.read(response, 0, 200)),但我无法让它工作起来。
我该怎么做才能解决这个问题?
2个回答

0

我建议先暂时从两个流中移除缓冲,因为这样可以缩小嫌疑人列表,而且这是一种可能不需要的优化,会使示例代码变得更加复杂。另外,SocketConnection本身可能在幕后缓冲流。

还有一件事情你可以检查:我看到的SMTP示例在MAIL FROM:后面没有空格。

顺便说一下,有几个开源的Java SMTP库,你可以使用它们来代替自己构建。


1
当使用原始的InpuStreamOutputStream和固定的MAIL FROM:时,同样的问题仍然存在。 我认为我不能在创建应用程序时使用com.codename1之外的外部库,这可能会导致冲突。 - Davide
1
这是关于Codename One的内容,因此不适用。通常用户只需使用我们的发送电子邮件API或从其服务器代码触发电子邮件发送。 - Shai Almog

0

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

我不太记得SMTP协议,但请检查您的服务器是否支持它,并尝试使用ehelo、添加crlf等。被阻塞在读取上只意味着服务器仍在等待您的输入。


嗨Shai,非常感谢!问题是CRLF。 我修改了写入的内容: out.write(("HELO mydomain.me\n").getBytes()); 现在它可以正常工作了! 谢谢! - Davide

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接