[英]codenameone sequential socket write/read
我正在尝试在我的应用程序中实现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
i get here!
程序卡在这里。
这意味着“HELO ...”及其响应工作正常,但随后它试图从BufferedInputStream
再次读取它。
我试图从BufferedInputStream
切换到InputStream
, in.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.