java udp (使用类调用双通信)1

项目需要就使用了UDP通信,做了java的双方通信,其实代码还是来自之前的udp学习代码,自己加了注释,并且优化的使用类来封装关于通信类库的使用代码

目的是为了在安卓项目中使用时,可以通过实例化,调用方法即可,极大简单了代码的混杂程度

当然,该程序的缺陷是:未能实现服务器循环接收,只能通信一次,下一版本改正。

服务器代码:

定义一个udpS.java ,udpS类的代码:

package com.swust.udp;

import java.io.*;
import java.net.*;
/** 
 * 服务端 
 * 1、创建服务+端口 
 * 2、准备接受容器  byte数组 
 * 3、把接收容器封装成包 DatagramPacket 
 * 4、接受数据 
 * 5、分析数据 
 */  

public class udpS  {

    private String content="hello world,我是服务器,给你回复了,哼哼哼";

    private int port=5050;

    public void setContent(String content)
    {
        this.content=content;
    }
    public void setPort(int port)
    {
        this.port=port;
    }

    public void udpServerInit( )throws IOException{
           //服务器端首先创建一个DatagramSocket对象,并且指点监听的端口
              DatagramSocket  server = new DatagramSocket(port); //使用了端口,未调用setPort时,使用默认值
            //创建一个空的DatagramPacket数据包对象并指定大小,用于接收数据
              byte[] recvBuf = new byte[1024];
              DatagramPacket recvPacket 
                  = new DatagramPacket(recvBuf , recvBuf.length);
              //使用DatagramSocket的receive方法接收客户端发送的数据,在没有数据进行接收的处于堵塞状态
              server.receive(recvPacket);

              String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
              System.out.println("接收:\t" + recvStr);
              /*
               * 回发数据部分
               */
              int port_Client = recvPacket.getPort();
              InetAddress addr = recvPacket.getAddress();
              String sendStr =content; //使用了content属性,未调用setContent,使用默认值
              byte[] sendBuf;
              sendBuf = sendStr.getBytes();
              DatagramPacket sendPacket 
                  = new DatagramPacket(sendBuf , sendBuf.length , addr , port_Client );

              server.send(sendPacket);

              server.close(); 
         }

 }

此时,主函数的代码,使用上面的类:

package com.swust.udp;

import java.io.*;

public class udpServer {  
      
    public static void main(String[] args) throws IOException  {  
        udpS  udpser=new udpS();
        udpser.setPort(8888);
        udpser.setContent("猜猜我给你回复啥");
        udpser.udpServerInit();
    }  
}


相应的,客户机端:

客户机代码:

定义一个udpC.java ,udpC类的代码:

package com.swust.udp;

import java.io.*;
import java.net.*;

/** 
 * 1、创建客户端+端口 
 * 2、准备数据 字节数组 
 * 3、给数据打包 并指定发送的目的地和端口 
 * 4、发送 
 * 5、释放 
 *  
 * 思考 : 发送有类型的数据  怎么处理 如对象  数字 等等 
 */  
public class udpC {
    
    private String content="我是客户机1,给你发送消息了";

    private int port=5050;

    private String ip = "127.0.0.1"; 
    //设置文本内容
    public void setContent(String content)
    {
        this.content=content;
    }
    //设置端口
    public void setPort(int port)
    {
        this.port=port;
    }
    //设置IP地址
    public void setIp(String ip)
    {
        this.ip=ip;
    }
    public void udpClientInit( )throws IOException{
        //客户端也创建个DatagramSocket对象,并且指点监听的端口
        DatagramSocket client = new DatagramSocket();
        //定义要发送的一个字符串
        String sendStr =content;                //使用了content属性,未调用时用默认内容
        byte[] sendBuf;
        sendBuf = sendStr.getBytes();
        //创建一个InetAddress对象,这个对象是一个网络地址
        InetAddress addr = InetAddress.getByName(ip); //使用了ip地址属性,未调用时用默认本机地址127.0.0.1
        //创建一个DatagramPacke数据包t对象,并指定要将这个数据报包发送到网络的哪个地址以及端口号
        DatagramPacket sendPacket 
            = new DatagramPacket(sendBuf ,sendBuf.length , addr , port);//使用了端口属性,未调用时用默认值5050
        //使用DatagramSocket的对象的send()方法发送数据包
        client.send(sendPacket);
        /*
         * 接受服务器回发的消息
         */
        byte[] recvBuf = new byte[1024];
        DatagramPacket recvPacket
            = new DatagramPacket(recvBuf , recvBuf.length);
        client.receive(recvPacket);
        String recvStr = new String(recvPacket.getData() , 0 ,recvPacket.getLength());
        System.out.println("收到: \t" + recvStr);

        client.close();
    } 
    
}

此时,主函数的代码,使用上面的类:

package com.swust.udp;

import java.io.*;

public class udpClient { 
public static void main(String[] args) throws IOException {

udpC udpclient=new udpC();
udpclient.setPort(8888);
//udpclient.setIp("100.67.176.34");//测试网络ip是否可用,未调用时使用本机ip
udpclient.setContent("我是客户机,你信吗");
udpclient.udpClientInit();
}

}

 

总结:这样写比较灵活吧,以后控件的内容,端口,IP可以通过形参来改变,否则安卓代码和java代码混在一起,问题很大。

        ps:好久不写类的方法封装了,不得不去翻基础知识,汗。今天好好加油吧,纪念大三的暑假!

posted @ 2015-08-21 22:04  平常心,平常心  阅读(638)  评论(0编辑  收藏  举报