---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
UDP和TCP
UDP:无连接,不可靠,速度快,数据报大小不超过64k。聊天工具,实时摄像投影软件都是UDP。
TCP:面向连接,通过三次握手监测链接,可靠,速度慢,TCP数据包容量更大。下载软件用的是TCP。
UDP传输:
发送端:
1 创建udp服务,通过DatagramSocket对象。DatagramSocket对象是包投递服务的发送或接受点。
DatagramSocket ds=new DatagramSocket(20000);//为自己指定端口号是20000
2 确定数据,并装成数据包。DatagramPacket类表示数据报包,用于无连接投递服务(udp)
/DatagramPacket(byte[] buf,int lenth,InetAddress address,int port)
//构造数据报包,用来将长度为lenth的发送到指定主机上的指定端口号
byte[] data="我是udp
".getBytes();
DatagramPacket dp=new DatagramPacket(data,data.length,InetAddress.getByName("127.0.0.1"),10000);
3 通过socket服务,将已有的数据包发送出去,通过send方法。
ds.send(dp);
4 关闭资源。
ds.close();
接收端:
1 创建udpsocket服务,建立端点
DatagramSocket ds=new DatagramSocket(10000);//监听10000端口,也就是为自己指定端口为10000
2 定义数据包。用于存储接收来的数据包。
//DatagramPacket(byte[]buf,int length)构造DatagramPacket,用来接收长度为length的数据包
byte[]buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
3 通过服务的receive方法将收到的数据存入数据包中。这是一个阻塞式方法,线程机制,就是说没有数据来,程序就停在这里等到数据来再向下执行。
ds.receive(dp);
4 通过数据包的方法获取其中的数据。
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
int port=dp.getPort();//返回这个包的目的端口号(发送的时候)或者源端口号(接收的时候)。每个程序都会被系统自动随机分配一个端口号,即使程序不变,每次随机分配一个。
System.out.println(ip+"::"+data+"::"+port);
//5关闭资源
ds.close();
点对点单向聊天软件的制作,详情见UDPDemo.java 和UDPDemo2.java,用dos命令窗口来实现。
如果想实现群聊,可以把ip最后一位设为255.
利用多线程实现可以同时收发信息的聊天软件。实现代码如下:
/*编写一个聊天程序
* 有收数据的部分和发数据的部分
* 这两个部分需要同时执行,所以用到多线程技术
* 一个线程控制收,一个线程控制发
* 因为收和发的动作是不一致的,所以要定义两个run方法
* 而且这两个run方法要封装到不同的类中*/
class Send1 implements Runnable{
DatagramSocket ds;
DatagramPacket dp;
Send1(DatagramSocket ds){
this.ds=ds;
}
public void run() {
BufferedReader br=null;
try {
br=new BufferedReader(new InputStreamReader(System.in));
String s=null;
while((s=br.readLine())!=null){
if(s.equals("over"))break;
byte[] data=s.getBytes();
dp=new DatagramPacket(data,0,data.length,InetAddress.getByName("127.0.0.1"),10003);
ds.send(dp);
}
} catch (Exception e) {
throw new RuntimeException("发送端出问题了");
}finally{
try {
br.close();
ds.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Receive1 implements Runnable{
DatagramSocket ds;
Receive1(DatagramSocket ds){
this.ds=ds;
}
public void run() {
try {
while(true){
byte[] data=new byte[1024];
DatagramPacket dp=new DatagramPacket(data,data.length);
ds.receive(dp);
String s=new String(dp.getData(),0,dp.getLength());
System.out.println(dp.getAddress().getHostAddress()+"的"+dp.getPort()+"端口号说:"+s);
}
} catch (Exception e) {
throw new RuntimeException("接收端出问题了");
}
}
}
class ChatDemo{
public static void main(String[]args) throws Exception{
DatagramSocket sendSocket=new DatagramSocket();
DatagramSocket receiveSocket=new DatagramSocket(10003);
new Thread(new Send1(sendSocket)).start();
new Thread(new Receive1(receiveSocket)).start();
}
}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------