【android学习记录】socket的初步学习

/**
 * Created by 123 on 2018/2/26.
 *
 * http通信是请求——响应的方式
 * socket则是双方连接起来之后进行实时通信
 *
 * TCP/IP
 *
 * 使用UDP方式android端和服务器端接收可以看出,
 * 其实android端和服务器端的发送和接收大庭相径,
 * 只要端口号正确,相互通信就没有问题。
 * TCP使用的是流的方式发送,UDP是以包的形式发送。
 */

public class SocketTest {


    /**
     * Tcp协议通信
     */
    protected void connectServerWithTCPSocket(){

        Socket socket;

        try{

            //创建socket对象,并且指定服务器端的ip以及端口号
            socket=new Socket("192.168.1.32",1989);

            //创建一个inputStream 用户读取要发送的文件
            InputStream inputStream=new FileInputStream("e://a.txt");

            //获取socketoutputStream对象用于发送数据
            OutputStream outputStream=socket.getOutputStream();

            //创建一个byte类型的buffer字节数组,用于存放读取本地文件
            byte buffer[]=new byte[4*1024];

            int temp=0;

            //循环读取文件
            while ((temp=inputStream.read(buffer))!=-1){
                //把数据写入outputStream之中
                outputStream.write(buffer,0,temp);
            }

            //发送读取的数据到服务端
            outputStream.flush();


            /** 或创建一个报文,使用BufferedWriter写入,看你的需求 **/
//          String socketData = "[2143213;21343fjks;213]";
//          BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
//                  socket.getOutputStream()));
//          writer.write(socketData.replace("\n", " ") + "\n");
//          writer.flush();
            /************************************************/



        }catch (UnknownHostException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }

    }



    /**
     * 服务器端实现
     * */
//    public void ServerReceviedByTcp(){
//
//        // 声明一个ServerSocket对象
//        ServerSocket serverSocket = null;
//        try {
//            // 创建一个ServerSocket对象,并让这个Socket1989端口监听
//            serverSocket = new ServerSocket(1989);
//            // 调用ServerSocketaccept()方法,接受客户端所发送的请求,
//            // 如果客户端没有发送数据,那么该线程就停滞不继续
//            Socket socket = serverSocket.accept();
//            // Socket当中得到InputStream对象
//            InputStream inputStream = socket.getInputStream();
//            byte buffer[] = new byte[1024 * 4];
//            int temp = 0;
//            // InputStream当中读取客户端所发送的数据
//            while ((temp = inputStream.read(buffer)) != -1) {
//                System.out.println(new String(buffer, 0, temp));
//            }
//            serverSocket.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }

    /**********************************************************/

    /**
     * 使用UDP协议通信
     *
     * 客户端发送数据
     * */
    private void connectServerWithUDPSocket(){

        DatagramSocket socket;

        try{
            //创建DatagramSocket对象并指定一个端口号,
            //如果客户端需要接收服务器的返回数据,
            //还需要使用这个端口号来receive
            //所以端口号很重要
            socket=new DatagramSocket(1985);

            //使用InetAddress(Inet4Address).getByNameIP地址转换为网络地址
            InetAddress serverAddress=InetAddress.getByName("192.168.1.32");

            //设置要发送的报文
            String str="[2143213;21343fjks;213]";
            //将字符串转化为字节数组
            byte data[]=str.getBytes();

            //创建DatagramPacket对象,用于发送数据。
            //参数:需要发送的数据,数据长度,服务器网络地址,服务器端口号
            DatagramPacket packet=new DatagramPacket(data,data.length,serverAddress,10025);

            socket.send(packet);//发送数据到服务端

        }catch (SocketException e){
            e.printStackTrace();
        }catch (UnknownHostException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }

    }

    /**
     * 使用UDP协议通信
     *
     * 客户端接受服务器返回的数据
     * */
    public void ReceiveServerSocketData(){

        DatagramSocket socket;

        try{
            //实例化的端口号要和发送时候的一致,否则接收不到数据
            socket=new DatagramSocket(1985);
            byte data[]=new byte[4*1024];

            //参数:接受的数据,数据的长度
            DatagramPacket packet=new DatagramPacket(data,data.length);
            socket.receive(packet);

            //接收到的数据转化为string
            String result=new String(packet.getData(),packet.getOffset(),packet.getLength());

            socket.close();//关闭

        }catch (SocketException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 使用UDP协议通信
     *
     * 服务器接收客户端
     * */
    public void ServerReceviedByUdp(){
        //创建一个DatagramSocket对象,并指定监听端口。(UDP使用DatagramSocket        DatagramSocket socket;
        try {
            socket = new DatagramSocket(10025);
            //创建一个byte类型的数组,用于存放接收到得数据
            byte data[] = new byte[4*1024];
            //创建一个DatagramPacket对象,并指定DatagramPacket对象的大小
            DatagramPacket packet = new DatagramPacket(data,data.length);
            //读取接收到得数据
            socket.receive(packet);
            //把客户端发送的数据转换为字符串。
            //使用三个参数的String方法。参数一:数据包 参数二:起始位置 参数三:数据包长
            String result = new String(packet.getData(),packet.getOffset() ,packet.getLength());
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }





}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值