Java IO 和 NIO 分别实现简单的Socket

 

java IO 实现的socket

public class MyServerSocket {

	public static void main(String[] args) throws Exception{
		ServerSocket ss = new ServerSocket(8888);
		Socket s = ss.accept();
		System.out.println("server=========== accepted connect from " + s.getInetAddress().getHostAddress());
		
		//read from standard input
		BufferedReader stdReader = new BufferedReader(new InputStreamReader(System.in));
		
		//write to socket
		PrintWriter socketWriter = new PrintWriter(s.getOutputStream());  
		
		//read from socket
		BufferedReader socketRreader = new BufferedReader(new InputStreamReader(s.getInputStream()));
		String line = socketRreader.readLine();

		while(!line.equals("quit")){
			System.out.println("client: " + line);
			
			socketWriter.println(stdReader.readLine());
			socketWriter.flush();
			
			line = socketRreader.readLine();
			Thread.sleep(500);
		}
		
		stdReader.close();
		socketWriter.close();
		socketRreader.close();
		s.close();
		ss.close();
	}
}


public class MySocket {
	public static void main(String[] args) throws Exception{
		Socket s = new Socket("localhost", 8888);
		System.out.println("client=========== connected with server " + s.getInetAddress().getHostAddress());
		
		//read from standard input
		BufferedReader stdReader = new BufferedReader(new InputStreamReader(System.in));
		
		//write to socket
		PrintWriter socketWriter = new PrintWriter(s.getOutputStream());  
		
		//read from socket
		BufferedReader socketRreader = new BufferedReader(new InputStreamReader(s.getInputStream()));
		
		String line = stdReader.readLine();
		while(!line.equals("quit")){
			socketWriter.println(line);
			socketWriter.flush();
			
			System.out.println("server: " + socketRreader.readLine());
			
			line = stdReader.readLine();
			Thread.sleep(500);
		}
		
		stdReader.close();
		socketWriter.close();
		socketRreader.close();
		
		s.close();
	}
	
}

 

 

 

java NIO 实现的socket

public class MyServerSocketChannel {
	
	public static void main(String[] args) throws Exception{
		Selector selector = Selector.open();
		ServerSocketChannel ssc = ServerSocketChannel.open();//(new InetSocketAddress(8888));
		ssc.bind(new InetSocketAddress(8888));
		ssc.configureBlocking(false);
		ssc.register(selector, SelectionKey.OP_ACCEPT);
		
		while(true){
			selector.select();
			Iterator<SelectionKey> it = selector.selectedKeys().iterator();
			while(it.hasNext()){
				SelectionKey key = it.next();
				if((key.readyOps() & SelectionKey.OP_ACCEPT ) == SelectionKey.OP_ACCEPT){
					ServerSocketChannel mychannel = (ServerSocketChannel)key.channel();
					SocketChannel sc = mychannel.accept();
					sc.configureBlocking(false);
					sc.register(selector, SelectionKey.OP_READ + SelectionKey.OP_WRITE);
					System.out.println( "accept from "+sc );
					
				}else{
					SocketChannel sc = (SocketChannel)key.channel();
					if((key.readyOps() & SelectionKey.OP_READ )== SelectionKey.OP_READ){
						System.out.println("received from client: " + SocketUtil.readFromSocketChannel(sc));	
					}
					
					if((key.readyOps() & SelectionKey.OP_WRITE)== SelectionKey.OP_WRITE){
						SocketUtil.writeToSocketChannel(sc, "I'm Server ");
						System.out.println("write to client: ");	
					}
				}
				it.remove();
			}
			Thread.sleep(2000);
		}
	}
}

public class MySocketChannel {
	public static void main(String[] args) throws Exception{
		if(args.length==0){
			System.out.println("please input your ID! ");
			return;
		}
		
		SocketChannel sc = SocketChannel.open();
		sc.configureBlocking(false);
		sc.connect(new InetSocketAddress("localhost",8888));
		
		while(sc.finishConnect()==false){
			System.out.println("connecting... ");	
			Thread.sleep(500);
		}
		System.out.println("connected with server!");
		
		while(true){
			System.out.println("received from server: " + SocketUtil.readFromSocketChannel(sc));	
			SocketUtil.writeToSocketChannel(sc, "I'm " + args[0]);
			System.out.println("wrote to server: ");
			Thread.sleep(2000);
		}
	}
}


public class MySocketChannel2 {
	
	public static void main(String[] args) throws Exception{
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		SocketChannel sc = SocketChannel.open(new InetSocketAddress("localhost", 8888));
		ReadableByteChannel chan = Channels.newChannel(System.in);
		while(true){
			chan.read(buffer);
			buffer.flip();
			sc.write(buffer);
			buffer.clear();
		}
	}
}

public class SocketUtil {
	public static String readFromSocketChannel(SocketChannel channel) throws Exception{
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		StringBuffer stringBuffer = new StringBuffer();
		while(true){
			buffer.clear();
			if(channel.read(buffer)<=0) break;
			stringBuffer.append(new String(buffer.array(), 0, buffer.position())); 
		}
		return stringBuffer.toString();
	}
	
	public static void writeToSocketChannel(SocketChannel channel, String str) throws Exception{
		byte[] bytes = str.getBytes();
		ByteBuffer buffer = ByteBuffer.allocate(bytes.length);
		buffer.put(bytes);
		buffer.flip();
		channel.write(buffer);
	}

}

 

 

猜你喜欢

转载自oracle-api.iteye.com/blog/2368647
今日推荐