标签: serversocket

java关闭serversocket并打开端口

我正在创建一个基于 Java 的服务器。

我正在使用服务器套接字来接受传入消息。

然而,在我的程序中的某个时刻,我希望服务器套接字侦听另一个端口。

我关闭服务器套接字。并用我的新端口开始一个新的端口。一切安好。

但是,当我再次将服务器套接字更改为以前的端口时,会出现错误。

我读过一些内容,服务器套接字在关闭后仍处于超时状态一段时间。

所以这是我的问题:我可以绕过服务器套接字的这种超时状态,并在关闭端口并想要再次侦听同一端口后使端口再次可用吗?


编辑:我的函数用于创建和监听服务器套接字,我的函数用于使服务器套接字无效并在之后立即创建一个新的套接字

public void makeServerSocketWithPort(int portnr) throws IOException, Exception
{
    server = new ServerSocket(portnr);
    server.setReuseAddress(true);
    while(!portchanged)
    {
        Socket sock = server.accept();
        System.out.println(server.getLocalPort());
        System.out.println(sock.getLocalPort());
        handler = new Requesthandler(sock); //should be in a thread
        System.out.println(server.getLocalPort());
        System.out.println(sock.getLocalPort());
    }
    
}

public void invalidateRequestHandler(int newPort)
{   
    if(server != null)
    {
       portchanged = true; 
        try {
            server.close();
        } catch (IOException ex) {
            Logger.getLogger(Controlserver.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    portchanged = false;
    makeServerSocketWithPort(newPort);
}
Run Code Online (Sandbox Code Playgroud)

错误堆栈跟踪:

Exception in thread "main" java.net.SocketException: …
Run Code Online (Sandbox Code Playgroud)

java timeout serversocket

5
推荐指数
1
解决办法
7362
查看次数

Java Socket和ServerSocket在使用端口上的区别

在服务器端,我们使用

Socket server = serverSocket.accept();
Run Code Online (Sandbox Code Playgroud)

创建一个套接字。创建套接字后,我们可以创建一个新线程来处理该套接字的输入/输出流。因此,如果有进一步的连接请求进来,我们可以返回在同一端口上侦听并创建新套接字。由于我们已经在特定端口创建了 ServerSocket,当然我们不能再次在该端口创建另一个 ServerSocket。

所以根据我的理解,我可以得出结论,在服务器端,我们可以在一个端口下创建多个套接字吗?(类似于 Web 服务器的功能)

实际上我的问题是,在客户端,当我们创建套接字时,我们可以指定要使用的本地端口。在我们在该本地端口成功创建客户端套接字后,我们可以将该端口重用于其他客户端套接字吗?该端口是否永久绑定到套接字直到套接字关闭(或端口关闭)?既然客户端没有“侦听”的概念,那么我们是否可以做与ServerSocket一样的事情(参考ServerSocket可以在一个端口下创建多个套接字)?

我很困惑客户端如何处理端口和套接字,因为我将 ServerSocket 与客户端套接字进行比较。

请指点我正确的方向,我知道我的想法不知何故是错误的。非常感谢。

java sockets port tcp serversocket

5
推荐指数
1
解决办法
3898
查看次数

在客户端/服务器Java套接字之间同步时间

在这里,我正在开发一个具有Java套接字的项目,并且在服务器和客户端之间实现正确的时间同步方面存在问题。我将用一个简单的例子来描述问题:

服务器在GMT上运行,并保留包含各种项目的数据库。这些商品中有一些是特价商品,但是这些商品在到期前有时间限制。
因此,假设服务器时间现在是9:00 AM(GMT),并且有一个商品要在10:00 AM(GMT)结束。

客户端可能与服务器位于不同的时间和时区。因此,假设客户时间现在是8:00 AM(GMT-1),我可以花时间将其调整为客户的时区,发现它在9:00 AM(GMT-1)结束,即1个小时。

问题:当用户设置了自定义时间时,如何计算剩余时间。
例如,上述客户端将时钟手动设置为提前半小时,即8:30 AM(GMT-1)。如果您只是进行时区转换,则该商品仍将在9:00(GMT-1)结束,因此,要约完成的剩余时间是错误的(30分钟)。

可能有人说,一种可能的解决方案是将客户端设置为从服务器询问以秒为单位的剩余时间,而不是确切的日期结束。但是我想在客户端实现类似倒数秒的功能。(如果报价在60秒内结束,则界面将变为60,59,58,..,1,0)。因此,每秒向服务器发送一个请求以获取剩余时间并不是有效的网络。

让我担心的另一件事是,如果您确实要求“以秒为单位的剩余时间”,那么在慢速的网络上,服务器的响应将不会立即到来,因此在客户端收到结果之前,时间已经到了。

java sockets timezone synchronization serversocket

5
推荐指数
1
解决办法
1478
查看次数

如何在 Java 中通过 TLS v.1.2 创建安全的 TCP 连接

我想通过 TLS v1.2 在两个系统之间创建通信。它包含的信息是保密的。我想避免 https web 服务调用,并且直接想在 TCP 层执行消息交换。

您能否建议如何实现这一点,我可以通过 TLS v1.2 安全地传输数据。

编辑:

阅读以下答案后,我编写了以下代码

SSL服务器

        System.setProperty("javax.net.ssl.keyStore", "/home/user/.keystore");
        System.setProperty("javax.net.ssl.keyStorePassword", "changeit");

        SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        ServerSocket ss = ssf.createServerSocket(8362);
        while (true) {
            System.out.println("awaiting to accept..");
          Socket s = ss.accept();
          SSLSession session = ((SSLSocket) s).getSession();
          Certificate[] cchain2 = session.getLocalCertificates();
          for (int i = 0; i < cchain2.length; i++) {
            System.out.println(((X509Certificate) cchain2[i]).getSubjectDN());
          }
          System.out.println("Peer host is " + session.getPeerHost());
          System.out.println("Cipher is " + session.getCipherSuite());
          System.out.println("Protocol is " + session.getProtocol());
          System.out.println("ID is " …
Run Code Online (Sandbox Code Playgroud)

java sockets ssl networking serversocket

5
推荐指数
0
解决办法
2万
查看次数

当Server Socket写入时,是否会等到Client Socket读取?

我有两个java类,一个是服务器,另一个是客户端。假设我需要从服务器向客户端发送 100 MB 的数据。当我发送此消息时,服务器是否会等待客户端读取?如果你看一下代码,服务器的 endTime 变量在客户端读取发送的 100 MB 之前不会起作用吗?

服务器类:

public class MyServerSocket {

  private ServerSocket providerSocket;
  private Socket connection = null;
  private ObjectOutputStream out;
  private ObjectInputStream in;
  private String message;

  public static void main(String[] args) {       
    MyServerSocket m = new MyServerSocket  ();
    m.establishConnection();
  }

  public void establishConnection(){
        //SETUP CONNECTION
        providerSocket = new ServerSocket(2004, 10);
        connection = providerSocket.accept();
        out = new ObjectOutputStream(connection.getOutputStream());
        out.flush();
        in = new ObjectInputStream(connectiongetInputStream());
        //END SETUP CONNECTION

        //Suppose this String contains 100 MB
        String x = "Send …
Run Code Online (Sandbox Code Playgroud)

java sockets serversocket

5
推荐指数
1
解决办法
1572
查看次数

Java Websockets - 因不同的选项而感到困惑

我一直致力于用 Java 编写 Web Socket 服务器,这一点让我困惑了一段时间。在 GitHub 上,有 TooTallNate 开发的这个库,它是“100% Java 中的准系统 WebSocket 客户端和服务器实现”: https: //github.com/TooTallNate/Java-WebSocket

它拥有大量明星,并且正在积极开发中。

但似乎 Java 的主库中已经有了 websocket 功能?https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_a_WebSocket_server_in_Java

还有 Jetty 的 WebSocket 之类的东西:http://www.eclipse.org/jetty/documentation/9.4.x/jetty-websocket-server-api.html

还有 Netty,它似乎也有 WebSocket 的东西。

那么它们之间到底有什么区别呢?这是简单性的问题吗?还是性能?或者它们是完全不同的东西?如果我需要低延迟高频发送 5-10 kb 消息,是否有一种最合适的选项?

java serversocket websocket java-websocket

5
推荐指数
1
解决办法
1079
查看次数

python socket编程中建立连接后如何获取客户端的IP地址?

我写了一个套接字程序来发送一个文件并从套接字接收一个字符串在其中我指定了客户端(写了客户端的 ip 地址)我想动态获取该客户端地址,我尝试了 .getpeername() 函数但得到错误

我尝试了 .getpeername() 函数但出现错误

#host = '10.66.227.181'   # fixed ip of one client only
client_socket = socket.socket()
host = client_socket.getpeername()
print(clientip)
port = 8000
print(host,port)
client_socket.connect(host,port)
Run Code Online (Sandbox Code Playgroud)

clientip = socket.gethostname(client_socket.getpeername()) OSError: [WinError 10057] 不允许发送或接收数据的请求,因为套接字未连接并且(使用 sendto 调用在数据报套接字上发送时)未提供地址

python sockets serversocket peer python-3.x

5
推荐指数
1
解决办法
1万
查看次数

关闭 AutoCloseable 的正确方法

关闭一个当什么是最可靠的模式可供遵循OutputStreamServerSocket或其他对象实现的AutoCloseable接口?

我应该使用try- catch-finally吗?或者关闭钩子。

java resources outputstream serversocket

5
推荐指数
1
解决办法
3371
查看次数

如何为阻塞呼叫设置超时?

我有一个与多个客户端一起工作的多线程聊天服务器(每个客户端都在一个新线程中处理)。

如果客户端断开连接,服务器上的相关线程将挂在 inputstream.readLine() 上,这是一个阻塞调用。

如何设置某种超时,以便在 2000 毫秒后关闭套接字并释放线程而没有响应?

class Handler(socket: Socket) extends Runnable {
  def run() : Unit = {
    val inputstream = new BufferedReader(new InputStreamReader(socket.getInputStream()))
    val outputstream = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))
    var break = false
    while(break != true){
      val input = inputstream.readLine() // blocking call
// how do i time out after 2000ms?
      input match {
        case "update" =>
          outputstream.write("message")
          outputstream.newLine()
          outputstream.flush()
        case _ => // any other input, break and close socket
          break = true
      }
    }
    socket.close()
  } …
Run Code Online (Sandbox Code Playgroud)

sockets scala serversocket blocking

5
推荐指数
1
解决办法
74
查看次数

WebFlux + RSocket + Spring

有人可以告诉我或给出一个使用WebFlux、RScoket 和 Spring(或 SpringBoot)的现成 CRUD 示例吗?

我研究了RSocket文档WebFlux,也写了我的简单示例,但我希望看到使用RSocket 的基本方法的真实CRUD应用程序。

我会很感激的。谢谢。

serversocket reactor spring-webflux rsocket rsocket-java

5
推荐指数
1
解决办法
2112
查看次数