-
-
Save ChenSino/85f429733200b7c2babddbf008855087 to your computer and use it in GitHub Desktop.
io实现非阻塞io模型-残缺版
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.OutputStream; | |
import java.net.ServerSocket; | |
import java.net.Socket; | |
import java.net.SocketTimeoutException; | |
import org.apache.commons.logging.Log; | |
import org.apache.commons.logging.LogFactory; | |
import org.apache.log4j.BasicConfigurator; | |
/** | |
* IO非阻塞模型,本演示依然存在问题,需要升级,参考 | |
* @see SocketServer3 | |
*/ | |
public class SocketServer2 { | |
static { | |
BasicConfigurator.configure(); | |
} | |
private static Object xWait = new Object(); | |
/** | |
* 日志 | |
*/ | |
private static final Log LOGGER = LogFactory.getLog(SocketServer2.class); | |
public static void main(String[] args) throws IOException { | |
ServerSocket serverSocket = null; | |
try { | |
serverSocket = new ServerSocket(8888); | |
serverSocket.setSoTimeout(2000); | |
while(true) { | |
Socket socket = null; | |
try { | |
socket = serverSocket.accept(); | |
} catch(SocketTimeoutException e1) { | |
//=========================================================== | |
// 执行到这里,说明本次accept没有接收到任何数据报文 | |
// 主线程在这里就可以做一些事情,记为X | |
//=========================================================== | |
synchronized (SocketServer2.xWait) { | |
SocketServer2.LOGGER.info("这次没有从底层接收到任务数据报文,等待1秒,模拟事件X的处理时间"); | |
SocketServer2.xWait.wait(1000); | |
} | |
continue; | |
} | |
InputStream in = socket.getInputStream(); | |
OutputStream out = socket.getOutputStream(); | |
Integer sourcePort = socket.getPort(); | |
int maxLen = 4; | |
byte[] contextBytes = new byte[maxLen]; | |
int realLen; | |
StringBuffer message = new StringBuffer(); | |
//下面我们收取信息(这里还是阻塞式的,一直等待,直到有数据可以接受) | |
while((realLen = in.read(contextBytes, 0, maxLen)) != -1) { | |
message.append(new String(contextBytes , 0 , realLen)); | |
/* | |
* 我们假设读取到“over”关键字, | |
* 表示客户端的所有信息在经过若干次传送后,完成 | |
* */ | |
if(message.indexOf("over") != -1) { | |
break; | |
} | |
} | |
//下面打印信息 | |
SocketServer2.LOGGER.info("服务器收到来自于端口:" + sourcePort + "的信息:" + message); | |
//下面开始发送信息 | |
out.write("回发响应信息!".getBytes()); | |
//关闭 | |
out.close(); | |
in.close(); | |
socket.close(); | |
} | |
} catch(Exception e) { | |
SocketServer2.LOGGER.error(e.getMessage(), e); | |
} finally { | |
if(serverSocket != null) { | |
serverSocket.close(); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment