java - 通过线程与多客户端服务器

标签 java networking tcp game-development

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

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

例如这里是knock knock server multiThread类

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 转换为线程” 如果有人能阐明我的问题,那就太好了。

Canvas

更新

我现在有了自己的线程类

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”,我该如何解决?

最佳答案

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

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

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

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

关于java - 通过线程与多客户端服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14838535/

相关文章:

scala - 使用 Akka Actors 处理多个 TCP 连接

java - 如何在 Ext GWT 中的 RequestBuilder 中发送网格过滤器参数?

c# - 发送 RPC 添加 playerName

c++ - 无明显原因的 WSA 10049 错误

java - 将 UDP 与 NIO 一起使用有什么意义?

c++ - 当一个套接字在后台执行操作时如何处理两个套接字

java - 将 .jks 文件转换为 .p12

在 Netbeans 中连接 azure 数据库的 Java 程序出现错误

java - setCaretPosition 引发无法打开系统剪贴板异常

java - 如何在类实例之间共享相同的变量?