package javasrc.thread;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @author PC504
* 网络服务器模型,一旦有客户端连接到该服务器,
* 则启动一个新线程为该连接服务,服务内容为往客户端输送一些字符信息
* 1. 建立监听端口,创建线程池。
* 2. 发现有新连接,使用线程池来执行服务任务。
* 3. 服务完毕,释放线程到线程池
*
*/
public class ThreadUtil {
private static final int PORT = 19527;
private ServerSocket serverSocket = null;
private ExecutorService pool = null;
public static void main(String[] args) {
//
ThreadUtil tu = new ThreadUtil();
tu.start();
}
public void start(){
try {
//新建了一个线程池,线程池里面有 3 个线程为任务队列服务.如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新线程将代替它执行后续的任务
pool = Executors.newFixedThreadPool(3);
serverSocket = new ServerSocket(PORT); //ServerSocket 对象来初始化监听端口
serverSocket.setReuseAddress(true);
System.out.println("I'm listening");
while(true){
Socket socket = serverSocket.accept(); //当有新连接建立时,accept 返回时,将服务任务提交给线程池执行
pool.execute(new ServiceThread(socket));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cleanup();
}
public void cleanup() {
if (null != serverSocket) {
try {
System.out.println("serverSocket.close()");
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//serverThreadPool.shutdown();
pool.shutdown();
}
}
package javasrc.thread;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.net.Socket;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.ReentrantLock;
public class ServiceThread implements Runnable , Serializable{
/**
* protocol xieyi layer independent duyi
*/
private static final long serialVersionUID = 1L;
private static ReentrantLock lock = new ReentrantLock();
private Socket socket = null;
private static int count = 0;
public static int getCount() {
int ret = 0;
try {
lock.lock();
ret = count;
} catch (Exception e) {
// TODO: handle exception
lock.unlock();
}
return ret;
}
private void increaseCount(){
try{
lock.lock();
++count;
}finally{
lock.unlock();
}
}
public ServiceThread(){
}
public ServiceThread(Socket socket){
this.socket = socket;
}
public void run() {
increaseCount();
int curCount = getCount();
String helloString = "hello, id = " + curCount + "\r\n";
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<String> future = executor.submit(new TimeConsumingTask());//Future 表示异步计算的结果
DataOutputStream dos = null;
try {
dos = new DataOutputStream(this.socket.getOutputStream());
dos.write(helloString.getBytes());
try {
dos.write("let's do soemthing other.\r\n".getBytes());
String result = future.get();
dos.write(result.getBytes());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (null != this.socket) {
try {
this.socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (null != dos) {
try {
dos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
executor.shutdown();
}
}
}
class TimeConsumingTask implements Callable<String> {
public String call() throws Exception {
System.out.println("It's a time-consuming task,you'd better retrieve your result in the furture");
return "ok, here's the result: It takes me lots of time to produce this result";
}
}
在客户端cmd 下运行 telnet 127.0.0.1 19527
分享到:
相关推荐
在计算机系统设计中,服务器模型是决定服务处理方式的关键因素,主要分为进程服务器模型和线程服务器模型。这两种模型在处理并发请求、资源管理和性能优化方面各有特点。 **进程服务器模型** 进程服务器模型...
多线程TCP服务器模型提高了服务器的并发处理能力,但也带来了线程管理的复杂性,包括线程的创建、销毁、同步等问题。在实际应用中,还需要考虑服务器的性能瓶颈、内存占用以及线程安全等因素,合理设计线程数量和...
多线程网络服务器的编程模型是一种常见的解决方案,它利用多线程技术来处理并发连接,以提高服务性能。本文将深入探讨多线程网络服务器的常用编程模型,帮助读者理解其原理和应用场景。 首先,我们需要了解多线程的...
"libevent 多线程 HTTP post服务器" 指的是一种使用libevent库构建的、支持多线程处理HTTP POST请求的服务器。libevent是一个事件通知库,它提供了一种方法来执行非阻塞I/O操作,这对于高性能网络服务器尤其重要。而...
多线程服务器模型是指在服务器端使用多个线程来处理客户端的请求,从而提高服务器的处理能力和响应速度。该模型可以解决单线程服务器模型的缺陷,即单线程服务器模型只能处理一个客户端的请求,导致其他客户端的请求...
在单线程服务器模型中,所有客户端请求都由单一主线程处理。当接收到新的客户端连接时,主线程负责接收数据、处理数据,并发送响应。这种模型简单易实现,但是当处理高并发请求时效率较低,因为每个请求都需要等待前...
4. 多线程处理:为了处理多个并发连接,可以为每个新连接创建一个独立的线程。这样,每个连接都在自己的线程中运行,互不干扰,提高了服务器的并发性能。 三、TCP客户端的实现 1. 创建TCP客户端:同样,需要包含QT...
在开发网络应用程序时,多线程技术常常被用于提高服务器的并发处理能力。Qt库作为一个跨平台的C++框架,提供了丰富的功能,包括对网络编程的支持。本篇将深入讲解如何使用Qt构建一个多线程的TCP服务器。 首先,我们...
当多个客户端同时连接到服务器时,单线程服务器只能一次处理一个请求,而多线程服务器可以同时处理多个请求,提高系统的吞吐量。Java的Thread类和Runnable接口提供了实现多线程的基础。在描述中提到的"多线程服务器...
对于客户端,多线程可以用于并行发送或接收数据,或者在一个线程中处理网络通信,而在另一个线程中执行其他计算任务,实现了通信与业务逻辑的解耦。 总结来说,TCP网络通信结合多线程技术可以实现高效、稳定且具有...
当涉及到服务器端的高性能处理时,多线程技术常常被用来提升并发能力,使得服务器能够同时处理多个客户端的请求。本篇文章将深入探讨“TCP服务器多线程”的概念、原理以及实现方法。 首先,我们要理解TCP的基本特性...
本篇文章将详细讲解基于select模型的多线程服务器设计,这是许多网络编程初学者入门的经典案例。 首先,我们需要理解TCP(传输控制协议)。TCP是一种面向连接、可靠的、基于字节流的传输层通信协议,它确保数据的...
HTTP多线程服务器下载是网络编程中的一个重要概念,主要应用于提高大文件下载的效率和速度。在VC++环境中实现这样的功能,需要理解HTTP协议、多线程编程以及文件I/O操作的基本原理。以下是对这些知识点的详细解释: ...
并发处理可以通过多线程、多进程或者其他异步I/O模型(如事件驱动编程或回调函数)来实现。在这个HTTP文件服务器中,多线程是实现并发处理的方法,它有助于提升用户下载文件时的体验,使得多个文件可以同时下载而...
开发者需要理解网络通信的底层原理,熟悉多线程模型,以及掌握相应的编程语言和库函数,才能有效地构建这样的系统。在实际应用中,还需要考虑性能优化、安全性、错误处理等多个方面,以提供稳定高效的网络服务。
本示例中的"C#服务器对多客服端TCP/IP多线程源码"是一个典型的网络编程应用场景,它展示了如何使用C#语言设计一个能同时处理多个客户端连接的服务器。以下是关于这个主题的详细知识点: 1. **TCP/IP协议**:TCP...
在Linux操作系统中,开发一款多线程轻量级HTTP服务器是一项技术挑战,它涉及到网络编程、多线程处理以及对HTTP协议的理解。本项目“Linux下多线程轻量级HTTP服务器”旨在实现一个基本的HTTP服务器,能够响应客户端的...
在实际应用中,多线程和网络编程常常结合使用,比如在服务器端,一个线程可以负责处理一个客户端的连接,多个线程则可以同时处理多个连接,提高服务的并发能力。但是,多线程并不总是最佳解决方案,有时使用异步I/O...
在描述中提到的"tcp_线程搞定"可能是指一个示例程序,展示了如何使用TCP协议并通过多线程处理客户端连接。这个程序可能包含了上述步骤的代码实现,通过分析和学习这个示例,开发者可以更好地理解和掌握多线程Socket...