SocketServer:
package com.hou.blocksocket.server;
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.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class UnBlockEchoServer {
private int port = 8000;
private ServerSocketChannel serverSocketChannel = null;
private ExecutorService executerService;// 线程池
private static final int maxThreadNum = 4;
public UnBlockEchoServer() {
executerService = Executors.newFixedThreadPool(Runtime.getRuntime()
.availableProcessors()
* maxThreadNum);// 创建一个线程池
try {
serverSocketChannel = ServerSocketChannel.open();// 打开serverSocketChannel
serverSocketChannel.socket().setReuseAddress(true);// 设置该端口号停掉,该端口号可以被顺利的占用
serverSocketChannel.socket().bind(new InetSocketAddress(port));// 服务器绑定端口号
System.out.println("服务器成功启动;端口号=" + port);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 服务方法
*/
public void Service() {
while (true) {
SocketChannel socketChannel = null;
try {
socketChannel = serverSocketChannel.accept();// 等当客户端登陆
executerService.execute(new Handler(socketChannel));// 抛给线程池执行
} catch (Exception e) {
System.out.println("出现异常消息了" + e);
}
}
}
class Handler implements Runnable {// 执行者
private SocketChannel sockerChannel;
public Handler(SocketChannel socketChannel) {
this.sockerChannel = socketChannel;
}
@Override
public void run() {
handle(sockerChannel);// 调用服务
}
public void handle(SocketChannel socketChannel) {
Socket socket = socketChannel.socket();// 得到socket
System.out.println("接受到来自客户端的连接请求=" + socket.getInetAddress() + ":"
+ socket.getPort());
try {
BufferedReader br = this.getReader(socket);
PrintWriter writer = this.getWriter(socket);
String msg = null;
while ((msg = br.readLine()) != null) {
System.out.println(msg);
writer.println("你好!收到了你的请求了!!!");
if (msg.equals("88")) {
break;
}
}
} catch (IOException e) {
System.out.println("服务器端出现了异常消息了=" + e);
e.printStackTrace();
} finally {
if (socketChannel != null) {// 关闭socketChannel
try {
socketChannel.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 得到写者
*
* @param socket
* @return
* @throws IOException
*/
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream out = socket.getOutputStream();
return new PrintWriter(out, true);
}
/**
* 得到读者
*
* @param socket
* @return
* @throws IOException
*/
private BufferedReader getReader(Socket socket) throws IOException {
InputStream in = socket.getInputStream();
return new BufferedReader(new InputStreamReader(in));
}
}
public static void main(String args[]){
new UnBlockEchoServer().Service();
}
}
分享到:
相关推荐
一个实现非阻塞模式SOCKET的PASCAL例子,给需要的人
非阻塞模式的Socket编程是网络编程中的一个重要概念,它与传统的阻塞模式Socket形成了鲜明对比。在阻塞模式下,Socket操作会一直等待直到有数据可读或可写,这可能导致程序在等待期间无法执行其他任务。而非阻塞模式...
在这个"socket多线程例程非阻塞模式"的示例中,我们将深入探讨如何在Windows平台上实现多线程的socket通信,并了解非阻塞模式的工作原理。 首先,让我们来理解Socket的基本概念。Socket是进程间通信(IPC)的一种...
vb6 纯API实现阻塞和非阻塞模式Socket
### Linux UDP Socket 非阻塞模式与阻塞模式的区别详解 #### 一、引言 在进行网络编程时,我们经常会遇到阻塞模式与非阻塞模式的选择问题。这两种模式直接影响程序的运行效率和资源利用率。本文将详细介绍在Linux...
在通过一天学习,慢慢摸索中,研究出来了自己成果!
本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **阻塞模式**:在阻塞模式下,当一个Socket调用(如recv或send)执行时,如果...
而非阻塞模式下,Socket调用不会使调用线程挂起,而是立即返回,即使没有数据可读或可写。这样,程序可以同时处理多个事件,提高系统效率和响应性。 MFC通过CAsyncSocket类提供对非阻塞Socket的支持。CAsyncSocket...
本篇主要关注的是Socket编程中的阻塞和非阻塞模式,这两种模式在处理I/O操作时有着显著的区别。 阻塞Socket(Blocking Socket)是最基础的Socket编程模型。当一个Socket被设置为阻塞模式时,调用recv()或send()等...
"Socket 通信(TCP)非阻塞模式-select 模型" 本资源是关于 Socket 通信的非阻塞模式下的 Select 模型的示例代码,基于 TCP 协议,分为服务器端和客户端。该示例代码展示了如何使用 Select 模型实现非阻塞 Socket ...
通过本篇内容的学习,您将了解到设置socket函数为非阻塞模式的方法,并且能够深入了解阻塞与非阻塞模式在socket编程中的应用。此外,我们还将探讨SOCKET类的设计与实现。 #### 一、基本概念与环境搭建 **1.1 基本...
用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制
**阻塞模式Socket详解——Windows平台** 在计算机网络编程中,Socket是进程间通信的一种方式,它允许不同计算机上的进程通过网络进行数据交换。在Windows操作系统下,Socket有两种工作模式:阻塞模式(Blocking ...
然后,通过调用`WSAAsyncSelect()`函数将Socket设置为非阻塞模式,或者使用`ioctlsocket()`函数配合`FIONBIO`标志。 超时设置通常涉及到两个方面:连接超时和读/写超时。对于连接超时,我们可以利用`setsockopt()`...
在使用socket进行编程时,会遇到两种基本的操作模式:阻塞模式与非阻塞模式。这两种模式对于程序的性能和响应性有着重要的影响。 #### 二、阻塞模式 当一个socket处于阻塞模式时,所有的I/O操作都会阻塞当前线程,...
需要注意的是,如果我们使用WSAAsynSelect函数来设置套接口为非阻塞模式,那么我们不能再使用ioctlsocket函数来将其设置为阻塞模式。否则,我们将会收到WSAEINVAL错误。 在套接口编程中,阻塞和非阻塞是两个重要的...
一旦连接成功,客户端也可以设置Socket为非阻塞模式,使用send()发送数据,recv()接收数据,同样需要处理可能的无数据可读或无法写入的情况。 `SocketNB.sln`是Visual Studio的解决方案文件,包含了项目配置信息;`...
4. 设置非阻塞模式:在Windows下,可以通过`ioctlsocket()`函数配合`FIONBIO`标志来设置`socket`为非阻塞模式。 5. 异步事件处理:`WSAAsyncSelect()`或`WSAEventSelect()`函数的使用,以及如何根据接收到的事件进行...
在这个例子中,服务端使用了多线程来接受客户端的连接请求,并且采用了非阻塞模式的Socket接收数据。当有数据到来时,创建一个新的子进程来处理数据,从而提高并发性能。 客户端通常负责发送数据到服务器,可以使用...