具体例子是我用socket做一个发邮件的东西,用smtp协议
然后command里面有一步是输入内容
我想输入比如
From:。
To:。
Date:;;;;
然后这些操作是通过console输入到cmd再到socket
但是现在一按回车就输入了,比如我输入From:然后回车想写第二行,就输入了就结束通信了
不知道有什么办法呢?
或者谁解释下这里cmd和socket中字符的关系
多谢了package testPackage;//SMTPDemo.java
import java.io.*;
import java.net.*;
import javax.mail.*;
class SMTPDemo
{
public static void main (String [] args)
{
String SMTPServer = "smtp.groept.be";
int SMTPPort = 25;
Socket client = null;
try
{
// 向SMTP服务程序建立一个套接字连接。
client = new Socket (SMTPServer, SMTPPort);
// 创建一个BufferedReader对象,以便从命令行读取用户输入。
BufferedReader stdin;
stdin = new BufferedReader (new InputStreamReader (System.in));
// 创建一个BufferedReader对象,以便从套接字读取输出。
InputStream is = client.getInputStream ();
BufferedReader sockin;
sockin = new BufferedReader (new InputStreamReader (is));
// 创建一个PrintWriter对象,以便向套接字写入内容。
OutputStream os = client.getOutputStream ();
PrintWriter sockout;
sockout = new PrintWriter (os, true);
// 显示同SMTP服务程序的握手过程。
System.out.println ("S:" + sockin.readLine ());
while (true)
{
System.out.print ("C:");
// 读取用户输入。
String cmd = stdin.readLine ();
// 将用户输入的命令发送到SMTP服务程序。
sockout.println (cmd);
// 从套接字读取SMTP服务程序的回应消息并显示在屏幕上。
String reply = sockin.readLine ();
System.out.println ("S:" + reply);
// 如果发送了DATA命令并且获得成功的回应消息,从输入设备读取行,
// 直到读取到完全由句号组成的行时停止, 这些行构成了电子邮件。
if (cmd.toLowerCase ().startsWith ("data") &&
reply.substring (0, 3).equals ("354"))
{
do
{
cmd = stdin.readLine ();
if (cmd != null && cmd.length () > 1 )
cmd = ".";
sockout.println (cmd);
if (cmd.equals ("."))
break;
}
while (true);
// 从SMTP服务程序中读取回应消息并显示。
reply = sockin.readLine ();
System.out.println ("S:" + reply);
continue;
}
// 如果用户输入QUIT命令,则退出程序。
if (cmd.toLowerCase ().startsWith ("quit"))
break;
}
}
catch (IOException e)
{
System.out.println (e.toString ());
}
finally
{
try
{
if (client != null)
client.close ();
}
catch (IOException e)
{
}
}
}
}

解决方案 »

  1.   

    你说的有道理的,这只是我网上找到的模板,最终我想用UI实现这个,所以在console里面输入只是一个暂时的问题,我只是想知道作为嵌套字socket来说他是怎么读取换行符的
      

  2.   

    还是按行读入输入,不过可以给出一个结束标志,比如一个在输入中绝对不会用到的字符串。
    pop和smtp协议就是根据所有的信息传完后输入一个空行加只有一个点的行来做的。
    读取的时候循环读入行,最后读入你的结束标志后停止。
      

  3.   

    放在缓存了面全部输入晚了再socket