日期:2014-05-20  浏览次数:20888 次

java socket通信
大家好,学习java的Socket遇到问题了!就是我打算发一个命令到服务器端运行,然后返回结果,由于有些结果是分好几行的,我想让它显示在我的电脑上也是那种格式的,我开始在服务器端用如下代码:
            String tter=null;
            StringBuffer stbu=new StringBuffer();
            while ((tter=buff.readLine())!=null)
            {
                stbu.append(tter);
                System.out.println(tter);
            }
           out.println(stbu.toString());
但是发回后打印的都是一行。
然后我又换为如下代码:
            String tter=null;
            
            while ((tter=buff.readLine())!=null)
            {
                out.println(tter);
                System.out.println(tter);
            }
           out.println(stbu.toString());
然后再电脑端执行如下语句接收打印信息:
          String str=null;
          while((str=buffer.readLine())!=null)
          {
               System.out.println(str);
           }
最后打印出来确实和原格式一样,但是我执行一条命令后,在执行第二条时,就没反应,最后我在服务器端的代码中加入下代码,使服务器每接收一条命令就在服务器端打印。
      Sysem.out.println(comd);
最后发现那条命令就没打印出来!
求各位大神帮帮忙想一下,多谢了!!!
------解决方案--------------------
我估计是:服务端不知道客户端的信息发完了没有,所以一直等待。。。(我估计呵呵),你试试在客户端发送的结束后,添加一个上面我说的方法,试试看能不能解决,具体看API文档(方法名我只是记了一个大概),加油
------解决方案--------------------
可以了,服务端和客户端增加了结束符。你稍微看下。
其实那个是因为readLine在没有数据的时候会阻塞(你用的是阻塞socket)。而不是像读文件一样,没数据返回null。
因此使用一个结束符号来表示已经接受完数据。当然这种仅限于一问一答式的结构。


package JustForTest;

import java.io.*;
import java.net.*;

public class NetServer {
ServerSocket serverSocket = null;

private Socket socket = null;
Runtime rt = Runtime.getRuntime();

private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(out, true);
return pw;
}

private BufferedReader getReader(Socket socket) throws IOException {
InputStream in = socket.getInputStream();
BufferedReader bf = new BufferedReader(new InputStreamReader(in));
return bf;
}

public void service() throws IOException {
serverSocket = new ServerSocket(7324);
socket = serverSocket.accept();
PrintWriter out = getWriter(socket);
BufferedReader bf = getReader(socket);
out.println("Welcome to you!!!");
String comd = null;

// String str=null;
while ((comd = bf.readLine()) != null) {
System.out.println("Execute : "+comd);
String[] comdArray = { "cmd.exe", "/C", comd };

Process pro = rt.exec(comdArray);
try {
pro.waitFor();
} catch (InterruptedException e) {
}
BufferedReader buff = new BufferedReader(new InputStreamReader(pro.getInputStream()));
String tter = null;
StringBuffer stbu = new StringBuffer();
stbu.append("1、这里只测试多行数据发送\n");
stbu.append("2、所以我就不管你数据来源了\n");
stbu.append("3、具体的数据是否正确你另外测试\n");
stbu.append(">>END<<\n"); //结束符
/*
while ((tter = buff.readLine()) != null) {
stbu.append(tter).append("\n");
System.out.println(tter);
}
*/
System.out.println("Send : "+stbu.toString());
out.println(stbu.toString());
out.flush();
}
serverSocket.close();
socket.close();

}

public static void main(String[] args) throws Exception {
new NetServer().service();
}

}




package Cluster;

import java.io.*;
import java.net.*;

/**
 * Created by junfeng on 13-12-25.
 */
public class NetClient {

private String host = "localhost";
private int port = 7324;
private Socket socket = null;