java socket tcp 多线程_java socket多线程问题,我写了一个socket tcp服务端,高手来进来看下,谢啦。是关于多客户端并联的问题...

博主探讨了在Java中使用Socket处理TCP连接时遇到的多线程问题。当大量客户端连接时,创建对应数量的线程可能导致服务器资源耗尽。博主提到QQ等应用的处理方式,并对线程生命周期和内存管理表示困惑。代码示例展示了如何为每个客户端连接创建新线程。寻求解决大规模并发连接和线程管理的建议。
摘要由CSDN通过智能技术生成

我的处理方法是,每来一条tcp连接,我就为这一个客户端开一条线程进行数据通信解析处理。那么,如果有5000甚至更多的客户端来进行连接,我将有可能同时产生5000+线程,而我查过线程的...

我的处理方法是,每来一条tcp连接,我就为这一个客户端开一条线程进行数据通信解析处理。那么,如果有5000甚至更多的客户端来进行连接,我将有可能同时产生5000+线程,而我查过线程的最大数取决于可用虚拟内存的大小,默人一个线程可拥有1M的栈空间,所以一般来说也只可以创建4000+个线程(虚拟内存是4G的话)。。。

就算可以创建5000+个线程满足这些客户端进行连接,那么我想这么多的线程估计服务器CPU也吃不消。。。

不知道各位高手有没有遇到处理这样的情景,比如QQ是怎么做的,给小弟点建议啥的。。。不甚感激。另外我们这项目只能采用tcp通信。

PS:一般我们创建一条线程都是通过new一个对象,然后.start()进行启动线程。我们一般认为start()方法执行结束后也就意味线程已经停止对象也就没有用了该进行销毁了。可是我测试发现,就算start()已经执行结束了,对象还在,还是可以读取到对象的属性。。。说明对象并没有被销毁。这样就有一个问题,如果同时存在很多线程比如5000+,那就会产生很多的没有被销毁的对象内存垃圾。。。我又想到了对象单例模式,可是我觉得我用不上,因为启动线程的时候我给线程里面变量赋值是通过构造函数的方式。。。如下代码显示:

public class ShujubaoThread extends Thread {

byte[] bs;

public ShujubaoThread(byte[] mybt){

this.bs=mybt;

}

public void run() {

//开始解析数据包

int length=bs.length;

//。。。

//解析数据包结束

}

public static void main(String[] strings){

//第1个客户端建立连接,解析收到的数据包

ShujubaoThread t1=new ShujubaoThread(new byte[1]);

t1.start();

//第2个客户端建立连接,解析收到的数据包

ShujubaoThread t2=new ShujubaoThread(new byte[1]);

t2.start();

//第3个客户端建立连接,解析收到的数据包

ShujubaoThread t3=new ShujubaoThread(new byte[1]);

t3.start();

//第4个,第5个,第6个,第7个,第8个,第9个...

}

}

不知道我这做法对不对,或者有什么更好的方法。。。

我是第一次写socket服务端,对线程也不是太熟,希望给我高手指点一二

拜谢。。。 再次拜谢。。。

展开

连接的步骤是什么? 首先,你需要创建一个ServerSocket对象并指定端口号。然后,在无限循环中,等待客户端连接请求。一旦有连接请求,就创建一个新的Socket对象来处理连接,并将Socket传递给一个新的线程来处理。在线程中,你可以使用Socket对象中的输入和输出流来进行通信。最后,关闭Socket和ServerSocket对象,释放资源。以下是Java代码示例: ``` import java.net.*; import java.io.*; public class MultiThreadedServer implements Runnable { private Socket clientSocket; public static void main(String[] args) throws IOException { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(8080); System.out.println("Server started."); while (true) { System.out.println("Waiting for a client ..."); Socket socket = serverSocket.accept(); System.out.println("Client accepted"); new Thread(new MultiThreadedServer(socket)).start(); } } catch (IOException e) { e.printStackTrace(); } finally { if (serverSocket != null) { serverSocket.close(); } } } public MultiThreadedServer(Socket socket) { this.clientSocket = socket; } public void run() { try { PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println("Received message: " + inputLine); out.println(inputLine); } in.close(); out.close(); clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值