在socket.accept()方法之后创建新线程时发生了什么?

时间:2016-06-21 18:19:51

标签: java sockets concurrency serversocket

我正在尝试编写一个多客户端套接字系统,它通过客户端发送的字符串进行通信,这将根据其内容触发事件。
如何做有很多材料,但我无法掌握其背后的逻辑 在这一段In this exampleenter link description here中,有一段真正的代码,它有两条主要指令:

socket.accept();
Thread t = new Thread(runnable);

我无法理解这是如何运作的:

  • while(true)不断传递这些指令,但只有在accept()方法点击时才创建一个Thread?
  • 新线程是否有专用端口?套接字通信不是一对一的吗?
  • 软件如何跟踪生成的套接字线程,它实际上是否重要?
  • 如何回复刚写给我的帖子?

也许这是我缺乏谷歌技能,但我找不到一个很好的教程来做这些事情:帮助?

2 个答案:

答案 0 :(得分:1)

while(true)不断传递这些指令,但只有在accept()方法点击时才创建一个Thread?

  

在方法accept()上执行停止,直到有人尝试连接。您可以在我们的IDE上使用调试模式看到这一点。

新线程是否有专用端口?套接字通信不是一对一的吗?

  

不,你在同一个端口上有很多连接

软件如何跟踪生成的套接字线程,它实际上是否重要?

  

现在要为此烦恼

如何向刚刚写信给我的帖子发送回复?

  

当有人尝试连接时,您会收到一个回复​​此用户的对象,请查看文档

答案 1 :(得分:1)

•while(true)连续传递这些指令,但只有在accept()方法点击时才创建一个Thread?

创建一个新的Thread来监听通过Socket传入的数据(参见Socket.getInputStream())

•新线程是否有专用端口?套接字通信是一对一的吗?

线程没有端口。但是Socket有一个专门的地址来与这个客户端进行通信

•软件如何跟踪生成的套接字线程,它实际上是否重要?

这取决于软件。但大多数情况下,如果客户端登录,您可能会在某种Collection - A List中保留连接套接字的记录,或者在userID和Socket之间保留Map

•如何向刚刚写信给我的帖子发送回复?

从简单的意义上讲,它就像

一样简单
ServerSocket ss = ...;
Socket s = ss.accept();
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println("Hello World");

您需要确保您的PrintStream无法收集垃圾,因为这将关闭Stream / Socket