① java nio如何設置tcp報文緊急推送
在java中可以基於java.nio.channels中的Channel和Selector的相關類來實現TCP/IP+NIO方式的系統間通信。
用於系統間通信依靠SocketChannel和ServerSocketChannel,SocketChannel用於建立連接,監聽事件及操作讀寫,ServerSocketChannel用於監聽埠及監聽連接事件,可通過Selector來獲取是否有要處理的事件。
服務端
// 設置一個處理客戶端消息和各種消息事件的類(Handler)bootstrap.setPipelineFactory(newChannelPipelineFactory() { @Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline( newObjectDecoder(ClassResolvers.cacheDisabled(this .getClass().getClassLoader())), newObjectServerHandler()); }});
客戶端
// 設置一個處理服務端消息和各種消息事件的類(Handler)
bootstrap.setPipelineFactory(newChannelPipelineFactory() { @Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline(newObjectEncoder(), newObjectClientHandler()); }});
要傳遞對象,自然要有一個被傳遞模型,一個簡單的Pojo,當然,實現序列化介面是必須的。
/** * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class Command implementsSerializable { = 7590999461767050471L; privateString actionName; publicString getActionName() { returnactionName; } publicvoidsetActionName(String actionName) { this.actionName = actionName; }}
服務端和客戶端里,我們自定義的Handler實現如下:
ObjectServerHandler .java
/** * 對象傳遞服務端代碼 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectServerHandler extendsSimpleChannelHandler { /** * 當接受到消息的時候觸發 */ @Override publicvoidmessageReceived(ChannelHandlerContext ctx, MessageEvent e) throwsException { Command command = (Command) e.getMessage(); // 列印看看是不是我們剛才傳過來的那個 System.out.println(command.getActionName()); }}
ObjectClientHandler .java
/** * 對象傳遞,客戶端代碼 * * @author lihzh * @alia OneCoder * @bloghttp://www.coderli.com */public class ObjectClientHandler extendsSimpleChannelHandler { /** * 當綁定到服務端的時候觸發,給服務端發消息。 * * @author lihzh * @alia OneCoder */ @Override publicvoidchannelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) { // 向服務端發送Object信息 sendObject(e.getChannel()); } /** * 發送Object * * @param channel * @author lihzh * @alia OneCoder */ privatevoidsendObject(Channel channel) { Command command =newCommand(); command.setActionName("Hello action."); channel.write(command); } }
啟動後,服務端正常列印結果:Hello action.
簡單梳理一下思路:
通過Netty傳遞,都需要基於流,以ChannelBuffer的形式傳遞。所以,Object -> ChannelBuffer.
Netty提供了轉換工具,需要我們配置到Handler。
樣例從客戶端 -> 服務端,單向發消息,所以在客戶端配置了編碼,服務端解碼。如果雙向收發,則需要全部配置Encoder和Decoder。
這里需要注意,注冊到Server的Handler是有順序的,如果你顛倒一下注冊順序:
bootstrap.setPipelineFactory(newChannelPipelineFactory() {
@Override publicChannelPipeline getPipeline()throwsException { returnChannels.pipeline(newObjectServerHandler(), newObjectDecoder(ClassResolvers.cacheDisabled(this .getClass().getClassLoader())) ); }});
結果就是,會先進入我們自己的業務,再進行解碼。這自然是不行的,會強轉失敗。至此,你應該會用Netty傳遞對象了吧。
③ java基礎入門教程都有哪些
網上教程挺多的,剛剛看了一個九天的Java學習入門教程,通過《學生管理系統》案例整合基礎知識,鞏固加深知識理解。
學習內容:
第一階段:Java基礎語法
Java背景與環境搭建;常量、變數、數據類型;運算符;分支語句;循環語句;數組;方法;二維數組
第二階段:面向對象基礎
面向對象思想理解;類和對象的關系;對象的使用;對象內存圖;this關鍵字;封裝;構造方法;JavaBean類的編寫
第三階段:常用API
API手冊的使用;String類的特點;不同方式創建String對象的區別;字元串常見面試題;字元串常用方法;StringBuilder類的使用;StringBuilder常用方法;String和StringBuilder的區別對比
第四階段:集合框架
集合和數組的對比;ArrayList集合對象的使用;ArrayList集合對象常用方法;ArrayList集合遍歷,與封裝數據到集合;綜合案例 - 學生管理系統
網頁鏈接 912t
④ 自學Java怎麼入門
自學Java看這一篇就夠啦!Java學習路線圖分享給你,跟著學習吧!
一、Java基礎
⑤ 介紹一下Java NIO,NIO讀取文件都有哪些方法
NIO也就是New I/O,是一組擴展Java IO操作的API集, 於Java 1.4起被引入,Java 7中NIO又提供了一些新的文件系統API,叫.
NIO2提供兩種主要的文件讀取方法:
使用buffer和channel類
使用Path 和 File 類
NIO讀取文件有以下三種方式:
1. 舊的NIO方式,使用BufferedReader
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class WithoutNIOExample
{
public static void main(String[] args)
{
BufferedReader br = null;
String sCurrentLine = null;
try
{
br = new BufferedReader(
new FileReader("test.txt"));
while ((sCurrentLine = br.readLine()) != null)
{
System.out.println(sCurrentLine);
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if (br != null)
br.close();
} catch (IOException ex)
{
ex.printStackTrace();
}
}
}
}
2. 使用buffer讀取小文件
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class ReadFileWithFileSizeBuffer
{
public static void main(String args[])
{
try
{
RandomAccessFile aFile = new RandomAccessFile(
"test.txt","r");
FileChannel inChannel = aFile.getChannel();
long fileSize = inChannel.size();
ByteBuffer buffer = ByteBuffer.allocate((int) fileSize);
inChannel.read(buffer);
buffer.rewind();
buffer.flip();
for (int i = 0; i < fileSize; i++)
{
System.out.print((char) buffer.get());
}
inChannel.close();
aFile.close();
}
catch (IOException exc)
{
System.out.println(exc);
System.exit(1);
}
}
}
3. 分塊讀取大文件
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class ReadFileWithFixedSizeBuffer
{
public static void main(String[] args) throws IOException
{
RandomAccessFile aFile = new RandomAccessFile
("test.txt", "r");
FileChannel inChannel = aFile.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
while(inChannel.read(buffer) > 0)
{
buffer.flip();
for (int i = 0; i < buffer.limit(); i++)
{
System.out.print((char) buffer.get());
}
buffer.clear(); // do something with the data and clear/compact it.
}
inChannel.close();
aFile.close();
}
}
4. 使用MappedByteBuffer讀取文件
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class ReadFileWithMappedByteBuffer
{
public static void main(String[] args) throws IOException
{
RandomAccessFile aFile = new RandomAccessFile
("test.txt", "r");
FileChannel inChannel = aFile.getChannel();
MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, inChannel.size());
buffer.load();?
for (int i = 0; i < buffer.limit(); i++)
{
System.out.print((char) buffer.get());
}
buffer.clear(); // do something with the data and clear/compact it.
inChannel.close();
aFile.close();
}
}
⑥ 如何學習Java的NIO
Java NIO 是一種非阻塞式I/O。
要理解 NIO,要先理解 非阻塞式I/O。
非阻塞式I/O 只是專眾多 IO 模型中的一種。
要透切理解 非阻塞式I/O,就屬要理解眾多 IO 模型的歷史和優劣。
要理解為什麼會出現 這么多 IO 模型。
就要理解 計算機的 IO 系統和 操作系統如何處理 IO的。
⑦ java學習零基礎
對於初學者來說,只要在學習過程中,掌握科學的學習方法,即使零基礎的入行者也能充分掌握Java開發技術,那究竟如何才能學習Java呢?
第一階段:企業入門級項目階段,可掌握Java核心基礎、面向對象、JavaSE API、MySQL資料庫、JDBS、HTML+CSS、Servlet、JSP、JavaScript等,可以完成常見中小型互聯網項目開發,達到初級Java開發工程師能力。
第二階段企業框架級項目階段是進階階段,增強Java基礎、web基礎、CSS/JavaScript進階、Maven項目管理、Spring5、SpringMVC、Mybatis、SMM綜合項目、學員項目等,完成本階段學員可以勝任各行業企業級項目中高級工程師崗位。
第三階段億級大並發分布式項目階段,掌握Linux、Docker、Vue、SpringBoot、項目整合Vue、分布式項目、Zookeepr、Dubbo、Springcloud、Redis、Elasticsearch、Quartz、RocketMQ、FastDFS、Mycat、CAS、分布式鎖、分布式事務、微信開發、學生項目等,學員學完後可以勝任大型、超大型互聯網項目開發高級工程師崗位。
初學Java雖然有一定的難度,但Java學習並不是不可逾越,只要你明確方向,找到有效的學習方法,堅持學習,一定能攻克Java難關,成為一名合格的Java開發工程師。如果你是零基礎自學,那麼所花費的時間與精力是不可估計的。 如果系統學習5個月的時間可以幫助你快速成長。
⑧ JAVA NIO 怎麼捕獲Socket關閉事件
AVA NIO 如何捕獲Socket關閉事件
服務端代碼:
Java codeimport java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ClosedChannelException;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
public class TCP {
ServerSocketChannel socketChannel;
Selector selector;
int port = 8778;
String[] opsName=new String[17];
ByteBuffer buffer;
int count = 0;
public TCP(){
opsName[SelectionKey.OP_ACCEPT]="OP_ACCEPT";
opsName[SelectionKey.OP_CONNECT]="OP_CONNECT";
opsName[SelectionKey.OP_READ]="OP_READ";
opsName[SelectionKey.OP_WRITE]="OP_WRITE";
buffer =ByteBuffer.allocate(10);
try {
socketChannel=ServerSocketChannel.open();
socketChannel.configureBlocking(false);
socketChannel.socket().setReuseAddress(true);
socketChannel.socket().bind(new InetSocketAddress(port));
selector=Selector.open();
System.out.println(socketChannel.hashCode());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void start(){
try {
socketChannel.register(selector, SelectionKey.OP_ACCEPT);
} catch (ClosedChannelException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("server start port "+port);
while(true){
int n;
try {
System.out.print("wait...");
n = selector.select(60000);
System.out.println(n);
if(n<=0)continue;
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while(it.hasNext()){
SelectionKey key = it.next();
it.remove();
System.out.println("key:"+opsName[key.interestOps()]+","+key.channel().hashCode());
if(key.isReadable()){
System.out.println(key.hashCode()+" isReadable");
socketChannel.accept().register(selector, SelectionKey.OP_READ);
}
else if(key.isAcceptable()){
System.out.println(key.hashCode()+" accepted");
SocketChannel client =socketChannel.accept();
client.configureBlocking(false);
//client.register(selector, SelectionKey.OP_WRITE);
//SocketChannel client =(SocketChannel) key.channel();
buffer.clear();
buffer.putInt(count++);
buffer.flip();
client.write(buffer);
System.out.println(client.hashCode()+" write..");
}
else if(key.isWritable()){
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TCP tcp = new TCP();
tcp.start();
}
}