`
whao189
  • 浏览: 123450 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

scoket创建多线程服务器

阅读更多
这几天再看socket感觉收获还是蛮大的,以前对socket不太了解正好这一段时间可以好好地学习顺便整理一下以前的知识。

其他的前辈们都学如果做java没有接触过socket那就算没有学java 可见socket是相当重要的,更为可气的是我现在线程这一块的东西都没有怎么接触过,说来惭愧啊。。。

好了直接看demo

需求如下:现在我有一个socket 服务器 有N个客户端要连接这个服务器 那么我们如何处理这种情况。

分析如下:
      当我们的server 接收到一个客户端的就会以客户端进行通信然后断开 关闭连接,然后接收下一个 ,加入有N多个客户端同时请求的话(也就是并发了)那么server 无法同时与多个客户端进行通信

解决方案:
第一: 我们使用多线程 每当有一个客户端与server连接的时候我们就启动一个线程 来处理该客户端的请求
第二: 我们使用线程池(这个分为两种情况 我们可以自己写线程池 也可以使用JDK 中的)

方案优劣评定:在代码后面在评定吧.

第一种方案 伪代码如下:

public void service()throws Exception{
   while(true){
       Socket socket = socketServer.accept();
       Thread thread = new Thread(new Handler(socket));
       thread.start();
   }
}
class Handler implements Runnable{
   private Socket socket;
   public Handler(Socket socket){
   this.socket = socket
   }
   public void run(){
      //这里处理相应的逻辑
   }
}



第二种方案 伪代码如下:
 public class Server{
    private ExecutorServer executorService;
    private ServerSocket serverSocket;
    public Server(){
       serverSocket = new ServerSocket();
       executorService = ExecutorService.newFixedThreadPool(5);
    }
    public void service()throws Exception{
      while(true){
       Socket socket = serverSocket.accept();
       executorService.execute(new Handler(socket))
       system.out.println("启动了服务器");
      }
    }
 }
class Handler implements Runnable{
   private Socket socket;
   public Handler(Socket socket){
   this.socket = socket
   }
   public void run(){
      //这里处理相应的逻辑
   }
}



以上两种形式都能实现多线程下的 socket 服务,但是功能都能实现然而效率未必相同。

就第一种方案来讲:如果说客户端比较少的情况下服务器还是能支撑,但是在客户端很多的情况无论如何服务器如何优化,频繁的创建和销毁线程总是会占用很大的开销的。。

所以第一种方案我个人认为在大多数情况下不可行,如果其他看客有好的解决方案可以共享一下!

第二宗方案:多线程实现是基于JDK 下的线程池来实现的,我个人感觉不错(当然如果你认为自己能写出比java大师们写的更好的线程池的话 麻烦让我来拜读一下,,谢谢!) 他创建线程的个数是依赖于 服务器的cpu数 来创建的。。。。不过这里我们给他定死了。就是5个。。。这样做的好处是减少了系统频繁的创建和销毁线程占用的资源。。。


但是无论如何我始终认为 以上两种做法会有问题,第一种就不说了。。。至于第二种 我在想如果 我们创建了 N 多个线程,那么服务器端我们是通过队列来处理的,如果请求比较多 比较频繁的话队列里面怎么优化?

如果即使优化了那么还会出现线程阻塞么? 如果会,应该怎么解决?


分享到:
评论

相关推荐

    C++编写 win32控制台下 Socket通信 多线程 聊天室 服务器 客户端

    C++语言编写,SOCKET套接字通信,分服务器和客户端,多线程模型,Win32控制台。 首先聊天室分为服务端和客户端,通过TCP连接通信。运行顺序为: 1.首先打开服务服; 2.打开客户端,用户输入名字,连接到服务端后...

    MFC实现多个客户端通过服务器进行通信的Socket多线程编程

    1.基于MFC通过多线程实现多个客户端同时连接服务器。 2.服务端通过维护一张转发表来实现对客户端信息的转发,比如客户端A向客户端B发送消息,服务器接收到客户端A发过来消息内容和客户端B信息之后,通过转发表查找到...

    C#.net同步异步SOCKET通讯和多线程总结

    服务器端可以创建多个线程,每个线程负责处理一个客户端的连接请求,从而提高服务器端的并发处理能力。 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接...

    Java Socket编程实现的简单多线程WEB服务器

    Java Socket 编程实现的简单多线程 WEB 服务器 在本文中,我们将详细介绍如何使用 Java 的 Socket 编程实现一个简单的多线程 WEB 服务器。 Socket 编程简介 Socket 编程是 Java 网络编程的基础,它允许开发者创建...

    socket 一个服务器对应多个客户端使用多线程

    多线程实现的一对多编程,使用Linux下的socket进行编程。

    Linux下基于socket多线程并发通信的实现.pdf

    在Linux下基于socket多线程并发通信的实现中,服务器端和客户端都是使用多线程技术来处理客户的请求。在服务器端,一旦出现客户发出的请求,服务器可以开启一个子线程来接受、处理客户的相关请求,从而获取来自客户...

    javasocket多线程.pdf

    今天,我们将学习使用 Java Socket 实现多线程服务器的编程。 多线程服务器的优点是可以同时处理多个客户端的连接请求,从而提高服务器的处理能力。下面我们将具体分析 Server.java 代码,了解如何使用 Java Socket...

    python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例

    本文在上文的基础上重新实现支持多线程的服务器。 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import (QByteArray, QDataStream, QDate, QIODevice, QRegExp, Qt) from ...

    实现TCP SOCKET 多线程 传输文件

    代码中利用socket TCP协议,服务器端监听客户端 一旦收到connect连接,创建线程处理 支持多线程并发

    VS2010 同步TCP SOCKET应用编程 服务器 客户端 消息解析 多线程

    利用TCP协议和同步套接字以及多线程编写 在监听线程中,服务器一旦接受一个连接,就创建一个与该玩家对应的线程,用于接收该玩家发送的信息,并根据该玩家发送的信息提供相应的服务。 有多少个玩家连接,就创建多少...

    基于多线程的非阻塞 socket 编程

    # 基于多线程的非阻塞Socket编程教程 ## 简介 基于多线程的非阻塞Socket编程是一种高效处理网络通信的技术,结合了多线程编程和非阻塞I/O。它用于构建高性能的网络服务器和客户端,可以同时处理多个连接而不使线程...

    java多线程+Socket实现的漂亮QQ

    系统功能包括: 创建用户、恢复用户、用户登录、系统各项...Java swing、Spring、Hibernate、MySql5、Socket、多线程、IO流、JDBC 开发工具:NetBeans7+JDK1.6 服务器地址和端口由config.properties配置,可任意移植

    有关java线程循环和serversocket和socket的程序借鉴.pdf

    在本实验中,我们使用了 ServerSocket 和 Socket 类来编写多线程的服务器端和客户端的通信程序。 1. 服务器端 在服务器端,我们创建了一个 TCPServer 类,使用 ServerSocket 类来监听客户端的连接请求。在 main ...

    javasocket多线程[文].pdf

    Java Socket 多线程编程是 Java 语言中的一种网络编程方式,用于实现客户端和服务器之间的数据交换。通过使用 ServerSocket 和 Socket 类,可以实现服务器端的 Socket 编程。多线程编程可以提高程序的执行效率和...

    MFC socket编程,网络传输(服务器端,客户端)

    用socket套接字实现了文件传输,尤其适用于初学者学习socket进行创建,绑定,监听,接收等过程,服务器端和客户端进行通信的整个流程,MFC界面简单。发送端有,create ,listen,accept,send等函数;接收端有create...

    VBSocket多线程[整理].pdf

    VBSocket多线程技术.pdf 这篇文章主要讲述了VBSocket多线程技术在网络聊天程序中的应用。下面将对标题、描述、标签...这篇文章讲述了VBSocket多线程技术在网络聊天程序中的应用,包括服务器端和客户端的编程实现细节。

    python多线程实现TCP服务端

    本文实例为大家分享了python多线程实现TCP服务端的具体代码,供大家参考,具体内容如下 需求 1.创建一个TCP服务器接收服务端发送的信息并给予答复 2.以多线程方式实现接收客户端信息 3.间客户端发送的信息解码...

    socket多线程聊天

    本文件是基于vb6.0编写的socket聊天程序,运行时先启动服务器,在同一个局域网内启动客户端,输入服务器IP连接,连接成功后即可输入...注:服务器启动前要先将 服务器中的 ACCESS文件 创建名为"用户信息管理"的数据源。

    linux下多线程服务器编程

    整个程序的架构就是一开始创建一个线程,在这个线程里面做下面几个操作: 1、调用socket,创建监听客户端的socket 2、设置socket属性,端口可以重用 3、调用bind,绑定地址和端口 4、调用listen,开始监听 5、调用...

Global site tag (gtag.js) - Google Analytics