导航:首页 > 编程语言 > java线程池socket

java线程池socket

发布时间:2023-05-18 17:32:07

1. java开发聊天功能用什么技术

Java开发聊天功能可以使用Socket和ServerSocket技术来实现。
在这种情况下,服务器端需要创建一个ServerSocket对象来监听客户端的连接请求槐伍。当有新的连接请求到达时,服务器会创建一个铅敏或新的Socket对象来与客户端进行通信,并将该Socket对象加入到线程池中。通过这种方式,服务器可拿御以同时处理多个客户端的连接请求和消息交互。
客户端需要创建一个Socket对象,并指定服务器端的IP地址和端口号来连接服务器。连接成功后,客户端可以向服务器发送消息,也可以接收来自服务器的消息。当客户端退出聊天室时,需要关闭Socket连接,并通知服务器该客户端已经离开。
在实际开发中,还需要考虑到消息的编码和解码、异常处理、线程安全等问题。可以使用现成的开源框架如Netty、Spring Boot等来简化聊天功能的开发。同时,还需要进行充分的测试和优化,以提高聊天功能的性能和用户体验。

2. java TCP做聊天程序是应该一个聊天窗口一个线程还是一个Socket一个线程

socket通讯是阻塞的,一个聊天就有一个socket,需要一直在哪里阻塞读取数据,所以就一个socket就要用一个线程了。如果用nio的话,通讯是非阻塞的,就不用一个聊天一个线程了。如果聊天人数大的话,建议用nio。现在netty框架就非常不错。

3. 关于 java socket的消息推送问题

使用线程池会比较好。方便管理。你也要对链接的线程做一个限制,无限的链接创建线程会耗尽内存的。比如:

{
;
;
publicNetworkService(intport,intpoolSize)
throwsIOException{
serverSocket=newServerSocket(port);
pool=Executors.newFixedThreadPool(poolSize);
}
publicvoidrun(){//runtheservice
try{
for(;;){
pool.execute(newHandler(serverSocket.accept()));
}
}catch(IOExceptionex){
pool.shutdown();
}
}
}
{
privatefinalSocketsocket;
Handler(Socketsocket){this.socket=socket;}
publicvoidrun(){
//readandservicerequestonsocket
}
}

在没有消息的时候,线程要处于wait状态,当有消息的时候,用notify来激活。

4. java 如何多次使用缓存中的socket

java中用socket一次传多个文件,参考思路如下: 1、把线程放到Vector 线程池里面; 2 、每次从专Vector里面拿到第一个空闲的,属如果没有,就新建一个线程,并保存到线程池, 线程状态为使用中; 3 、线程完毕后,通知管理类,管理类把线程标识为空...

5. Java Socket重要参数讲解

Java Socket的api可能很多人会用 但是Java Socket的参数可能很多人都不知道用来干嘛的 甚至都不知道有这些参数

backlog

用于ServerSocket 配置ServerSocket的最大客户端等待队列 等待队列的意思 先看下面代码

public class Main { public static void main(String[] args) throws Exception { int port = int backlog = ServerSocket serverSocket = new ServerSocket(port backlog) Socket clientSock = serverSocket accept() System out println( revcive from + clientSock getPort()) while (true) { byte buf[] = new byte[ ] int len = clientSock getInputStream() read(buf) System out println(new String(buf len)) }这段测试代码在第一次处理一个客户端时 就不会处理第二个客户端 所以除了第一个客户端 其他客户端就是等待队歼罩列了 所以这个服务器最多可以同时连接 个客户端 其中 个等待队列 大家可以telnet localhost 测试下

这个参数设置为 表示无限制 默认是 个最大等待队列 如果设置无限制 那么你要小心了 如果你服务器无法处理那么多连接 那么当很多客户端连到你的服务器时 每一个TCP连接都会占用服务器的内存 最后会让服务器崩溃的

另外 就算你设置了backlog为 如果你的代码中是一直Socket clientSock = serverSocket accept() 假设我们的族唯机器最多可以同时处理 个请求 总共有 个线程在运行 然后你把在 个线程的线程池处理clientSock 不能处理的clientSock就排队 最后clientSock越来越多 也意味着TCP连接越来越多 也意味着我们的服务器的内存使用越来越高(客户端连接进程 肯定会发送数据过来 数据会保存到服务器端的TCP接收缓存区) 最后服务器就宕机了 所以如果你不能处理那么多请求 请不要循环无限制地调用serverSocket accept() 否则backlog也无法生效 如果真的请求过多 只会让你的服务器宕机(相信很多人都是这么写 要注意点)

TcpNoDelay

禁用纳格算法 将数据立即发送出去 纳格算法是以减少封包传送量来增进TCP/IP网络的效能 当我们调用下面代码 如

Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world out write(head getBytes()) out write(body getBytes()) 我们发送了hello 当hello没有收到ack确认(TCP是可靠连接 发送的每一个数据都要收到对方的一个ack确认 否则就要重发)的时候 根据纳格算法 world不会立马发送 会等待 要么等到ack确认(最多等 ms对方会氏穗闹发过来的) 要么等到TCP缓冲区内容>=MSS 很明显这里没有机会 我们写了world后再也没有写数据了 所以只能等到hello的ack我们才会发送world 除非我们禁用纳格算法 数据就会立即发送了

SoLinger

当我们调用socket close()返回时 socket已经write的数据未必已经发送到对方了 例如

Socket socket = new Socket() nnect(new InetSocketAddress(host )) InputStream in = socket getInputStream() OutputStream out = socket getOutputStream() String head = hello String body = world out write(head getBytes()) out write(body getBytes()) socket close()

这里调用了socket close()返回时 hello和world未必已经成功发送到对方了 如果我们设置了linger而不小于 如

bool on = true int linger = ……

socket setSoLinger(boolean on int linger)

……

socket close() 那么close会等到发送的数据已经确认了才返回 但是如果对方宕机 超时 那么会根据linger设定的时间返回

UrgentData和OOBInline

TCP的紧急指针 一般都不建议使用 而且不同的TCP/IP实现 也不同 一般说如果你有紧急数据宁愿再建立一个新的TCP/IP连接发送数据 让对方紧急处理

所以这两个参数 你们可以忽略吧 想知道更多的 自己查下资料

SoTimeout

设置socket调用InputStream读数据的超时时间 以毫秒为单位 如果超过这个时候 会抛出 SocketTimeoutException

KeepAlive

keepalive不是说TCP的常连接 当我们作为服务端 一个客户端连接上来 如果设置了keeplive为true 当对方没有发送任何数据过来 超过一个时间(看系统内核参数配置) 那么我们这边会发送一个ack探测包发到对方 探测双方的TCP/IP连接是否有效(对方可能断点 断网) 在Linux好像这个时间是 秒 如果不设置 那么客户端宕机时 服务器永远也不知道客户端宕机了 仍然保存这个失效的连接

SendBufferSize和ReceiveBufferSize

TCP发送缓存区和接收缓存区 默认是 一般情况下足够了 而且就算你增加了发送缓存区 对方没有增加它对应的接收缓冲 那么在TCP三握手时 最后确定的最大发送窗口还是双方最小的那个缓冲区 就算你无视 发了更多的数据 那么多出来的数据也会被丢弃 除非双方都协商好

lishixin/Article/program/Java/hx/201311/26575

6. java中短时间new Socket次数过多,并且socket.close() 并不是释放连接,而是设置成了time_wait状态怎么处理

如果短时间内需要建立的连接过多的话,建议使用Socket线程池来做处理。new 太多的话,占的内存会很多,速度变慢。

7. java:ServerSocket中获取所有连接上的Socket

可以的。
首先确保你已经建立了ServerSocket(对象名字是server),并接受到了连接:
ArrayList<Socket
>
sockets
=
new
ArrayList<Socket>();
//保存所有接受的socket
while(true){
//一直接受连接
Socket
s
=
server.accept();
sockets.add(s);
}
///得到仍处于连接当中的Socket
public
ArrayList<Socket
>
getConnectedSockets(){
ArrayList<Socket
>
alivedSockets
=
new
ArrayList<Socket>();
for(int
i=0;i<sockets.size();i++){
if(sockets.get(i).isConnected()){
alivedSockets
.add(sockets.get(i));
}
}
return
alivedSockets;
}

8. Java socket 编程 连接失败!

如果是不停的发送来数据,你可源以维持一个socket长连接,当客户端连接上发送完数据后不要关闭socket,继续发送握手信息以维持连接。客户端很多的话就用线程池ThreadPoolExecutor.
具体资料:

阅读全文

与java线程池socket相关的资料

热点内容
wokrNC和UG编程哪个好 浏览:487
爱奇艺随刻文件名 浏览:40
wps是怎么压缩文件 浏览:986
dos配置文件名 浏览:582
java软件工程师做什么 浏览:897
3dmax导出ive文件 浏览:464
数据重复性好是什么意思 浏览:166
如何查找电脑文件使用历史记录 浏览:821
linux可以运行exe的文件吗 浏览:935
库币是哪个国家的app 浏览:201
大智慧internet文件夹有哪些文件 浏览:89
编程培训课程哪个排名好 浏览:124
我的cad怎么没显示文件选项卡 浏览:952
命令行当前是哪个数据库 浏览:588
为什么appstore打开空白 浏览:574
选货车软件什么app最好 浏览:577
psv仙境传说ace如何降级版本 浏览:460
杭州哪里学少儿编程比较好 浏览:642
什么网站可以自己翻唱歌曲 浏览:291
javalist作为参数 浏览:176

友情链接