当前位置: 首页 > 知识库问答 >
问题:

当新套接字连接(服务器/客户端)多线程java时覆盖线程

鞠侯林
2023-03-14

服务器

public void accept() throws IOException{
        while(true){
            Socket socket = serverSocket.accept();
            Runnable r = new ServerThreadHandler(socket);
            Thread t = new Thread(r);
            t.start();
        }
    }

ServerThreadHandler:

public class ServerThreadHandler implements Runnable {
    static Socket socket=null;
    protected   User client;
    //private static  int i;
    private static BufferedReader in;
    private static OutputStreamWriter out;

    public  void createUser(String nick, String group, String[] ext) throws IOException{
        client = new User(nick, group, ext, null, false, 0, false, socket, socket.getPort());
    }

    /**
     * constructor-Method
     * @param socketS
     */
    ServerThreadHandler(Socket socketS){
        socket = socketS;
    }
    public void run(){
        Server.setThreadList(socket);
        in = createReader();
        out = createWriter();
        //and so on...
    }
}

共有1个答案

齐成和
2023-03-14

代码片段中提到的逻辑肯定会创建与no一样多的线程。正在连接的客户端

然而,可能的原因可能是,由于ServerThreadHandler中的套接字变量是静态的,所以创建的所有后续线程都覆盖了相同的套接字变量,从而导致使用该套接字变量的先前创建的线程出现问题。

您应该考虑为ServerThreadHandler中的套接字使用非静态变量,因为任何可运行类都应该持有一个状态,而不应该使用静态套接字。

 类似资料:
  • 问题内容: 我必须使用Java的套接字API编写多线程客户端和服务器。客户端和服务器都是多线程的,因此服务器可以处理多个连接,客户端可以测试服务器处理连接的能力。 我的代码在这里:https : //github.com/sandyw/Simple-Java-Client- Server 我有几个可能是相关的问题。一,偶尔会有一个客户端线程抛出 从其位置来看,这意味着服务器在客户端完成从套接字读取

  • 服务器和客户端使用我自己的协议进行通信,看起来像XMPP。我应该实现聊天应用。因此,当一个用户编写String时,它应该立即通过服务器发送给其他客户端。我在服务器上有sendToAll方法。但用户只有在按下回车键时才能看到其他用户的消息。用户如何在不按回车键的情况下接收消息? 这是我的客户: 以及带有ServerThread的服务器。 服务器线程。

  • 这是服务器类的代码。 如有任何帮助,不胜感激

  • 问题内容: 服务器和客户端使用我自己的协议(类似于XMPP)进行通信。我应该实现聊天应用程序。因此,当一个用户写String时,应该立即将其通过服务器发送给其他客户端。我在服务器上有sendToAll方法。但是用户只有在按Enter时才能看到其他用户的消息。 用户如何在不按Enter键的情况下接收消息? 这是我的客户: 和带有ServerThread的服务器。 ServerThread。 问题答案

  • 我是python套接字编程的初学者,正在尝试编写一个与联网家庭自动化设备(GlobalCache GC100)接口的库 我既需要通过TCP不断监听来自该硬件的传感器状态变化事件,也需要能够在用户发起的时间发送set_state命令(trip relays),而没有明显的延迟。 我有一个循环,它执行来拾取状态更改事件。这通常会超时()并继续到下一个循环迭代,直到设备推送状态更改数据。 我是想做套接字

  • 当我尝试使用套接字将物理设备连接到服务器时,我遇到了一个问题。在服务器端,它似乎不接受任何连接,而在客户端,套接字超时。你知道为什么会这样吗? 我在下面提供我的代码 服务器代码: 客户端: 11-16 23:32:11.016:W/系统。错误(24213):java.net。ConnectException:无法连接到/192.168.1.116(端口9090):连接失败:ETIMEDOUT(连接