Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java codenameone顺序套接字写入/读取_Java_Sockets_Smtp_Codenameone - Fatal编程技术网

Java codenameone顺序套接字写入/读取

Java codenameone顺序套接字写入/读取,java,sockets,smtp,codenameone,Java,Sockets,Smtp,Codenameone,我正在尝试在我的应用程序中实现SMTP协议,但我在使用codenameoneSocketConnection对InputStream/OutputStream进行1次以上的写入/读取时遇到问题 这就是我到目前为止所做的: Socket.connect("<google ip>",25,new SocketConnection(){ @Override public void connectionError [...] @Override public

我正在尝试在我的应用程序中实现SMTP协议,但我在使用codenameone
SocketConnection对
InputStream/OutputStream
进行1次以上的写入/读取时遇到问题
这就是我到目前为止所做的:

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");
       }
    }
}
Socket.connect(“,25,新SocketConnection(){
@凌驾
公共无效连接人[…]
@凌驾
已建立公共无效连接(InputStream为,OutputStream os){
试一试{
BufferedInputStream in=新的BufferedInputStream(is);
BufferedOutputStream out=新的BufferedOutputStream(os);
字节[]响应=新字节[1024];
字符串z;
整数大小;
out.write(((“HELO mydomain.me”).getBytes());
out.flush();
大小=英寸读取(响应);
//in.标记(大小);
//in.reset();
z=新字符串(响应,0,大小);
系统输出打印ln(z);
响应=新字节[1024];
out.write((“邮件发件人:”).getBytes();
out.flush();
System.out.println(“我来了!”);
大小=英寸读取(响应);
System.out.println(“我从来没有到过这里!”;
z=新字符串(响应,0,大小);
系统输出打印ln(z);
[…其他我从未接触过的SMTP…]
}捕获(IOEX异常){
System.out.println(“我甚至没有收到连接错误”);
}
}
}
这是我得到的输出:

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

我到了!

程序被困在这里

这意味着“HELO…”及其响应工作正常,但随后它在尝试从
BufferedInputStream
读取第二次时遇到了问题

我曾尝试从
BufferedInputStream
切换到
InputStream
,所有
in.mark(size);
in.reset()
,只读取固定数量的字节(
in.read(response,0,200)
),但我没有成功


我能做些什么来解决这个问题呢?

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

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


顺便说一句,您可能可以使用一些,而不是构建自己的。

您不需要缓冲流,因为Codename One中的流在默认情况下已经被缓冲


我真的不记得SMTP协议,但请检查您的服务器是否支持此协议,然后尝试ehelo,添加crlf等。卡在读取上意味着服务器仍在等待您的输入。

使用原始的
InpuStream
OutputStream
和修复的
邮件发件人:
时,同样的问题仍然存在。我不认为可以使用
com.codename1
之外的外部库,在创建应用程序时可能会产生冲突。这是关于,所以这不适用。通常用户只使用我们的发送电子邮件API或从他们的服务器发送电子邮件。非常感谢!问题是CRLF。我修改了写入:
out.write(((“HELO mydomain.me\n”).getBytes();
,它正在工作!谢谢!