我有一个java程序,我在家庭服务器上运行。我还有一个java客户端程序,它将消息发送到服务器并使用套接字接收响应。
我已经成功实施了它,但它看起来有点慢,我想尽快得到它。
这是我的代码:
服务器
public class Server implements Runnable{
static ServerSocket socket1;
protected final static int port = 4701;
static Socket connection;
static StringBuffer process;
private String handleRequest(String req){
if(req.equals("marco")){
return "polo";
}else
return "null";
}
public void run(){
try {
socket1 = new ServerSocket(port);
int character;
while (true) {
connection = socket1.accept();
BufferedInputStream is = new BufferedInputStream(connection.getInputStream());
InputStreamReader isr = new InputStreamReader(is);
process = new StringBuffer();
while ((character = isr.read()) != 13) {
process.append((char) character);
}
String returnCode = handleRequest(process.toString()) + (char) 13;
BufferedOutputStream os = new BufferedOutputStream(connection.getOutputStream());
OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII");
osw.write(returnCode);
osw.flush();
}
} catch (IOException e) {
System.out.println("error starting server " + e.getMessage());
}
try {
if(connection != null)
connection.close();
} catch (IOException e) {
}
客户端
String host = "xx.xx.xx.xxx";
int port = 4701;
StringBuffer instr = new StringBuffer();
try {
InetAddress address = InetAddress.getByName(host);
Socket connection = new Socket(address, port);
BufferedOutputStream bos = new BufferedOutputStream(connection.
getOutputStream());
OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");
String process = "marco" + (char) 13;
osw.write(process);
osw.flush();
BufferedInputStream bis = new BufferedInputStream(connection.
getInputStream());
InputStreamReader isr = new InputStreamReader(bis, "US-ASCII");
int c;
while ( (c = isr.read()) != 13)
instr.append( (char) c);
connection.close();
}
catch (Exception e){}
if(instr.toString().equals("")){
//error
}
}
例如,我将向服务器发送各种字符串以确定服务器的响应方式。例如,如代码所示,如果我将“marco”发送到服务器,我会返回“polo”。我还有(char) 13
作为分隔符,让程序知道消息已经结束。
有没有人对如何缩短转移时间有一些想法?我已经阅读过诸如禁用nagle算法之类的内容。那会有帮助吗?如果我想要纯粹的速度,也许套接字不是要走的路。也许不同的语言或图书馆会更快?
答案 0 :(得分:4)
在服务器端,您需要关闭连接。否则它们将保持打开状态,直到将来任意垃圾收集时间为止。
如果您真的非常渴望低延迟,那么请使用DatagramSocket(即UDP而不是TCP)。您丢失了邮件传递保证并且必须预期丢失数据包,但对于良好网络上的短消息,延迟与便携式代码一样好。
另一种选择是重用客户端的套接字连接,而不是每次都重新打开它。对于像你这样的微小消息,大部分时间可能都是在TCP设置和拆解中消耗的。
微优化将停止使用逐字符处理并将“marco”和“polo”匹配为字节字符串。但这不太可能会有明显的改善。
答案 1 :(得分:1)
你可以采取不同的方式使其更快,但明确你需要改变的东西。通常最长的延迟在您的网络中。
如果您通过环回连接或低延迟网络连接,您可以使用NIO,它可以更快。但是,如果您使用的是普通网络,尤其是如果您使用的是互联网连接,那么您的程序效率并没有多大差别。
当您考虑性能时,您需要查看整个端到端解决方案并查看延迟的位置,并专注于减缓解决方案的最大因素。
答案 2 :(得分:1)