【问题标题】:What is happening when we create a new Thread after the socket.accept() method?当我们在 socket.accept() 方法之后创建一个新线程时会发生什么?
【发布时间】:2016-06-21 18:19:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这看起来不像完整的代码。 accept()有返回值,线程t没有启动。您确定这是实际运行的代码的正确副本吗?

标签: java sockets concurrency serversocket


【解决方案1】:

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

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

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

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

软件如何跟踪生成的套接字线程,这真的很重要吗?

暂时不用考虑这个

如何回复刚刚写给我的帖子?

当有人尝试连接时,您会收到响应此用户的对象,请查看文档

【讨论】:

  • 我已经看到 accept() 返回一个 Socket,如你所说。当我在客户端销毁它时会发生什么?我的程序是否在每条指令上停止,例如 "inputStream.readLine()" ?感谢您的回答,确实让事情变得清晰了一点!
【解决方案2】:

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

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

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

线程没有端口。但是 Socket 有一个专用的地址来和这个客户端通信

•软件如何跟踪生成的套接字线程,这真的很重要吗?

这取决于软件。但大多数情况下,您会在某种Collection 中记录已连接的套接字 - 也许是 List,或者如果客户端正在登录,则在用户 ID 和套接字之间使用 Map

•如何回复刚刚写给我的主题?

简单来说,就是这么简单

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

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

【讨论】:

  • 当您说要将它们保存在一个集合中时,您是否必须跟踪与套接字关联的线程? ServerThread 是一个用户创建的类:ServerThread st=new ServerThread(s); 所有线程都将具有相同的名称,但不同的套接字:我如何选择哪个来回答?或者,一旦连接关闭,我怎么知道要杀死哪个线程?谢谢你的时间
猜你喜欢
  • 1970-01-01
  • 2016-05-20
  • 2013-06-21
  • 1970-01-01
  • 2013-10-13
  • 2017-09-19
  • 1970-01-01
  • 2014-03-02
  • 2010-12-10
相关资源
最近更新 更多