【问题标题】:how to accept only 1 connection in socket如何在套接字中只接受 1 个连接
【发布时间】:2013-10-10 21:40:25
【问题描述】:

嗨,我有这个服务器代码,我添加了 if 来检查 ocupado(busy) 是否 = 0,接受套接字,如果它打开忙 = 1,所以拒绝直到第一个用户完成连接,但不工作...

import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

/**
 *
 * @author www
 */
public class ServidorTCPBasico {
static int ocupado = 0; // = busy var to check
  public static void main(String[] args) {

    try {

      // Instancia o ServerSocket ouvindo a porta 9000

      ServerSocket servidor = new ServerSocket(9000);

      System.out.println("Servidor ouvindo a porta 9000");

      while(true) {

        // o método accept() bloqueia a execução até que

        // o servidor receba um pedido de conexão
        Socket cliente = servidor.accept();
        if(ocupado == 0) { 

        int ocupado = 1;
        System.out.println("Cliente conectado: " + cliente.getInetAddress().getHostAddress());
System.out.println(ocupado);
        ObjectOutputStream saida = new ObjectOutputStream(cliente.getOutputStream());

        saida.flush();

//        saida.writeObject(new Date());
        saida.writeUTF("TEXTO TESTE PARA TRANSFERIR...");
        saida.close();

      //  cliente.close();

        }  else { 
            System.out.println("Ocupado");
          }

      }   
    }


    catch(Exception e) {

       System.out.println("Erro: " + e.getMessage());

    } 

    finally {
    }  


  }     

}

所以我的问题是如何使套接字每次只接受一个连接,并且当用户在确认框中按 OK 时服务器关闭连接..

确认框等部分。我会补充一下,我的问题是“逻辑”或命令只允许一个连接,当客户端尝试时,它拒绝连接,我稍后会在客户端处理拒绝的连接

【问题讨论】:

  • 老实说,您的服务器一次应该只能“接受”一个连接,因为您正在“接受”线程中处理当前连接...
  • @MadProgrammer 所以我必须在一个线程中添加所有内容?
  • 如果您的目标是防止同时接受多个连接,可以。虽然没有调用servidor.accept(),但不会接受其他连接。它们可能会被合并并最终超时,但在再次调用 servidor.accept() 之前,它们都无法与服务器交互......

标签: java sockets


【解决方案1】:

根据JavaDocs for ServerSocket,您可以将积压设置为第二个参数。如果请求超过此积压,它们将被简单地拒绝。根据这一行:

The maximum queue length for incoming connection indications (a request to connect) is set to the backlog parameter. If a connection indication arrives when the queue is full, the connection is refused

所以,您可以尝试以下方法:

ServerSocket servidor = new ServerSocket(9000, 1);

【讨论】:

  • 我现在试了,不行,仍然可以连接多次:(我检查了客户端和服务器,没有人有close(),一无所获:(
  • 这是根据 JavaDocs 的。我无法想象他们错了。您的代码中可能还有其他内容。
  • 没有。 Javadoc 明确指出“backlog 参数是 请求的 最大长度”[我的重点]。平台可以向上或向下调整请求的积压,并且无法确定它是否这样做或最终值是多少。我不知道您可以将其设置为 1 的平台。
【解决方案2】:

您已经通过单线程服务器确保了这一点。在您完成与前一个客户的沟通之前,您无法返回 accept() 电话。根本不需要你的occupado 测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多