자바 NIO 예시:다 중 인터넷 채 팅 방
29445 단어 java NIO
다음은 효 과 를 보 여 드 리 겠 습 니 다.코드 는 부록 을 보십시오!
서버 를 시작 하여 포트 를 감청 합 니 다.
서버 콘 솔
Server is listening now...
클 라 이언 트 시작,서버 연결
서버 콘 솔
Server is listening now...
Server is listening from client :/127.0.0.1:50206
클 라 이언 트 콘 솔
Please input your name.
클 라 이언 트 닉네임 입력
서버 콘 솔
Server is listening now...
Server is listening from client :/127.0.0.1:50206
Server is listening from client /127.0.0.1:50206 data rev is: byr1#@#
클 라 이언 트 콘 솔
Please input your name.
byr1
welcome byr1 to chat room! Online numbers:1
다른 클 라 이언 트 를 시작 하고 닉네임 을 입력 하 십시오.
서버 콘 솔
Server is listening now...
Server is listening from client :/127.0.0.1:50206
Server is listening from client /127.0.0.1:50206 data rev is: byr1#@#
Server is listening from client :/127.0.0.1:50261
Server is listening from client /127.0.0.1:50261 data rev is: byr2#@#
클 라 이언 트 byr 1 콘 솔
Please input your name.
byr1
welcome byr1 to chat room! Online numbers:1
welcome byr2 to chat room! Online numbers:2
클 라 이언 트 byr 2 console
Please input your name.
byr2
welcome byr2 to chat room! Online numbers:2
클 라 이언 트 byr 1 에서 메 시 지 를 보 내 고 클 라 이언 트 byr 2 에서 메 시 지 를 보 냅 니 다.
서버 콘 솔
Server is listening now...
Server is listening from client :/127.0.0.1:50206
Server is listening from client /127.0.0.1:50206 data rev is: byr1#@#
Server is listening from client :/127.0.0.1:50261
Server is listening from client /127.0.0.1:50261 data rev is: byr2#@#
Server is listening from client /127.0.0.1:50206 data rev is: byr1#@#hello byr2, a nice day, isn't it?
Server is listening from client /127.0.0.1:50261 data rev is: byr2#@#fine
클 라 이언 트 byr 1 콘 솔
Please input your name.
byr1
welcome byr1 to chat room! Online numbers:1
welcome byr2 to chat room! Online numbers:2
hello byr2, a nice day, isn't it?
byr2 say fine
클 라 이언 트 byr 2 console
Please input your name.
byr2
welcome byr2 to chat room! Online numbers:2
byr1 say hello byr2, a nice day, isn't it?
fine
부록:server 와 client 코드
서버 코드
package com.huahuiyang.channel;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
*
* 1: Java NIO ,
* 2: , , , , , ,
* 3: , ,
* 4: , 。
*
* TODO
*/
public class ChatRoomServer {
private Selector selector = null;
static final int port = 9999;
private Charset charset = Charset.forName("UTF-8");
// ,
private static HashSet<String> users = new HashSet<String>();
private static String USER_EXIST = "system message: user exist, please change a name";
// ,
private static String USER_CONTENT_SPILIT = "#@#";
private static boolean flag = false;
public void init() throws IOException
{
selector = Selector.open();
ServerSocketChannel server = ServerSocketChannel.open();
server.bind(new InetSocketAddress(port));
//
server.configureBlocking(false);
// ,
server.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Server is listening now...");
while(true) {
int readyChannels = selector.select();
if(readyChannels == 0) continue;
Set selectedKeys = selector.selectedKeys(); // ,
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey sk = (SelectionKey) keyIterator.next();
keyIterator.remove();
dealWithSelectionKey(server,sk);
}
}
}
public void dealWithSelectionKey(ServerSocketChannel server,SelectionKey sk) throws IOException {
if(sk.isAcceptable())
{
SocketChannel sc = server.accept();
//
sc.configureBlocking(false);
// , , , SocketChannel, selector , , SocketChannel
sc.register(selector, SelectionKey.OP_READ);
// channel
sk.interestOps(SelectionKey.OP_ACCEPT);
System.out.println("Server is listening from client :" + sc.getRemoteAddress());
sc.write(charset.encode("Please input your name."));
}
//
if(sk.isReadable())
{
// SelectionKey Channel,
SocketChannel sc = (SocketChannel)sk.channel();
ByteBuffer buff = ByteBuffer.allocate(1024);
StringBuilder content = new StringBuilder();
try
{
while(sc.read(buff) > 0)
{
buff.flip();
content.append(charset.decode(buff));
}
System.out.println("Server is listening from client " + sc.getRemoteAddress() + " data rev is: " + content);
// channel
sk.interestOps(SelectionKey.OP_READ);
}
catch (IOException io)
{
sk.cancel();
if(sk.channel() != null)
{
sk.channel().close();
}
}
if(content.length() > 0)
{
String[] arrayContent = content.toString().split(USER_CONTENT_SPILIT);
//
if(arrayContent != null && arrayContent.length ==1) {
String name = arrayContent[0];
if(users.contains(name)) {
sc.write(charset.encode(USER_EXIST));
} else {
users.add(name);
int num = OnlineNum(selector);
String message = "welcome "+name+" to chat room! Online numbers:"+num;
BroadCast(selector, null, message);
}
}
// ,
else if(arrayContent != null && arrayContent.length >1){
String name = arrayContent[0];
String message = content.substring(name.length()+USER_CONTENT_SPILIT.length());
message = name + " say " + message;
if(users.contains(name)) {
//
BroadCast(selector, sc, message);
}
}
}
}
}
//TODO ,
public static int OnlineNum(Selector selector) {
int res = 0;
for(SelectionKey key : selector.keys())
{
Channel targetchannel = key.channel();
if(targetchannel instanceof SocketChannel)
{
res++;
}
}
return res;
}
public void BroadCast(Selector selector, SocketChannel except, String content) throws IOException {
// SocketChannel
for(SelectionKey key : selector.keys())
{
Channel targetchannel = key.channel();
// except ,
if(targetchannel instanceof SocketChannel && targetchannel!=except)
{
SocketChannel dest = (SocketChannel)targetchannel;
dest.write(charset.encode(content));
}
}
}
public static void main(String[] args) throws IOException
{
new ChatRoomServer().init();
}
}
클 라 이언 트 코드
package com.huahuiyang.channel;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class ChatRoomClient {
private Selector selector = null;
static final int port = 9999;
private Charset charset = Charset.forName("UTF-8");
private SocketChannel sc = null;
private String name = "";
private static String USER_EXIST = "system message: user exist, please change a name";
private static String USER_CONTENT_SPILIT = "#@#";
public void init() throws IOException
{
selector = Selector.open();
// IP
sc = SocketChannel.open(new InetSocketAddress("127.0.0.1",port));
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
//
new Thread(new ClientThread()).start();
//
Scanner scan = new Scanner(System.in);
while(scan.hasNextLine())
{
String line = scan.nextLine();
if("".equals(line)) continue; //
if("".equals(name)) {
name = line;
line = name+USER_CONTENT_SPILIT;
} else {
line = name+USER_CONTENT_SPILIT+line;
}
sc.write(charset.encode(line));//sc ,
}
}
private class ClientThread implements Runnable
{
public void run()
{
try
{
while(true) {
int readyChannels = selector.select();
if(readyChannels == 0) continue;
Set selectedKeys = selector.selectedKeys(); // ,
Iterator keyIterator = selectedKeys.iterator();
while(keyIterator.hasNext()) {
SelectionKey sk = (SelectionKey) keyIterator.next();
keyIterator.remove();
dealWithSelectionKey(sk);
}
}
}
catch (IOException io)
{}
}
private void dealWithSelectionKey(SelectionKey sk) throws IOException {
if(sk.isReadable())
{
// NIO Channel , sc , SocketChannel
//sc ,
SocketChannel sc = (SocketChannel)sk.channel();
ByteBuffer buff = ByteBuffer.allocate(1024);
String content = "";
while(sc.read(buff) > 0)
{
buff.flip();
content += charset.decode(buff);
}
// ,
if(USER_EXIST.equals(content)) {
name = "";
}
System.out.println(content);
sk.interestOps(SelectionKey.OP_READ);
}
}
}
public static void main(String[] args) throws IOException
{
new ChatRoomClient().init();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA NIO 입문 실례기본 개념: 참조http://zhangshixi.iteye.com/blog/679959작가 의 시 리 즈 는 NIO 가 효율 성 때문에 서버 의 최 우선 선택 이 되 어 서버 의 응답 효율 을 크게 향상 시 켰 다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.