A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chenyanchenyan 初级黑马   /  2017-12-4 15:00  /  2330 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 chenyanchenyan 于 2017-12-4 15:05 编辑

                                网络编程


一、定义:可在网络间通信
二、网络通信3要素:

   A:IP地址 公共地址 私有地址
   B:端口号   设备进场地址,(软件之间连接的编号)
    C:通信协议:UDP协议 不需连接,不区分客户端和服务端,速度快 不可靠。  TCP协议 要连接 区分客户端和服务端 效率                  低 可靠
三、InetAddress类的常用方法:
   static InetAddress getByname(String name);//通过主机名/IP地址构建一个InetAddress对象
    Static getHostAddress();//返回IP地址
   getHostName();//返回主机名
四、UDP协议:
  发送端:创建发送端Socket对象->创建数据并打包->发送数据->释放资源
       DatagramSocket:用来发送接收数据,基于UDP
       DatagramSocket():
        DatagramSocket(int port):
        DatagramPacket(byte[] buf,int length,InetAddres address,int port)

//发送端
[Java] 纯文本查看 复制代码
public class UDPIPsendss {
    public static void main(String[] args) throws IOException {
        DatagramSocket dgs = new DatagramSocket();
        
        //发送的内容
        String s = "hello";
        //转成字节数组
        byte[] by = s.getBytes();
        //获取字节数组长度
        int len = by.length;
        //获取发送的地址
        InetAddress iad = InetAddress.getByName("127.0.0.1");
        //指定设备端口号
        int port = 8888;

        //打包
        DatagramPacket p = new DatagramPacket(by, len, iad, port);

        //发送数据
        dgs.send(p);

        //释放资源
        dgs.close();
        
        
    }
}




接受端:创建接收端Socket对象->接收数据->解析数据->输出数据->释放资源
//接受端

[Java] 纯文本查看 复制代码
public class UDPipReceive {
    public static void main(String[] args) throws IOException {
        //创建接收到对象,并给定端口号
        DatagramSocket ds = new DatagramSocket(8888);
        
        //创建一个包用来存接收到的信息
        byte[] by = new byte[1024];
        int length = by.length;
         DatagramPacket dp = new DatagramPacket(by, length);

         //将信息传入包
         ds.receive(dp);//阻塞

         //获取发送端地址
         InetAddress adress = dp.getAddress();
         //获取接收到的数据
         byte[] b = dp.getData();
         //获取接收到的长度
         int len = dp.getLength();
         
         //打印信息
         System.out.println("-->"+adress.getHostAddress());
         System.out.println(new String(b,0,len));
         
         //释放资源
         ds.close();
    }
}


   
注意事项:A:端口号错误,可发送,无异常,接收不到,B:端口号不能重复
   
五、TCP协议:
  创建发送端(客户端)Socket对象->获取输出流对象->发送数据->释放资源
  创建接受端(服务端)Socket对象(确认端口号)->监听(阻塞)->创建输入流对象->获取数据->输出对象->释放资源(可不关)
      ServerSocket(int port);
      Socket accept();
//发送端
[Java] 纯文本查看 复制代码
public class TcpSends {
    public static void main(String[] args) throws IOException {
        //创建发送端Socket对象
        Socket s = new Socket(InetAddress.getByName("127.0.0.1"),9999);
        //创建输出流
        OutputStream os =s.getOutputStream(); 
        
        String ss = "hello";
        //发送数据
        os.write(ss.getBytes());
        
        //释放资源
        os.close();
        
    }
}



//接受端
[Java] 纯文本查看 复制代码
public class TcpReceive {
    public static void main(String[] args) throws IOException {
        //创建接受端(服务端)Socket对象(确认端口号)
        ServerSocket ss = new ServerSocket(9999);
        //监听(阻塞)
        Socket s = ss.accept();
        //创建输入流对象
        InputStream is = s.getInputStream();
        
        //准备一个数组用来存放接收到的字节
        int len;
        byte[] by = new byte[1024];
        //获取数据
        len = is.read(by);
        
        InetAddress iad = s.getLocalAddress();
        System.out.println("client-->"+iad);
        //输出接收到的信息
        System.out.println(new String(by,0,len));
        s.close();
    }
}




小案例
[Java] 纯文本查看 复制代码
//客户端读取本地一个图片并发送,服务端接收并存储
public class TCPSendZong {
    public static void main(String[] args) throws IOException {
        //创建Socket对象,给出发送的目的地址和端口号
        Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8888);
        //创建输出流
        OutputStream os = s.getOutputStream();
        //提升至高效输出流
        BufferedOutputStream bos = new BufferedOutputStream(os);
        
        //创建高效输入流,读取本地图片
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("学习途.png"));
        //读取数据
        byte[] by = new byte[1024];
        int len = by.length;
        while((len = bis.read(by))!=-1){
            //发送
            bos.write(by,0,len);
        }
        //释放资源
        s.close();
        bos.close();
        bis.close();
    }
}

public class TCPSerZong {
    public static void main(String[] args) throws IOException {
        //创建服务端的Socket对象
        ServerSocket ss = new ServerSocket(8888);
        //服务端获取Socket对象,接收
        Socket s = ss.accept();
        //创建输入流
        InputStream is = s.getInputStream();
        //提高输入流高效级别
        BufferedInputStream bis = new BufferedInputStream(is);
        //创建输出流将接收到的图片保存到本地
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D://a.png"));
        //接收到的信息
        byte[] by = new byte[1024];
        int len;
        while((len=bis.read(by))!=-1){
            //写入本地地址
            bos.write(by,0,len);
        }
        
        //释放资源
        s.close();
        bis.close();
        bos.close();
    }
}







评分

参与人数 1技术分 +3 收起 理由
皖哥哥 + 3 很给力!

查看全部评分

9 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
呦,小伙 有内容
回复 使用道具 举报

给力点赞 666
回复 使用道具 举报
666
回复 使用道具 举报
程序员小虾米 来自手机 初级黑马 2018-3-15 17:52:10
7#
66666666赞
回复 使用道具 举报
小皖妹妹 来自手机 黑马粉丝团 2018-3-15 18:47:58
8#
回复 使用道具 举报
666
回复 使用道具 举报
666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马