4

我遇到了一些麻烦,现在我查看了本教程 http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html 本教程为您提供了一个可以连接多个客户端的服务器,当他们连接到服务器时,他们被告知要进行敲门作业,现在我了解了如何传输数据以及什么不是,但是线程如何工作?

我正在开发一个网络乒乓球游戏,其中服务器将持有位置并将它们传递给客户端,现在我有一个连接到服务器的客户端并将球的位置传递给客户端,工作正常,有点跳跃,但我'确定带有 .sleep 的线程会有所帮助。但无论如何我的问题是,我怎样才能让我的客户成为一个线程?我该如何存储它们?

例如这里是敲敲服务器的多线程类

package knockKnockServer;

import java.net.*;
import java.io.*;

public class KKMultiServerThread extends Thread {
private Socket socket = null;

public KKMultiServerThread(Socket socket) {
super("KKMultiServerThread");
this.socket = socket;
}

public void run() {

try {
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
                new InputStreamReader(
                socket.getInputStream()));

    String inputLine, outputLine;
    KnockKnockProtocol kkp = new KnockKnockProtocol();
    outputLine = kkp.processInput(null);
    out.println(outputLine);

    while ((inputLine = in.readLine()) != null) {
    outputLine = kkp.processInput(inputLine);
    out.println(outputLine);
    if (outputLine.equals("Bye"))
        break;
    }
    out.close();
    in.close();
    socket.close();

} catch (IOException e) {
    e.printStackTrace();
}
}
}

在我们拥有的服务器中

package knockKnockServer;

import java.net.*;
import java.io.*;

public class MultiKKServer {
public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = null;
    boolean listening = true;

    try {
        serverSocket = new ServerSocket(4444);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 4444.");
        System.exit(-1);
    }

    while (listening)
    new KKMultiServerThread(serverSocket.accept()).start();

    serverSocket.close();
}
}

现在查看服务器,它将在每个连接上创建一个新的 KKMultiServerThread,但我该如何存储它们?我可以制作一个 KKMultiServerThread 数组吗?我试图制作一个 KKMultiServerThread 数组,当我尝试这条线时

multi[0] = new KKMultiServerThread(serverSocket.accept()).start();

我收到此错误“无法将 void 转换为线程”如果有人能对我的问题有所了解,那就太好了。

帆布

更新

我现在有自己的线程类

package Pong;

import java.net.*;
import java.io.*;

public class PongPlayerThread extends Thread 
{
private Socket socket = null;
private String pongData = "";

public PongPlayerThread(Socket socket, int id) 
{
    super("PongPlayerThread");
    this.socket = socket;
}

public void passData(String data)
{
    pongData = data;
}

public void run()
{
    try
    {
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        while(true)
        {
            out.println(pongData);
        }
    }
    catch (IOException e) 
    {
        e.printStackTrace();
    }
}

}

pongData 是一个将所有信息保存在一个字符串中的字符串,现在如果我像这样在我的 pong 服务器顶部声明一个 player1

private static PongPlayerThread player1;

听的时候做这条线

    while(listen)
    {
        PongPlayerThread player1 = new PongPlayerThread(serverSocket.accept(), 0).start();
    }

它给了我这个错误“无法从 void 转换为 PongPlayerThread”我该如何解决这个问题?

4

2 回答 2

0

当客户端连接到服务器时。服务器通常会专门为该客户端创建一个新线程。这是一些伪代码:

WHILE SERVER IS RUNNING

SERVER WAITS FOR A CLIENT TO CONNECT
SERVER ACCEPTS THE CLIENT IF THERE IS ENOUGH MEMORY TO CREATE A NEW THREAD
SERVER CREATES A NEW THREAD ROUTINE FOR THE CLIENT PASSING THE CLIENT INFORMATION TO THE THREAD
SERVER CONTINUES TO LISTEN WHILE EACH THREAD IS SPECIFICALLY TAILORED FOR THE CLIENTS

REPEAT

您问需要哪些步骤来减少延迟?对于初学者来说,设置最大允许连接数。您不希望 5000 个客户端拥有自己的线程。除非您的机器可以处理所有这些并且仍然可以运行。使用 UDP 而不是 TCP,数据压缩尽量减少带宽,不要一次发送 50 GB 的信息;如果您只需要发送几个字节的信息。尝试以字节而不是字符串的形式发送位置信息。例如,您可以将位置 X=5Y=0 发送为 50,并将第一个十进制数字解析为 X,将第二个十进制数字解析为 Y。

而不是在线程例程中传递客户端套接字,而是传递客户端的唯一标识符。由于 Pong 是两个玩家,因此限制了对两个客户端的连接。玩家 1 为 0,玩家 2 为 1。所以

new KKMultiServerThread(clientID).start(); // clientID is of type int

编辑:

int id = 0;
while(serverIsRunning)
{
    Client client = server.accept();
    if (id > 2) client.Close(); // Do not accept.
    Thread.New(id).Start();
    id++;
}
于 2013-02-12T17:51:47.627 回答
0

您的数组声明缺少对象类型

KKMultiServerThread multi[0] = new KKMultiServerThread(serverSocket.accept()).start();

为什么要打扰呢?除非线程需要相互通信,否则让线程自由运行是可以的。就服务器而言,Run() 方法定义了套接字的整个生命周期。每个线程都有一个单独的游戏状态副本(只要您不使用静态),并且无需任何额外干预即可愉快地与客户端通信。

在这种情况下,Java 中的 Socket/Thread 库正在帮您一个大忙,除非您有特殊需要,否则不要让它变得更复杂。

于 2013-02-12T17:55:32.080 回答