Java socket入门
2016-08-11 本文已影响102人
小城大麦
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<SelectionKey> readyKeys = selector.selectedKeys();
Iterator<SelectionKey> 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){}
}
}
}
}