过去几个月我一直在制作在线java游戏。局域网(hamachi)与本地电脑的连接效果很好,但外接设备没有。我尝试使用外部PC的路由器端口前端(比hamachi更有趣),但连接速度很慢(约4秒延迟)...
我认为我的游戏中的网络算法无效,所以我创建了一个通过TCP / IP小包发送的简单程序,结果很慢。我还试图关闭防火墙和防病毒软件,但测试没有显示任何变化。
任何人都可以解释我如何减少连接的延迟或Java套接字为什么这么慢?
(我使用路由器Linksys型号:WRT54G,带Eclipse IDE)
非常感谢帮助。
以下是我测试程序的日志:
ON LOCAL PC ...
尝试连接到xxx.xxx.xxx.xxx ...(从路由器端口转发)
已发送10个请求...(平均值:238毫秒)
对于10个请求,已经过了4631毫秒。
尝试连接到Phil-PC ......(来自hamachi本地网络)
已发送10个请求...(平均:0毫秒)
对于10个请求,已经过了10毫秒。
ON EXTERNAL PC ...
尝试连接到xxx.xxx.xxx.xxx ...(从路由器端口转发)
已发送10个请求...(平均值:235毫秒)
对于10个请求,已经过了4418毫秒。
尝试连接到Phil-PC ......(来自hamachi本地网络)
已发送10个请求...(平均:245毫秒)
对于10个请求,已经过了4808毫秒。
这是源代码 添加了setTcpNoDelay(true)后,完成10个请求需要一半的时间。 «对于10个请求,已经过了2136毫秒。»我将在今晚或明天的游戏中尝试它!
Distict
package segp10039402;
import java.awt.BorderLayout;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class DebugServer {
static ServerSocket server;
public static void main(String[] args)
{
DebugServer debugServer = new DebugServer();
}
public DebugServer()
{
try
{
server = new ServerSocket(2620);
new Thread(accept).start();
createInterface();
}
catch(IOException ex)
{
JOptionPane.showMessageDialog(null,"Error: " + ex.getMessage(), "Alert", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}
private void createInterface()
{
JFrame frame = new JFrame();
JLabel label = new JLabel("Server");
frame.add(label);
frame.setVisible(true);
}
private static Runnable accept = new Runnable()
{
@Override
public void run()
{
ObjectOutputStream oos;
ObjectInputStream ois;
while(true)
{
Socket socket;
try
{
System.out.println("Server is online...");
socket = server.accept();
System.out.println("New connection...");
for (int i=0; i<10;++i)
{
System.out.println("=================="+i+"======================");
//receive send
ois = new ObjectInputStream(socket.getInputStream());
long packet = (long) ois.readObject();
oos = new ObjectOutputStream(socket.getOutputStream());
System.out.println("Client ping: "+(long)(System.currentTimeMillis()-packet)+" ms");
//send
oos.writeObject(System.currentTimeMillis());
oos.flush();
//receive
ois = new ObjectInputStream(socket.getInputStream());
packet = (long) ois.readObject();
System.out.println("Server ping: "+packet+" ms");
}
}
catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e){e.printStackTrace();}
}
}
};
}