快速业务通道

Java编程那些事儿106——网络编程技术5 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-07-04
ndDp);      //延迟      Thread.sleep(10);      //接收      ds.receive(receiveDp);      //读取反馈内容,并输出      byte[] response = receiveDp.getData();      int len = receiveDp.getLength();      String s = new String(response,0,len);      System.out.println("服务器端反馈为:" + s);    }   }catch(Exception e){      e.printStackTrace();   }finally{      try{        //关闭连接        ds.close();      }catch(Exception e){}   }  } }

Java编程那些事儿106——网络编程技术5(4)

时间:2010-03-20 csdn 陈跃峰

在该示例中,将和服务器端进行数据交换的逻辑写在一个for循环的内部,这样就可以实现和服务器端的多次交换了,考虑到服务器端的响应速度,在每次发送之间加入0.01秒的时间间隔。最后当数据交换完成以后关闭连接,结束程序。

实现该逻辑的服务器端程序代码如下:

package udp; import java.net.*; /** * 可以并发处理数据包的服务器端 * 功能为:显示客户端发送的内容,并向客户端反馈字符串“OK” */ public class MulUDPServer { public static void main(String[] args) { DatagramSocket ds = null;  //连接对象 DatagramPacket receiveDp; //接收数据包对象 final int PORT = 10012; //端口 byte[] b = new byte[1024]; receiveDp = new DatagramPacket(b,b.length); try{ //建立连接,监听端口 ds = new DatagramSocket(PORT); System.out.println("服务器端已启动:"); while(true){ //接收 ds.receive(receiveDp); //启动线程处理数据包 new LogicThread(ds,receiveDp); } }catch(Exception e){   e.printStackTrace(); }finally{ try{ //关闭连接 ds.close(); }catch(Exception e){} } } }

该代码实现了服务器端的接收逻辑,使用一个循环来接收客户端发送过来的数据包,当接收到数据包以后启动一个LogicThread线程处理该数据包。这样服务器端就可以实现同时处理多个数据包了。

实现逻辑处理的线程代码如下:

package udp; import java.net.*; /**  * 逻辑处理线程  */ public class LogicThread extends Thread { /**连接对象*/ DatagramSocket ds; /**接收到的数据包*/ DatagramPacket dp; public LogicThread(DatagramSocket ds,DatagramPacket dp){ this.ds = ds; this.dp = dp; start(); //启动线程 } public void run(){ try{ //获得缓冲数组 byte[] data = dp.getData(); //获得有效数据长度 int len = dp.getLength(); //客户端IP InetAddress clientAddress = dp.getAddress(); //客户端端口 int clientPort = dp.getPort(); //输出 System.out.println("客户端IP:" + clientAddress.getHostAddress()); System.out.println("客户端端口号:" + clientPort); System.out.println("客户端发送内容:" + new String(data,0,len)); //反馈到客户端 byte[] b = "OK".getBytes(); DatagramPacket sendDp = new DatagramPacket(b,b.length,clientAddress,clientPort); //发送 ds.send(sendDp); }catch(Exception e){ e.printStackTrace(); } } }

在该线程中,只处理一次UDP通讯,当通讯结束以后线程死亡,在线程内部,每次获得客户端发送过来的信息,将获得的信息输出到服务器端程序的控制台,然后向客户端反馈字符串“OK”。

由于UDP数据传输过程中可能存在丢失,所以在运行该程序时可能会出现程序阻塞的情况。如果需要避免该问题,可以将客户端的网络发送部分也修改成线程实

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号