看 Oracle 官方教程,同步式的 Socket 就是传统的一问一答方式,它就是你需要的。
客户端先 socketgetOutputStream()write(); 之后到 socketgetInputStream()read(byte[]) 在循环中读取直到 read 方法返回 -1 或你期望的字节数已经全部收到了就停下来,如果不尝试停下来,后面的 read 将会阻塞等待。
>
基于性能改进,一般我们需要使用 NIO 异步的 socket,只需要一个线程负责通信,每个线程都有自己的出站消息队列和入站消息队列,以线程为 key 区分开,通信线程只负责把各自的消息从出站队列中发送去并把收到的消息放入入站队列中,应用程序线程就去各自的消息队列中取消息就可以了。因为每个应用线程有各自的消息队列,我们把消息放入出站队列之后就到入站队列上用同步锁等待的方法阻塞到有消息回答时为止。
关于 NIO non-blocking 非阻塞式 socket,下面有一个 NBTimeServer 例子,它讲的是服务端。客户端与此类似,
>
NIO 通信线程样例。
public void run(){
int tip = 0;
try
{
selector = Selectoropen();
SelectionKey k = channelregister(selector, getInterestOptions());
kattach(thread); // 把当前线程绑定到附件中。
thisrunning = true;
statusChanged(StatusCONNECTED);
while (thisisRunning())
{
// select() is a blocking operation
int eventCount = selectorselect();
debug("[MCDebug] Polling TCP events " + eventCount);
if (eventCount > 0 && channelisOpen() && thisisRunning())
{
Set keys = selectorselectedKeys();
for (Iterator iter = keysiterator(); iterhasNext(); iterremove())
{
SelectionKey key = (SelectionKey) iternext();
Thread thread = (Thread) keyattachment();
if (!keyisValid())
{ // channel is closing
break;
}
process(key); // 处理读取消息并把消息放入 thread 对应的队列。//写出消息类似的,不过在 register 时需要注册写出允许的事件,
}
}
}
}
java获取固定IP发来所有的数据包,需要实现网络嗅探的部分功能:
代码如下;
/JpcapTipjava
/
package m;
import jpcapPacketReceiver;
import jpcapJpcapCaptor;
import jpcappacket;
import jpcapNetworkInterface;
import jpcapNetworkInterfaceAddress;
//import javanetInetAddress;
//import javanetUnknownHostException;
public class JpcapTip implements PacketReceiver {
public void receivePacket(Packet packet) {
Systemoutprintln("");
/IP数据报报文头/
byte[] l=packetheader;
/
for (int t=0;t<21;t++){
Systemoutprint(l[t]+" ");
}
/
String str="";
Systemoutprint("报文头 : ");
for (int i=0;i<llength;i++) {
//str=str+l;
int m=0;
m=l[i];
m=m<<24;
m=m>>>24;
str=str+IntegertoHexString(m);
//Systemoutprint(" "+l[i]);
}
Systemoutprintln(str);
int d=llength;
Systemoutprintln("首部长度 :"+(d8)+"bit");
/分析源IP地址和目的IP地址/
/分析协议类型/
/
if(packetgetClass()equals(IPPacketclass)) {
IPPacket ipPacket=(IPPacket)packet;
byte[] iph=ipPacketoption;
String iphstr=new String(iph);
Systemoutprintln(iphstr);
}
/
if(packetgetClass()equals(ARPPacketclass))
{
Systemoutprintln("协议类型 :ARP协议");
try {
ARPPacket arpPacket = (ARPPacket)packet;
Systemoutprintln("源网卡MAC地址为 :"+arpPacketgetSenderHardwareAddress());
Systemoutprintln("源IP地址为 :"+arpPacketgetSenderProtocolAddress());
Systemoutprintln("目的网卡MAC地址为 :"+arpPacketgetTargetHardwareAddress());
Systemoutprintln("目的IP地址为 :"+arpPacketgetTargetProtocolAddress());
} catch( Exception e ) {
eprintStackTrace();
}
}
else
if(packetgetClass()equals(UDPPacketclass))
{
Systemoutprintln("协议类型 :UDP协议");
try {
UDPPacket udpPacket = (UDPPacket)packet;
Systemoutprintln("源IP地址为 :"+udpPacketsrc_ip);
int tport = udpPacketsrc_port;
Systemoutprintln("源端口为:"+tport);
Systemoutprintln("目的IP地址为 :"+udpPacketdst_ip);
int lport = udpPacketdst_port;
Systemoutprintln("目的端口为:"+lport);
} catch( Exception e ) {
eprintStackTrace();
}
}
else
if(packetgetClass()equals(TCPPacketclass)) {
Systemoutprintln("协议类型 :TCP协议");
try {
TCPPacket tcpPacket = (TCPPacket)packet;
int tport = tcpPacketsrc_port;
Systemoutprintln("源IP地址为 :"+tcpPacketsrc_ip);
Systemoutprintln("源端口为:"+tport);
Systemoutprintln("目的IP地址为 :"+tcpPacketdst_ip);
int lport = tcpPacketdst_port;
Systemoutprintln("目的端口为:"+lport);
} catch( Exception e ) {
eprintStackTrace();
}
}
else
if(packetgetClass()equals(ICMPPacketclass))
Systemoutprintln("协议类型 :ICMP协议");
else
Systemoutprintln("协议类型 :GGP、EGP、JGP协议或OSPF协议或ISO的第4类运输协议TP4");
/IP数据报文数据/
byte[] k=packetdata;
String str1="";
Systemoutprint("数据 : ");
for(int i=0;i<klength;i++) {
//int m=0;
//m=k[i];
//m=m<<24;
//m=m>>>24;
//str1=str+IntegertoHexString(m);
str1 = new String(k);
//str1=str1+k[i];
//Systemoutprint(" "+k[i]);
}
Systemoutprintln(str1);
Systemoutprintln("数据报类型 : "+packetgetClass());
Systemoutprintln("");
}
public static void main(String[] args) throws Exception{
// TODO 自动生成方法存根
NetworkInterface[] devices = JpcapCaptorgetDeviceList(); //getDeviceList();
//for (int i =0; i<deviceslength;i++) {
int a=0;
//try {
/本地网络信息/
byte[] b=devices[1]mac_address; //网卡物理地址
//}
//catch() {}
Systemoutprint("网卡MAC : 00");
for (int j=0;j<blength;j++){
//a=a<<8;
a=b[j];
a=a<<24;
a=a>>>24;
Systemoutprint(IntegertoHexString(a));
}
Systemoutprintln();
NetworkInterfaceAddress[] k=devices[1]addresses;
//Systemoutprintln("网卡MAC : "+IntegertoHexString(a));
for(int n=0;n<klength;n++) {
Systemoutprintln("本机IP地址 : "+k[n]address); //本机IP地址
Systemoutprintln("子网掩码 : "+k[n]subnet); //子网掩码
}
Systemoutprintln("网络连接类型 : "+devices[1]datalink_description);
//}
NetworkInterface deviceName = devices[1];
/将网卡设为混杂模式下用网络设备deviceName/
JpcapCaptor jpcap =JpcapCaptoropenDevice(deviceName, 2000, false, 1); //openDevice(deviceName,1028,false,1);
jpcaploopPacket(-1,new JpcapTip());
}
}
如何用java发送>
给你一个吧,这个能抓取任何程序
import javaioBufferedReader;
import javaioIOException;
import javaioInputStream;
import javaioInputStreamReader;
import javanet>
以上就是关于Java Socket开发 关于报文传递和接收全部的内容,包括:Java Socket开发 关于报文传递和接收、java如何编程实现,获取固定IP发来所有的数据包 、java 利用socket机制从客户端读取从服务器发来的消息等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)