当前位置: 技术问答>java相关
高手看看我的socket用法有何错误???
来源: 互联网 发布时间:2015-08-15
本文导语: 我想编写一个程序,通过socket发命令到邮件管理服务器程序,做诸如添加用户等操作。现在可以成功登录,并且可以发命令,能成功执行。 只是有一点不明白:在用telnet直接操作时,每输入一条命令运行结束后,会...
我想编写一个程序,通过socket发命令到邮件管理服务器程序,做诸如添加用户等操作。现在可以成功登录,并且可以发命令,能成功执行。
只是有一点不明白:在用telnet直接操作时,每输入一条命令运行结束后,会有结果返回,而我用程序执行时,却取不到这个结果。程序会一直不动,直到超时,为何??????
public class MailServerManage{
Socket mailSocket;
PrintWriter outToServer;
BufferedReader is;
public void MailServerManage()
{}
public boolean connect(String host,int port,String user,String psw)
{
byte[] bt = new byte[255];
int bytesRead = 0;
try{
mailSocket = new Socket(host,port);
mailSocket.setTcpNoDelay(true);
is=new BufferedReader(new InputStreamReader(mailSocket.getInputStream()));
outToServer= new PrintWriter (mailSocket.getOutputStream());
System.out.println("connected...");
outToServer.println("root");
outToServer.println("root");
}
catch(UnknownHostException ex){
System.out.println("Could not resolve host name: "+ex.getMessage());
return false;
}
catch(IOException ex){
System.out.print("A communication error occured:"
+ex.getClass().getName()+": "+ex.getMessage());
return false;
}
return true;
}
public String command(String cmd)
{
String retStr="";
try{
outToServer.println(cmd);
String line=null;
String getS="";
while((line=is.readLine())!=null){//如果注释掉这段读的代码,则可正常运行
line=is.readLine();
getS=getS+line+"n";
}
System.out.println(getS);
}catch(IOException ex){
return "";
}
return retStr;
}
public void disconnect()
{
try{
outToServer.flush();
mailSocket.close();
}catch(Exception ex){
}
}
public static void main(String args[])
{
MailServerManage msm=new MailServerManage();
String st="";
if(msm.connect("192.168.1.8",4555,"root","root"))
st=msm.command("deluser abcn");
System.out.println(st+"abcde");
msm.disconnect();
}
}
只是有一点不明白:在用telnet直接操作时,每输入一条命令运行结束后,会有结果返回,而我用程序执行时,却取不到这个结果。程序会一直不动,直到超时,为何??????
public class MailServerManage{
Socket mailSocket;
PrintWriter outToServer;
BufferedReader is;
public void MailServerManage()
{}
public boolean connect(String host,int port,String user,String psw)
{
byte[] bt = new byte[255];
int bytesRead = 0;
try{
mailSocket = new Socket(host,port);
mailSocket.setTcpNoDelay(true);
is=new BufferedReader(new InputStreamReader(mailSocket.getInputStream()));
outToServer= new PrintWriter (mailSocket.getOutputStream());
System.out.println("connected...");
outToServer.println("root");
outToServer.println("root");
}
catch(UnknownHostException ex){
System.out.println("Could not resolve host name: "+ex.getMessage());
return false;
}
catch(IOException ex){
System.out.print("A communication error occured:"
+ex.getClass().getName()+": "+ex.getMessage());
return false;
}
return true;
}
public String command(String cmd)
{
String retStr="";
try{
outToServer.println(cmd);
String line=null;
String getS="";
while((line=is.readLine())!=null){//如果注释掉这段读的代码,则可正常运行
line=is.readLine();
getS=getS+line+"n";
}
System.out.println(getS);
}catch(IOException ex){
return "";
}
return retStr;
}
public void disconnect()
{
try{
outToServer.flush();
mailSocket.close();
}catch(Exception ex){
}
}
public static void main(String args[])
{
MailServerManage msm=new MailServerManage();
String st="";
if(msm.connect("192.168.1.8",4555,"root","root"))
st=msm.command("deluser abcn");
System.out.println(st+"abcde");
msm.disconnect();
}
}
|
while((line=is.readLine())!=null){
//如果注释掉这段读的代码,则可正常运行
line=is.readLine();
getS=getS+line+"n";
}
这样做肯定不对。再读到最后一行的时候就回把NULL也添加。
同时,这样读入数据也会少读一行数据。
改成:
while((line=is.readLine())!=null){
getS=getS+line+"n";
}
//如果注释掉这段读的代码,则可正常运行
line=is.readLine();
getS=getS+line+"n";
}
这样做肯定不对。再读到最后一行的时候就回把NULL也添加。
同时,这样读入数据也会少读一行数据。
改成:
while((line=is.readLine())!=null){
getS=getS+line+"n";
}
|
是不是有什么confirm语句让你确认的?如果你不用yes/no确认它会一直等下去。
|
while((line=is.readLine())!=null){//如果注释掉这段读的代码,则可正常运行
line=is.readLine();
getS=getS+line+"n";
}
这段代码有点问题,如果对方输入一个命令的话,必须输入第二个命令才行,可以把
这样试试
while((line=is.readLine())!=null){//如果注释掉这段读的代码,则可正常运行
//line=is.readLine();
getS=getS+line+"n";
}
line=is.readLine();
getS=getS+line+"n";
}
这段代码有点问题,如果对方输入一个命令的话,必须输入第二个命令才行,可以把
这样试试
while((line=is.readLine())!=null){//如果注释掉这段读的代码,则可正常运行
//line=is.readLine();
getS=getS+line+"n";
}