Java ServerSocket.accept();使服务器或UnityScript客户端崩溃

时间:2015-05-19 20:14:32

标签: java javascript sockets client server

我正在使用java服务器和Unity(Javascript / Unityscript)客户端制作MMORPG。在服务器端,我有以下内容:

while(running){
        System.out.println("Waiting for new client to connect.");
        Socket socket = serverSocket.accept(); /*When another client tries to connect,
server stops at this line, "Client connected." is never printed.*/
        System.out.println("Client connected.");
        if(!running){
            System.out.println("Closing server..");
        }
        ClientListener listener = new ClientListener(socket);
        clients.add(listener);
        listener.start();
}

所以当我第一次运行服务器和客户端时,一切正常。当我关闭客户端并尝试再次运行客户端时,服务器停在 serverSocket.accept(); 。这意味着任一服务器都无法使用另一个客户端或客户端无法连接到服务器。我认为这是在服务器端,但我真的不知道是什么原因引起的。

private function ThreadListener(){
client = new TcpClient();
var port = 16304;

try{
    print("running..");
    client.Connect(IPEndPoint(IPAddress.Parse("127.0.0.1"), port));

    ns = client.GetStream();

     var data = new byte[1024];

     var waitCounter = 0;
     print("connection made");

     var read = 0;

     while(true){
        if(ns.CanRead){
            read = ns.Read(data, 0, data.Length);
            var word = System.Text.Encoding.ASCII.GetString(data, 0, read);
            Action(word);
        }
     }
}      
catch (InvOpEx : InvalidOperationException) {
    Debug.Log("TCP exception: " + InvOpEx.Message);
}

catch (SockEx : SocketException) {
    Debug.Log("Socket exception: " + SockEx.Message);
}
finally {
    if(ns != null)
        ns.Close();
    client.Close();
}
}

请注意!我知道这个统一客户端编码很糟糕,javascript不是我的最强点。但是,一旦我开始工作,我会更专注于提高效率和效率。

编辑1 :客户端只是冻结,直到我关闭服务器,在关闭服务器几秒钟后,客户端会发出一条错误消息,告知它无法连接到服务器。

编辑2 :我使用java创建了一个测试客户端,以确保问题不在服务器端。我能够使用该测试客户端多次成功连接到服务器。我认为在他们自己的论坛上获得有关统一相关内容的帮助会更容易,所以我会在那里提出这个问题。 :)

1 个答案:

答案 0 :(得分:0)

问题出在客户端(Javascript)上,当关闭客户端时,我忘了关闭ThreadListener()线程。所以我做了以下功能:

function OnApplicationQuit(){ //this is called before program is closed
running = false;
WorkerThread.Abort();
if(ns != null){
    ns.Close();
}
client.Close();
WorkerThread.Join();
WorkerThread = null;
}

现在它正在按预期工作。