`
hougechuanqi
  • 浏览: 73689 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

非阻塞模式的Socket

阅读更多
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的PASCAL例子,给需要的人

    非阻塞模式socket程序

    非阻塞模式的Socket编程是网络编程中的一个重要概念,它与传统的阻塞模式Socket形成了鲜明对比。在阻塞模式下,Socket操作会一直等待直到有数据可读或可写,这可能导致程序在等待期间无法执行其他任务。而非阻塞模式...

    socket 多线程 例程 非阻塞模式

    在这个"socket多线程例程非阻塞模式"的示例中,我们将深入探讨如何在Windows平台上实现多线程的socket通信,并了解非阻塞模式的工作原理。 首先,让我们来理解Socket的基本概念。Socket是进程间通信(IPC)的一种...

    vb6 纯API实现阻塞和非阻塞模式Socket

    vb6 纯API实现阻塞和非阻塞模式Socket

    Linux UDP socket 设置为的非阻塞模式与阻塞模式区别

    ### Linux UDP Socket 非阻塞模式与阻塞模式的区别详解 #### 一、引言 在进行网络编程时,我们经常会遇到阻塞模式与非阻塞模式的选择问题。这两种模式直接影响程序的运行效率和资源利用率。本文将详细介绍在Linux...

    socket非阻塞模式

    在通过一天学习,慢慢摸索中,研究出来了自己成果!

    C++ socket 阻塞与非阻塞

    本话题主要探讨的是在C++ Socket编程中的阻塞模式与非阻塞模式,以及它们在多线程环境下的应用和资源管理。 一、阻塞与非阻塞模式 1. **阻塞模式**:在阻塞模式下,当一个Socket调用(如recv或send)执行时,如果...

    MFC实现非阻塞Socket通信

    而非阻塞模式下,Socket调用不会使调用线程挂起,而是立即返回,即使没有数据可读或可写。这样,程序可以同时处理多个事件,提高系统效率和响应性。 MFC通过CAsyncSocket类提供对非阻塞Socket的支持。CAsyncSocket...

    windows的阻塞和非阻塞Socket编程

    本篇主要关注的是Socket编程中的阻塞和非阻塞模式,这两种模式在处理I/O操作时有着显著的区别。 阻塞Socket(Blocking Socket)是最基础的Socket编程模型。当一个Socket被设置为阻塞模式时,调用recv()或send()等...

    Socket通信(TCP)非阻塞模式-select模型

    "Socket 通信(TCP)非阻塞模式-select 模型" 本资源是关于 Socket 通信的非阻塞模式下的 Select 模型的示例代码,基于 TCP 协议,分为服务器端和客户端。该示例代码展示了如何使用 Select 模型实现非阻塞 Socket ...

    Socket C++ TCP阻塞\非阻塞 服务器 客户端 开发

    通过本篇内容的学习,您将了解到设置socket函数为非阻塞模式的方法,并且能够深入了解阻塞与非阻塞模式在socket编程中的应用。此外,我们还将探讨SOCKET类的设计与实现。 #### 一、基本概念与环境搭建 **1.1 基本...

    C++网络编程例子说明异步非阻塞Socket的基本原理和工作机制

    用一个最简单的例子说明异步非阻塞Socket的基本原理和工作机制

    blocking mode socket(阻塞模式socket-windows)

    **阻塞模式Socket详解——Windows平台** 在计算机网络编程中,Socket是进程间通信的一种方式,它允许不同计算机上的进程通过网络进行数据交换。在Windows操作系统下,Socket有两种工作模式:阻塞模式(Blocking ...

    socket非阻塞超时设置

    然后,通过调用`WSAAsyncSelect()`函数将Socket设置为非阻塞模式,或者使用`ioctlsocket()`函数配合`FIONBIO`标志。 超时设置通常涉及到两个方面:连接超时和读/写超时。对于连接超时,我们可以利用`setsockopt()`...

    socket阻塞与非阻塞的区别

    在使用socket进行编程时,会遇到两种基本的操作模式:阻塞模式与非阻塞模式。这两种模式对于程序的性能和响应性有着重要的影响。 #### 二、阻塞模式 当一个socket处于阻塞模式时,所有的I/O操作都会阻塞当前线程,...

    非阻塞recvfrom的设置

    需要注意的是,如果我们使用WSAAsynSelect函数来设置套接口为非阻塞模式,那么我们不能再使用ioctlsocket函数来将其设置为阻塞模式。否则,我们将会收到WSAEINVAL错误。 在套接口编程中,阻塞和非阻塞是两个重要的...

    无阻塞Socket服务端、客户端示例

    一旦连接成功,客户端也可以设置Socket为非阻塞模式,使用send()发送数据,recv()接收数据,同样需要处理可能的无数据可读或无法写入的情况。 `SocketNB.sln`是Visual Studio的解决方案文件,包含了项目配置信息;`...

    feizuse.rar_C socket 非阻塞_网络服务_非阻塞_非阻塞 socket

    4. 设置非阻塞模式:在Windows下,可以通过`ioctlsocket()`函数配合`FIONBIO`标志来设置`socket`为非阻塞模式。 5. 异步事件处理:`WSAAsyncSelect()`或`WSAEventSelect()`函数的使用,以及如何根据接收到的事件进行...

    python多线程非阻塞socket

    在这个例子中,服务端使用了多线程来接受客户端的连接请求,并且采用了非阻塞模式的Socket接收数据。当有数据到来时,创建一个新的子进程来处理数据,从而提高并发性能。 客户端通常负责发送数据到服务器,可以使用...

Global site tag (gtag.js) - Google Analytics