導航:首頁 > 編程語言 > javaudpnio包回包

javaudpnio包回包

發布時間:2021-02-26 22:19:31

❶ 請教怎樣發送socket請求包,並獲得返回數據

java">這種東西,Google下大把吧,正好前陣子有一個TCP通訊的,借你參考下好了:

ServerSide

packagenio;

importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.net.InetSocketAddress;
importjava.net.ServerSocket;
importjava.nio.ByteBuffer;
importjava.nio.channels.SelectionKey;
importjava.nio.channels.Selector;
importjava.nio.channels.ServerSocketChannel;
importjava.nio.channels.SocketChannel;
importjava.text.DateFormat;
importjava.text.SimpleDateFormat;
importjava.util.Date;

publicclassEchoServer{

privatestaticintSOCKET_NUM=55555;

=newSimpleDateFormat("yyyyMMddHH:mm:ss");

/**
*@
*/
publicstaticvoidmain(String[]args){
newEchoServer().start();
}

publicvoidstart(){
try{
Selectorselector=bindServer();//綁定服務埠,並定義一個事件選擇器對象記錄套接字通道的事件

/*通過此循環來遍例事件*/
while(true){
log("Waitingevents.");
intn=selector.select();//查詢事件如果一個事件都沒有,這里就會阻塞
log("Gotevents:"+n);

ByteBufferechoBuffer=ByteBuffer.allocate(50);//定義一個byte緩沖區來存儲收發的數據

/*循環遍例所有產生的事件*/
for(SelectionKeykey:selector.selectedKeys()){
SocketChannelsc;
selector.selectedKeys().remove(key);//將本此事件從迭帶器中刪除

/*如果產生的事件為接受客戶端連接(當有客戶端連接伺服器的時候產生)*/
if((key.readyOps()&SelectionKey.OP_ACCEPT)==SelectionKey.OP_ACCEPT){

ServerSocketChannelsubssc=(ServerSocketChannel)key.channel();//定義一個伺服器socket通道

sc=subssc.accept();//將臨時socket對象實例化為接收到的客戶端的socket

sc.configureBlocking(false);//將客戶端的socket設置為非同步

sc.register(selector,SelectionKey.OP_READ);//將客戶端的socket的讀取事件注冊到事件選擇器中

System.out.println("Gotnewclient:"+sc);
}
/*如果產生的事件為讀取數據(當已連接的客戶端向伺服器發送數據的時候產生)*/
elseif((key.readyOps()&SelectionKey.OP_READ)==SelectionKey.OP_READ){

sc=(SocketChannel)key.channel();//臨時socket對象實例化為產生本事件的socket

ByteArrayOutputStreambos=newByteArrayOutputStream();//定義一個用於存儲byte數據的流對象,存儲全部信息

echoBuffer.clear();//先將客戶端的數據清空

try{
//循環讀取所有客戶端數據到byte緩沖區中,當有數據的時候read函數返回數據長度
//NIO會自動的將緩沖區一次容納不下的自動分段
intreadInt=0;//為讀取到數據的長度
while((readInt=sc.read(echoBuffer))>0){
//如果獲得數據長度比緩沖區大小小的話
if(readInt<echoBuffer.capacity()){

byte[]readByte=newbyte[readInt];//建立一個臨時byte數組,將齊長度設為獲取的數據的長度
//循環向此臨時數組中添加數據
for(inti=0;i<readInt;i++){
readByte[i]=echoBuffer.get(i);
}

bos.write(readByte);//將此數據存入byte流中
}
//否則就是獲得數據長度等於緩沖區大小
else{
bos.write(echoBuffer.array());//將讀取到的數據寫入到byte流對象中
}
}
//當循環結束時byte流中已經存儲了客戶端發送的所有byte數據
log("Recivemsg:"+newString(bos.toByteArray()));
}catch(Exceptione){

e.printStackTrace();//當客戶端在讀取數據操作執行之前斷開連接會產生異常信息

key.cancel();//將本socket的事件在選擇器中刪除
break;
}

writeBack(sc,bos.toByteArray());//向客戶端寫入收到的數據
}
}
}
}catch(Exceptione){
e.printStackTrace();
}
}

/**
*綁定服務埠,初始化整個服務
*@throwsIOException
*/
privateSelectorbindServer()throwsIOException{
log("Startbindingserversocket:"+SOCKET_NUM);

Selectorselector=Selector.open();//定義一個事件選擇器對象記錄套接字通道的事件

ServerSocketChannelssc=ServerSocketChannel.open();//定義一個非同步伺服器socket對象

ssc.configureBlocking(false);//將此socket對象設置為非同步

ServerSocketss=ssc.socket();//定義伺服器socket對象-用來指定非同步socket的監聽埠等信息

InetSocketAddressaddress=newInetSocketAddress(SOCKET_NUM);//定義存放監聽埠的對象

ss.bind(address);//將伺服器與這個埠綁定

ssc.register(selector,SelectionKey.OP_ACCEPT);//將非同步的伺服器socket對象的接受客戶端連接事件注冊到selector對象內

log("Bindedsocketat:"+SOCKET_NUM);

returnselector;
}

privatebooleanwriteBack(SocketChannelsc,byte[]b){
ByteBufferechoBuffer=ByteBuffer.allocate(b.length);//建立這個byte對象的ByteBuffer
echoBuffer.put(b);//將數據存入

echoBuffer.flip();//將緩沖區復位以便於進行其他讀寫操作
try{
//向客戶端寫入數據,數據為接受到數據
sc.write(echoBuffer);
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
System.out.println("Msgechoback:"+newString(echoBuffer.array()));
returntrue;
}

privatestaticvoidlog(Objectmsg){
System.out.println("SERVER["+dateFormatter.format(newDate())+"]:"+msg);
}
}

❷ JAVA socket UDP包的發送問題

要用線程實現了,你定義兩個thread,來發送兩個UDP包了。

❸ sun.nio包是什麼,是java代碼

Oracle/Sun JDK下的src.zip只帶有 java.* / javax.* 的公有API的源碼,sun.nio屬於Oracle/Sun JDK的私有API,所以沒有包含在內src.zip里。
所謂公有/私有API,此處最大的區別不在於容是否開放源碼,而在於是否屬於Java平台規范的一部分。
Java標准庫的公有API屬於規范的一部分,所有符合規范的JDK/JRE實現都必須提供完全一樣的Java標准庫公有API(只要API兼容即可,不要求內部實現完全一樣)。而私有部分可以每個JDK/JRE自行決定API。

從OpenJDK 7開始,Oracle JDK跟OpenJDK的Java庫的大部分源碼都是完全一致的。有需要的話請去OpenJDK看源碼

❹ 怎麼實現UDP數據包的拆包組包發送與接收

如果你個人計算機用戶,接受的數據包應該比發送的數據包大幾十倍才正常(根據用戶使版用計算機時間長權短決定)。因為大家平時瀏覽網頁、下載軟體等都不需要發送多少數據,而主要是接受。如果普通計算機用戶發送數據包多於收到的那就要提起警惕了。

❺ JAVA用udp從本地網路穿透到公網之後,從其他網路作為客戶端發送udp包到伺服器正常接收。

你說的還不清楚。Java網路編程使用Socket,同為一個網路下的主機時是肯定沒問題的,不論同一區域網或專廣屬域網。如果內網跨越網關,我沒做過試驗,按我的理解,內網主機做客戶端,獨立主機做伺服器應該可行,反之不行。

❻ java 中常用五大包有哪些

常用的五個
java.lang.*
提供利用 Java 編程語言進行程序設計的基礎類。最重要的類是 Object(它是類層次結構的根)和 Class(它的實例表示正在運行的應用程序中的類)。
java.util.*
包含集合框架、遺留的 collection 類、事件模型、日期和時間設施、國際化和各種實用工具類(字元串標記生成器、隨機數生成器和位數組、日期Date類、堆棧Stack類、向量Vector類等)。集合類、時間處理模式、日期時間工具等各類常用工具包
java.io.*
Java的核心庫java.io提供了全面的IO介面。包括:文件讀寫、標准設備輸出等。Java中IO是以流為基礎進行輸入輸出的,所有數據被串列化寫入輸出流,或者從輸入流讀入。
java.net.*
並非所有系統都支持 IPv6 協議,而當 Java 網路連接堆棧嘗試檢測它並在可用時透明地使用它時,還可以利用系統屬性禁用它。在 IPv6 不可用或被顯式禁用的情況下,Inet6Address 對大多數網路連接操作都不再是有效參數。雖然可以保證在查找主機名時 java.net.InetAddress.getByName 之類的方法不返回 Inet6Address,但仍然可能通過傳遞字面值來創建此類對象。在此情況下,大多數方法在使用 Inet6Address 調用時都將拋出異常。
java.sql.*
提供使用 JavaTM 編程語言訪問並處理存儲在數據源(通常是一個關系資料庫)中的數據的 API。此 API 包括一個框架,憑藉此框架可以動態地安裝不同驅動程序來訪問不同數據源。

❼ javabeans包,security包,rmi包,nio包,還有javax中的一些我沒有學到的包它們有什麼功能呀

這么多用一本書都說不完啊!
你到網上搜索JDK中文文檔下載下來,
裡面有用法和例子!我有可是我們學校按流量收費
所以不能給你傳過去!呵呵

❽ JAVA中如何完成UDP包的封裝

給你一段代碼,或許可以幫到你……

public class SendSideTest {
/*發送數據 */
public static void main(String[] args) throws IOException {
//1 DatagramSocket是用來接收發送數據的
DatagramSocket ds = new DatagramSocket();
//2 發送什麼
byte[] s="helloabcdef".getBytes();
//3 發送到哪,發送到本機
InetAddress clientAddress=InetAddress.getLocalHost();
//4 搭建一個outDataPacket相當於一個郵包
//把發送的內容,發送的地址,發送的埠,寫在郵包上
DatagramPacket op = null;
op=new DatagramPacket(s, s.length,clientAddress, 9999);
//5 通過一個DatagramPacket將數據發送到客戶端,
//客戶端的地址由DatagramPacket指定,即寫在郵包上
ds.send(op);
System.out.println("數據已經成功發送");
}
}

public class ReceiveSideTest {
/* 接收方*/
public static void main(String[] args) throws IOException {
//1 DatagramSocket相當於建立一個伺服器 在9999監聽
DatagramSocket ds = new DatagramSocket(9999);
//2 DatagramPacket是用來接收發送的數據的 要有容器接收
byte[] msg = new byte[100];
DatagramPacket ip = new DatagramPacket(msg, msg.length);
//3調用receive方法接收數據到DatagramPacket 中
//數據又由DatagramPacket放入msg
ds.receive(ip);
String msgs = new String(msg);
System.out.println(msgs);
//4通過DatagramPacket得到地址和埠 把發送者列印出來
InetAddress clientAddress = ip.getAddress();
int clientPort = ip.getPort();
System.out.println("發送者:"+clientAddress);
System.out.println("發送埠:"+clientPort);
}
}

閱讀全文

與javaudpnio包回包相關的資料

熱點內容
換新erp系統舊數據怎麼錄 瀏覽:33
電腦文件屬性打不開 瀏覽:64
word文件信息兼容模式 瀏覽:656
iphonewarranty 瀏覽:742
婁底營銷網路推廣途徑有哪些 瀏覽:86
mongodb數據文件丟失 瀏覽:940
iphone4使用大全 瀏覽:330
美萍軟體資料庫在哪個文件夾 瀏覽:668
51虛擬機的數據文件路徑 瀏覽:931
java如何鎖定sql表 瀏覽:272
全民飛機大戰黃金升級費用 瀏覽:302
臨床科室文件管理你知道多少 瀏覽:814
js訪問excel模板文件 瀏覽:766
智能互動編程是什麼 瀏覽:320
大學生編程學什麼語言 瀏覽:101
自考編程專業是什麼 瀏覽:804
大數據熱工 瀏覽:384
jstable行 瀏覽:421
js獲取標簽內容 瀏覽:519
潘多拉文件是什麼意思 瀏覽:636

友情鏈接