java socket cs_Java socket入门

本文介绍了如何使用Netty实现简单的Socket服务器,包括Block-SocketServer的示例,以及NIO和多线程SocketServer的扩展,最后展示了使用NIO技术构建高性能服务器的过程。
摘要由CSDN通过智能技术生成

Netty In Action中Java Network的介绍代码

一个简单Block-Socket Server

public class SimpleSocketServer {

static String processRequest(String request){

return request;

}

public static void main(String[] args) throws IOException {

ServerSocket socket = new ServerSocket(9900);

Socket cs = socket.accept();

BufferedReader br = new BufferedReader(new InputStreamReader(cs.getInputStream()));

PrintWriter pw = new PrintWriter(cs.getOutputStream(),true);

String request, response;

while((request = br.readLine())!=null){

if("Done".equals(request)){

break;

}

response = processRequest(request);

pw.println(response);

}

}

}

使用telnet测试

➜ ~ telnet localhost 9900

Trying ::1...

Connected to localhost.

Escape character is '^]'.

hello

hello

Done

PlainSocketServer with multi-thread

public void serve(int port) throws IOException {

final ServerSocket socket = new ServerSocket(port);

try {

for(;;){

final Socket clientSocket = socket.accept();

System.out.println("Accepted connection from " + clientSocket);

new Thread(new Runnable() {

@Override

public void run() {

OutputStream out;

try{

out = clientSocket.getOutputStream();

out.write("Hi!\r\n".getBytes(Charset.forName("UTF-8")));

out.flush();

clientSocket.close();

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

clientSocket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}).start();

}

} finally {

}

}

来个NIO的socket服务

public void serve(int port) throws IOException {

ServerSocketChannel serverChannel = ServerSocketChannel.open();

serverChannel.configureBlocking(false);

ServerSocket ssocket = serverChannel.socket();

InetSocketAddress address = new InetSocketAddress(port);

ssocket.bind(address);

Selector selector = Selector.open();

serverChannel.register(selector, SelectionKey.OP_ACCEPT);

final ByteBuffer msg = ByteBuffer.wrap("Hi!\r\n".getBytes());

for(;;){

try {

selector.select();

} catch (IOException ex) {

ex.printStackTrace();

// handle exception

break;

}

Set readyKeys = selector.selectedKeys();

Iterator iterator = readyKeys.iterator();

while (iterator.hasNext()) {

SelectionKey key = iterator.next();

iterator.remove();

try {

if (key.isAcceptable()) {

ServerSocketChannel server = (ServerSocketChannel)key.channel();

SocketChannel client = server.accept();

client.configureBlocking(false);

client.register(selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ, msg.duplicate());

System.out.println( "Accepted connection from " + client);

}

if(key.isWritable()){

SocketChannel client = (SocketChannel)key.channel();

ByteBuffer buffer =(ByteBuffer)key.attachment();

while(buffer.hasRemaining()){

if(client.write(buffer) == 0){

break;

}

}

client.close();

}

}catch (Exception e){

key.cancel();

try {

key.channel().close();

}catch (Exception cex){}

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值