具有路由器端口前端的套接字导致连接缓慢。我该如何解决这个问题?

时间:2015-05-12 01:29:32

标签: java sockets networking tcp

过去几个月我一直在制作在线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();}
			}
		}
	};
}

0 个答案:

没有答案