java不支持tcpip协议吗

java不支持tcpip协议吗,第1张

支持。java因其具备这项功能,也是支持tcp/ip协议的,Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因Java语言具有功能强大和简单易用两个特征。

public static void TestModbus() throws Exception{
IpParameters params = new IpParameters();
paramssetHost("localhost");//地址
paramssetPort(502);//端口
ModbusFactory factory = new ModbusFactory();
ModbusMaster master = factorycreateTcpMaster(params, true);

// 初始化
try {
masterinit();
readHoldingRegistersTest(master,1,0,3);
} catch (ModbusInitException e) {
eprintStackTrace();
} finally {
masterdestroy();
}

}

public static void main(String[] args) {
try {
TestModbus();
} catch (Exception e) {
// TODO: handle exception
eprintStackTrace();
}
}
private static void readHoldingRegistersTest(ModbusMaster master,
int slaveId, int start, int len) {
try {
// ReadInputRegistersRequest request = new ReadInputRegistersRequest(
// slaveId, start, len);
// ReadInputRegistersResponse response = (ReadInputRegistersResponse) master
// send(request);
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
slaveId, start, len);
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master
send(request);
if (responseisException()) {
Systemoutprintln("Exception response: message="
+ responsegetExceptionMessage());
} else {
ByteQueue byteQueue= new ByteQueue(12);
responsewrite(byteQueue);
Systemoutprintln(byteQueue);

Systemoutprintln(ArraystoString(responsegetShortData()));
short[] list = responsegetShortData();
for(int i = 0; i < listlength; i++){
Systemoutprint(list[i] + " ");
}
}
} catch (ModbusTransportException e) {
eprintStackTrace();
}
}

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());
}
}

如果你能控制程序的话,就用楼上的办法了。。
否则,用命令阿。。。
比如:
netstat -an 就能得到全部连接情况。。
如果是unix,那么:
netstat -an | grep 80 | wc -l
得到绑定80端口的连接数。

服务端监听:ServerSocket server=new ServerSocket(port);//port:绑定的端口号
Socket client=serveraccept();//监听端口,一旦取得连接则获得客户端的socket连接对象client
客户端: Socket s=new Socket(ip,port);//要连接的服务器的ip以及端口号
如果正常连接上之后,socket的对象可以获得InputStream和OutputStreame,然后就可以进行通信了
完成通信之后,执行socket对象的close()方法关闭连接,完成一次完整的socket连接

TCP是面向连接,UDP面向非连接,资料不复制,在这里简单说下:\x0d\TCP建立连接时需要传说的三次握手,服务端与客户端需要确认对方身份而已,建立好连接后,就开始传递消息,直到有一方断开连接位置。 就好比两个人打电话,要先通了才能说话。\x0d\UDP只是数据报发送,它的优点速度快,并非要向TCP那样麻烦建立,它只负责将信息发出,但是并不确保信息的准确完整性等,就好比发短信,短信是出去了,但是中间是否有问题,是否对方手机能收到就不管了。\x0d\在java中想要实现上述两种协议通信,可采用socket建立连接,socket可以理解为码头,其实是套接字,这里简单说下,就好比两个城市运输货物,通过码头走货一样。至于如何通过socket建立两个连接,网上资料多的是,在这里不复制例子了。

这是因为tcp协议中有一个叫做“Nagle算法”的机制,它会限制发送方发送数据的速度,以减少网络繁忙程度,从而提高网络效率。这就意味着,如果发送方发送的数据量小于一定的阈值,接收方就会一直等待接收,直到超时或者接收到满足阈值的数据才会返回。因此,如果发送方发送的数据量小于阈值,那么接收方就会一直等待,直到超时或者接收到满足阈值的数据才会返回,这就是为什么第一行无法读取的原因。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13403110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-29
下一篇 2023-07-29

发表评论

登录后才能评论

评论列表(0条)

保存