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

问题描述:

我想写一个多客户端套接字系统,通过客户端发送的字符串进行通信,这将根据其内容触发事件。
有很多材料如何做到这一点,但我无法理解它背后的逻辑。
In this example而在这其中enter link description here,有一个,而真正的一段代码,它有两个主要的指令:当我们在socket.accept()方法之后创建一个新线程时发生了什么?

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

我不明白这是如何工作:

  • 的,而(真)连续通过通过这些指令,但只有在accept()方法单击时才创建一个线程?
  • 新线程是否有专用端口?套接字通信不是一对一的吗?
  • 软件如何跟踪产生的套接字线程,它确实很重要吗?
  • 如何发送回复给刚才给我写的帖子?

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

+0

这不看起来像完整的代码。 'accept()'有一个返回值,并且线程't'没有启动。你确定这是实际运行的代码的正确副本吗? – Arkadiy

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

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

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

不,你有相同的端口

如何在软件跟踪催生插座线程的许多连接,它实际上很重要?

不要理会这个,现在

如何发送到刚刚给我写线程的答复?

当有人试图连接您收到一个对象来响应该用户,查看文档

+0

我已经看到accept()返回一个Socket,就像你说的那样。当我在客户端销毁这个时会发生什么?我的程序是否停止在每个指令上,比如“inputStream.readLine()”?谢谢你的回答,它确实清楚了一些事情! – Vale

•在一段时间(真)在这些指令连续通过,但创建一个线程,只有当接受( )方法点击?

一个新的线程创建监听数据通过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不会再拿到垃圾收集,因为这将关闭流/插座

+0

当你说要将它们保存在一个集合中时,你是否必须跟踪与该套接字关联的线程? ServerThread是由用户创建的一个类:'ServerThread st = new ServerThread(s);'所有的线程将具有相同的名称,但是不同的套接字:我该如何选择要回答的问题?或者我怎么知道一旦连接关闭,哪个线程会被杀死?谢谢你的tme – Vale