- 浏览: 78505 次
- 性别:
- 来自: 南京
文章分类
最新评论
多线程Java Socket编程示例
这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.
1.服务端
package sterning;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.*;
import java.util.concurrent.*;
public class MultiThreadServer {
private int port=8821;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=10;//单个CPU线程池大小
public MultiThreadServer() throws IOException{
serverSocket=new ServerSocket(port);
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
System.out.println("服务器启动");
}
public void service(){
while(true){
Socket socket=null;
try {
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket=serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}
}
class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
private PrintWriter getWriter(Socket socket) throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket) throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public String echo(String msg){
return "echo:"+msg;
}
public void run(){
try {
System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br=getReader(socket);
PrintWriter pw=getWriter(socket);
String msg=null;
while((msg=br.readLine())!=null){
System.out.println(msg);
pw.println(echo(msg));
if(msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.客户端
package sterning;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadClient {
public static void main(String[] args) {
int numTasks = 10;
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < numTasks; i++) {
exec.execute(createTask(i));
}
}
// 定义一个简单的任务
private static Runnable createTask(final int taskID) {
return new Runnable() {
private Socket socket = null;
private int port=8821;
public void run() {
System.out.println("Task " + taskID + ":start");
try {
socket = new Socket("localhost", port);
// 发送关闭命令
OutputStream socketOut = socket.getOutputStream();
socketOut.write("shutdown\r\n".getBytes());
// 接收服务器的反馈
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = br.readLine()) != null)
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
}
这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.
1.服务端
package sterning;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.*;
import java.util.concurrent.*;
public class MultiThreadServer {
private int port=8821;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=10;//单个CPU线程池大小
public MultiThreadServer() throws IOException{
serverSocket=new ServerSocket(port);
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
System.out.println("服务器启动");
}
public void service(){
while(true){
Socket socket=null;
try {
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket=serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}
}
class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
private PrintWriter getWriter(Socket socket) throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket) throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public String echo(String msg){
return "echo:"+msg;
}
public void run(){
try {
System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br=getReader(socket);
PrintWriter pw=getWriter(socket);
String msg=null;
while((msg=br.readLine())!=null){
System.out.println(msg);
pw.println(echo(msg));
if(msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.客户端
package sterning;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadClient {
public static void main(String[] args) {
int numTasks = 10;
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < numTasks; i++) {
exec.execute(createTask(i));
}
}
// 定义一个简单的任务
private static Runnable createTask(final int taskID) {
return new Runnable() {
private Socket socket = null;
private int port=8821;
public void run() {
System.out.println("Task " + taskID + ":start");
try {
socket = new Socket("localhost", port);
// 发送关闭命令
OutputStream socketOut = socket.getOutputStream();
socketOut.write("shutdown\r\n".getBytes());
// 接收服务器的反馈
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = br.readLine()) != null)
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
}
发表评论
-
Spring事务隔离级别和传播特性
2017-08-17 20:47 0Spring事务隔离级别 ... -
简单排查java应用CPU飙高的线程问题
2017-01-14 20:22 01. 获取要查看的进程的ID ps aux | ... -
nginx rtmp模块
2014-08-06 11:14 0------------------------------ ... -
使用ActiveMQ+MQTT实现Android点对点消息通知-转载
2014-07-11 20:59 4292原文地址:http://bl ... -
Nginx简单的防盗链和带宽限制-转载
2014-05-19 18:07 1751原文:http://floss.zoomquiet.io/d ... -
各实用链接
2014-05-16 14:01 0一、 ffmpeg参数详解 http://blog.1 ... -
javamelody-monitoring
2014-04-30 12:02 0http://my.oschina.net/jacobking ... -
命令日记
2014-04-29 11:14 0--代替show processlist命令的sql S ... -
配置tomcat jvm 及cpu查看
2014-04-28 17:49 5572使用tomcat做为java容器,cpu占用偏高的原因,目前 ... -
Hibernate和IBatis对比
2014-04-09 17:09 0简介 Hibernate是当前最 ... -
ECLIPSE里面SVN图标消失,文件状态不显示问题
2014-04-09 08:43 1487ECLIPSE里面SVN状态图标消失,重新启动eclips ... -
Java NIO API详解
2014-04-08 22:34 994NIO API 主要集中在 java.nio 和它的 sub ... -
关于 Jms Topic 持久订阅
2014-04-03 09:16 1101消息中间件的 Topic 机制,一般情况下没有保存消息。一 ... -
nginx有时无法转发自定义header头内容的问题-(转载)
2014-03-26 11:06 9761原文地址:http://313968.blog.51cto. ... -
让httpclient接受所有ssl证书https
2014-03-13 12:28 2204原文地址:http://hi.baidu.com/qnaac ... -
java装载器执行过程比较有意思的实例
2014-03-10 17:57 0public class Test { private ... -
在eclipse.ini中为eclipse指定jdk启动
2013-01-07 17:48 2548机器上装了好几个版本的jdk,要用指定的jdk启动eclips ... -
Spring事务配置的五种方式
2012-10-30 10:18 826前段时间对Spring的事务配置做了比较深入的研究,在此之间对 ... -
spring事务详解(转载)
2012-10-30 10:07 909Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我 ... -
Java集群之session共享解决方案(转载)
2012-10-10 10:54 1241Java应用服务器浏览器互联网网络应用 随着互联网的 ...
相关推荐
多线程Java Socket编程示例展示了如何在服务器端利用线程池处理多个并发客户端请求。在这个例子中,`sterning.MultiThreadServer` 类创建了一个监听特定端口(默认为8821)的服务器,并使用`ExecutorService`来管理...
多线程Java Socket编程的关键在于,通过ExecutorService线程池来管理和调度任务,可以有效地应对大量并发的客户端请求。这种方式避免了单线程模型中,一个客户端的阻塞会导致其他客户端无法服务的问题。此外,线程池...
Java 多线程-Socket 编程是指在 Java 语言中使用多线程技术来实现网络编程,特别是使用 Socket 编程来实现客户端和服务器端的通信。在 Java 中,多线程可以使用 Thread 类和 Runnable 接口来实现,而 Socket 编程则...
### 多线程Java_Socket编程示例 #### 背景与意义 在现代软件开发尤其是网络应用领域,多线程技术与Socket编程是两个非常重要的概念和技术。多线程能够有效地利用计算机资源,提高程序运行效率;而Socket编程则是...
综上所述,这个Java Socket编程示例可能会展示如何创建一个简单的客户端和服务器应用程序,同时结合了用户友好的界面。通过阅读和理解示例代码,你可以学习到Java网络编程的基础,包括建立连接、交换数据和管理资源...
Java Socket 编程实现的简单多线程 WEB 服务器 在本文中,我们将详细介绍如何使用 Java 的 Socket 编程实现一个简单的多线程 WEB 服务器。 Socket 编程简介 Socket 编程是 Java 网络编程的基础,它允许开发者创建...
在实际应用中,Java Socket编程通常涉及异常处理、多线程以及数据的序列化与反序列化。例如,服务器端可能需要同时处理多个客户端连接,这时可以使用多线程来并发处理。客户端和服务器之间的数据交换可以采用JSON、...
在本文中,我们将深入探讨Java Socket编程的关键概念、工作原理以及如何创建服务端和客户端,并讨论如何通过多线程支持多个客户端同时在线。 首先,Socket是网络上的两个进程间通信的端点,它允许数据在网络中双向...
在学习和实践多线程和Socket编程时,可以参考"java多线程"、"java Socket的知识"等文档,这些资料通常会涵盖线程的创建、管理、同步和通信,以及Socket的创建、连接、数据传输等基本操作。通过深入理解这些知识点,...
本实例集中,我们关注的是三个关键的Socket编程示例,旨在帮助初学者理解其工作原理和应用。 1. **基础Socket连接** - 客户端(Socket):通过`Socket`类创建一个到指定服务器(IP地址和端口号)的连接。`Socket`...
本资料包含的"Java源码:Socket编程"是一个示例,旨在帮助开发者理解并掌握Java中的Socket编程技术。 首先,Socket编程涉及的主要类有`ServerSocket`和`Socket`。`ServerSocket`类用于创建服务器端的监听套接字,它...
在Java Socket编程中,多线程的应用通常体现在以下两个方面: 1. **服务器端多线程**:当服务器接收到客户端的连接请求时,为了同时处理多个客户端的请求,服务器端可以创建一个新的线程来处理每个连接。这样,...
Socket编程示例代码是关于TCP/IP套接字通信的基础,它可以用于建立两个应用程序之间的双向通信通道。这些示例可能涵盖服务器端(ServerSocket)的创建,客户端(Socket)的连接,数据的读写,以及异常处理。 最后,...
多线程是Java编程中的一个重要概念,允许程序同时执行多个任务。在这个“Java Socket 多线程实例”中,我们将会探讨如何结合这两个关键概念来创建一个聊天服务器和客户端应用。 首先,`ChatServer.java` 文件通常...
Java Socket 多线程通信是网络编程中的一个重要概念,它允许两个或多个应用程序通过TCP/IP进行数据交换。在这个示例中,我们创建了一个双向通信的系统,即双工通信,这意味着数据可以在两个方向上同时传输。这样的...
Java Socket通信是网络编程中的基础概念,主要用于两个应用程序之间的双向通信。在这个"Java_socket 通信示例"中,我们看到的是一个简单的聊天室应用,它利用了Java的Socket API来实现实时的数据交换。以下是对这个...
在提供的部分内容中,我们看到涉及了多线程Java Socket编程的核心实现。MultiThreadServer类代表了一个多线程的服务器端,它使用ExecutorService来管理线程池,接受客户端的Socket连接,并为每个连接分配一个Handler...
总的来说,Java Socket编程涉及到网络通信的基本模型、端口的使用、数据的读写以及多线程处理等核心概念。通过`ServerSocket`和`Socket`类,开发者可以构建出能够处理多个客户端请求的服务器,以及与之交互的客户端...
Socket编程是计算机网络编程中的重要组成部分,特别是在Java中,它为开发者提供了在不同网络设备间交换数据的能力。本文将深入探讨Linux环境下使用Java进行Socket编程的相关知识点。 首先,Socket是网络通信中的一...
书中提供了多个实用的案例,如简单的聊天室应用、文件传输服务等,这些案例不仅展示了Socket编程的基本原理,也涵盖了多线程、非阻塞I/O和安全通信等高级主题。通过动手实践,读者可以将理论知识转化为实际技能,更...