不知道 问题说的对不对,我先说下我的代码作用是
服务端开始监听,客户端连接上后,输入要执行的命令,然后服务端执行后将结果传递到客户端!
问题是现在,命令执行后,数据并不是立马传输过来,多执行几个命令之后数据才传输过来,而且每次传输过来还只是一行数据!
刚接触socket,好多不明白的地方,个人感觉应该是缓冲区问题,请指教!谢谢!
服务端开始监听,客户端连接上后,输入要执行的命令,然后服务端执行后将结果传递到客户端!
问题是现在,命令执行后,数据并不是立马传输过来,多执行几个命令之后数据才传输过来,而且每次传输过来还只是一行数据!
刚接触socket,好多不明白的地方,个人感觉应该是缓冲区问题,请指教!谢谢!
Eachserver:
package test;import java.io.*;
import java.net.*;
public class Eachserver { /**
* @param args
*/
public int port=8000;
private ServerSocket serversocket;
public Eachserver() throws IOException{
serversocket=new ServerSocket(port);
System.out.println("服务启动成功");
}
public String echo(String msg){
return "echo:"+msg;
}
private PrintWriter getWriter(Socket socket) throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
} private BufferedReader getReader(Socket socket) throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void service() {
while (true) {
Socket socket=null;
try {
socket = serversocket.accept(); //等待客户连接
System.out.println("New connection accepted "
+socket.getInetAddress() + ":" +socket.getPort());
BufferedReader br =getReader(socket);
PrintWriter pw = getWriter(socket); String msg = null;
while ((msg = br.readLine()) != null) {
if(msg.equals("bye")){
//如果客户发送的消息为“bye”,就结束通信
return;
} else{
pw.println(execcmd(msg));
pw.flush();
}
}
}catch (IOException e) {
e.printStackTrace();
}finally {
try{
if(socket!=null)socket.close(); //断开连接
}catch (IOException e) {e.printStackTrace();}
}
}
}
public String execcmd(String cmd){
String result="";
try {
Process child = Runtime.getRuntime().exec(cmd);
InputStream in = child.getInputStream();
int c=in.available();
while ((c = in.read()) != -1) {
result=result+(char)c;
}
in.close();
} catch (IOException e) {
System.err.println(e);
}
System.out.println(result);
return result;
} public static void main(String args[])throws IOException {
new Eachserver().service();
}}
EchoClient: package test;import java.net.*;
import java.io.*;
public class EchoClient {
private String host="localhost";
private int port=8000;
private Socket socket;
public EchoClient()throws IOException{
socket=new Socket(host,port);
}
public static void main(String args[])throws IOException{
new EchoClient().talk();
}
private PrintWriter getWriter(Socket socket)throws IOException{
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket)throws IOException{
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public void talk()throws IOException {
try{
BufferedReader br=getReader(socket);
PrintWriter pw=getWriter(socket);
BufferedReader localReader=new BufferedReader(new InputStreamReader(System.in));
String msg=null;
while((msg=localReader.readLine())!=null){
pw.println(msg);
System.out.println(br.readLine()); if(msg.equals("bye"))
break;
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{socket.close();}catch(IOException e){e.printStackTrace();}
}
}
}
那样得话。。有些时候电脑CPU会交替执行一系列得指令。。
你可以试试提高你的那个线程得优先级
nagle算法,自己google一下就会明白了
会不会是我传输数据时使用的方式不对啊
readline()都是阻塞的方法啊