我有一个在家庭服务器上运行的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
作为分隔符,让程序知道消息已结束。
有人对如何缩短传输时间有一些想法吗?我读过诸如禁用内格尔算法之类的内容。那会有帮助吗?如果我想要纯粹的速度,也许套接字不是正确的选择。也许不同的语言或库会更快?
最佳答案
在服务器端,您需要关闭连接。否则它们将保持打开状态,直到将来某个任意的垃圾收集时间为止。
如果您确实渴望低延迟,请使用 DatagramSocket(即 UDP 而不是 TCP)。您会失去消息传递保证,并且必须预料到会丢失数据包,但对于良好网络上的短消息,延迟与可移植代码一样好。
另一个选择是重用客户端的套接字连接,而不是每次都重新打开它。对于像您这样的小消息,大部分时间可能消耗在 TCP 设置和拆卸上。
微观优化是停止使用逐字符处理并将“marco”和“polo”匹配为字节字符串。但这不太可能带来明显的改善。
关于Java套接字通信——提高速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961154/