????Java?е?Socket????????Socket??NioSocket??
???????Socket???÷?
????Java?е????????????Socket?????Socket???ServerSocket??Socket??????ServerSocket???????????????????accept???????????????????????Socket??Socket??????????????????????????????Socket?????????????????ServerSocket????????????????
????· ????ServerSocket??ServerSocket?????????5???????з??????ServerSocket(int port)?????????port???????
????· ?????????????ServerSocket??accept???????м?????accept????????????????????????accept??????????????????????????????????????????????????У?????????????accept???????????Socket??
????· ???accept?????????Socket????????????
???????′???????????????????ServerSocket????????accept????????Client???????????????????Socket??
public class Server {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//???????ServerSocket????8080???
ServerSocket server = new ServerSocket(8080);
//???????
Socket socket = server.accept();
//????????????Socket????????????BufferedReader??????????
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line = is.readLine();
System.out.println("received frome client:" + line);
//????PrintWriter?????????????
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.println("this data is from server");
pw.flush();
//??????
pw.close();
is.close();
socket.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
??????????????????????Socket????Socket???????????????????????Socket??Socket?????????????????????Socket(String host?? int port)???????????????????????????????????з???????Client???????????????????????????IP?????192.168.6.42???????????????????????ServerSocket??Client?????????£????Client?е?IP?????????????127.0.0.1??Socket?????????????????????????????????Socket???????Writer??Reader????????????????????????????????????
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
String msg = "Client data";
try {
//???????Socket????????????8080???????
Socket socket = new Socket("192.168.6.42"??8080);
//???PrintWriter??BufferedReader???ж?д????
PrintWriter pw = new PrintWriter(socket.getOutputStream());
BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//????????
pw.println(msg);
pw.flush();
//????????
String line = is.readLine();
System.out.println("received from server" + line);
//??????
pw.close();
is.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
???????????Server??????Client??????????Client??Server??????
????NioSocket???÷?
??????JDK1.4?????Java???????μ?IO??-nio??new IO????nio??????????μ?????????????????IO??Ч???????????Socket???IO??????nio?????????????ServerSocketChannel??SocketChannel???????????????ServerSocket??Server??
?????????NioSocket???????????Buffer??Channel??Selector???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????Socket?????????????????ServerSocket???д?????????????????????????????Ч?????????????????????????????????????????????????????????????????У???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????λ????????????????????????????????????????????????????????????????????????????????????????NioSocket??Buffer?????д???????????????е????????????Channel??????????????????????е???????????????????????????????????????????Selector????????????????
????ServerSocketChannel??????????????????????open?????????ServerSocketChannel??????ServerSocket???????????socket()????????????????????ServerSocket????????????????????ServerSocket??????????????ServerSocket???????????NioSocket??ServerSocketChannel???????configureBlocking?????????????????????????????????????????????????register???????Selector????????
????Selector????????侲?????????open???????????????Channel??register???????ServerSocketChannel????SocketChannel??????????Selector???????select?????????????select?????????long???????????????????????????????????????????????????????????????????????????????????0??????????????0????????????????????select????????????????????????????????????????????????Selector????selectdKeys????????SelectionKey?????
????SelectionKey????????????????Channel??Selector??????????????????????Channel?????Selector????????register?????????????????????????????????????????????????д?????????????register???????????????Selector??????????????????????
????????????????????????????????????????????NioSocket??????????
????????ServerSocketChannel?????????????????????????
????????Selector?????ServerSocketChannel??
????????Selector??selector???????????
????Selector?????????????selectdKeys????SelectionKey????
???????SelectionKey?????channel??selector?????????????о????????
public class NIOServer {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//????ServerSocketChannel??????8080???
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(8080));
//?????????????
ssc.configureBlocking(false);
//?ssc????????
Selector selector = Selector.open();
ssc.register(selector?? SelectionKey.OP_ACCEPT);
//??????????
Handler handler = new Handler(1024);
while(true){
//?????????ε??????3s??????3s???????????????У????????0????????????????????
if(selector.select(3000) == 0){
System.out.println("????????----");
continue;
}
System.out.println("????????----");
//????????SelectionKey
Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
while(keyIter.hasNext()){
SelectionKey key = keyIter.next();
try{
//??????????????
if(key.isAcceptable()){
handler.handleAccept(key);
}
//??????
if(key.isReadable()){
handler.handleRead(key);
}
}catch(IOException ex){
keyIter.remove();
continue;
}
//???????????????SelectionKey????????????????????key
keyIter.remove();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static class Handler{
private int bufferSize = 1024;
private String localCharset = "UTF-8";
public Handler(int bufferSize){
this.bufferSize = bufferSize;
}
public void handleAccept(SelectionKey key) throws IOException{
SocketChannel sc = ((ServerSocketChannel) key.channel()).accept();
sc.configureBlocking(false);
sc.register(key.selector()?? SelectionKey.OP_READ?? ByteBuffer.allocate(bufferSize));
}
public void handleRead(SelectionKey key) throws IOException{
//???Channel
SocketChannel sc = (SocketChannel) key.channel();
//???buffer??????
ByteBuffer buffer = (ByteBuffer)key.attachment();
buffer.clear();
//??ж???????????
if(sc.read(buffer) == -1)
sc.close();
else{
//??buffer????????
buffer.flip();
//??buffer?н?????????localCharset?????????浽receivedString
String receivedString = Charset.forName(localCharset).newDecoder().decode(buffer).toString();
System.out.println("received from client:" + receivedString);
//??????????????
String sendString = "this data is from Server";
buffer = ByteBuffer.wrap(sendString.getBytes(localCharset));
sc.write(buffer);
sc.close();
}
}
}
}
????????????????Socket?????Socket socket = new Socket("192.168.6.42"??8080);?????????????????????????з????????handleAccept()????????ServerSocketChannel???selector??????SelectionKey.OP_READ?????????selector?????????????????PrintWrite???????????????????????????????????handleRead??????????????????д??????????????????????????????BufferedReader??????????????????