导航:首页 > 编程语言 > 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包回包相关的资料

热点内容
神州影视 1080p 下载 浏览:977
ufb数据线是什么 浏览:344
把题看漏了网络怎么说 浏览:303
小说书包网txt下载 浏览:385
韩国经典爱情推理片 浏览:551
java去哪些公司 浏览:698
数据库网络如何交互 浏览:702
如何更新摩拜app 浏览:959
苹果7和苹果8的区别大吗 浏览:222
无忧时代网络技术武汉有限公司 浏览:348
urv4g网络怎么用 浏览:620
cass三角网如何生成sjw文件 浏览:979
rar改文件名 浏览:588
写编程和视频剪切用什么电脑 浏览:184
搜查大数据 浏览:630
日本小学生童年电影 浏览:379
百度健康大数据分析 浏览:236
卖初夜生孩子后来相爱的国外电影 浏览:994
消失的眼角膜完整观看 浏览:276
韩剧电影免费在线观看爱情 浏览:337

友情链接