这几天再看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++语言编写,SOCKET套接字通信,分服务器和客户端,多线程模型,Win32控制台。 首先聊天室分为服务端和客户端,通过TCP连接通信。运行顺序为: 1.首先打开服务服; 2.打开客户端,用户输入名字,连接到服务端后...
1.基于MFC通过多线程实现多个客户端同时连接服务器。 2.服务端通过维护一张转发表来实现对客户端信息的转发,比如客户端A向客户端B发送消息,服务器接收到客户端A发过来消息内容和客户端B信息之后,通过转发表查找到...
服务器端可以创建多个线程,每个线程负责处理一个客户端的连接请求,从而提高服务器端的并发处理能力。 C#.net同步异步SOCKET通讯和多线程总结是指在C#.net环境下实现的同步异步套接字通信和多线程编程的总结。套接...
Java Socket 编程实现的简单多线程 WEB 服务器 在本文中,我们将详细介绍如何使用 Java 的 Socket 编程实现一个简单的多线程 WEB 服务器。 Socket 编程简介 Socket 编程是 Java 网络编程的基础,它允许开发者创建...
多线程实现的一对多编程,使用Linux下的socket进行编程。
在Linux下基于socket多线程并发通信的实现中,服务器端和客户端都是使用多线程技术来处理客户的请求。在服务器端,一旦出现客户发出的请求,服务器可以开启一个子线程来接受、处理客户的相关请求,从而获取来自客户...
今天,我们将学习使用 Java Socket 实现多线程服务器的编程。 多线程服务器的优点是可以同时处理多个客户端的连接请求,从而提高服务器的处理能力。下面我们将具体分析 Server.java 代码,了解如何使用 Java Socket...
本文在上文的基础上重新实现支持多线程的服务器。 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import (QByteArray, QDataStream, QDate, QIODevice, QRegExp, Qt) from ...
代码中利用socket TCP协议,服务器端监听客户端 一旦收到connect连接,创建线程处理 支持多线程并发
利用TCP协议和同步套接字以及多线程编写 在监听线程中,服务器一旦接受一个连接,就创建一个与该玩家对应的线程,用于接收该玩家发送的信息,并根据该玩家发送的信息提供相应的服务。 有多少个玩家连接,就创建多少...
# 基于多线程的非阻塞Socket编程教程 ## 简介 基于多线程的非阻塞Socket编程是一种高效处理网络通信的技术,结合了多线程编程和非阻塞I/O。它用于构建高性能的网络服务器和客户端,可以同时处理多个连接而不使线程...
系统功能包括: 创建用户、恢复用户、用户登录、系统各项...Java swing、Spring、Hibernate、MySql5、Socket、多线程、IO流、JDBC 开发工具:NetBeans7+JDK1.6 服务器地址和端口由config.properties配置,可任意移植
在本实验中,我们使用了 ServerSocket 和 Socket 类来编写多线程的服务器端和客户端的通信程序。 1. 服务器端 在服务器端,我们创建了一个 TCPServer 类,使用 ServerSocket 类来监听客户端的连接请求。在 main ...
Java Socket 多线程编程是 Java 语言中的一种网络编程方式,用于实现客户端和服务器之间的数据交换。通过使用 ServerSocket 和 Socket 类,可以实现服务器端的 Socket 编程。多线程编程可以提高程序的执行效率和...
用socket套接字实现了文件传输,尤其适用于初学者学习socket进行创建,绑定,监听,接收等过程,服务器端和客户端进行通信的整个流程,MFC界面简单。发送端有,create ,listen,accept,send等函数;接收端有create...
VBSocket多线程技术.pdf 这篇文章主要讲述了VBSocket多线程技术在网络聊天程序中的应用。下面将对标题、描述、标签...这篇文章讲述了VBSocket多线程技术在网络聊天程序中的应用,包括服务器端和客户端的编程实现细节。
本文实例为大家分享了python多线程实现TCP服务端的具体代码,供大家参考,具体内容如下 需求 1.创建一个TCP服务器接收服务端发送的信息并给予答复 2.以多线程方式实现接收客户端信息 3.间客户端发送的信息解码...
本文件是基于vb6.0编写的socket聊天程序,运行时先启动服务器,在同一个局域网内启动客户端,输入服务器IP连接,连接成功后即可输入...注:服务器启动前要先将 服务器中的 ACCESS文件 创建名为"用户信息管理"的数据源。
整个程序的架构就是一开始创建一个线程,在这个线程里面做下面几个操作: 1、调用socket,创建监听客户端的socket 2、设置socket属性,端口可以重用 3、调用bind,绑定地址和端口 4、调用listen,开始监听 5、调用...