网络编程学习

网络编程学习

基础知识

  • 通信要素一:IP和端口号

  • IP唯一的标识 Internet上的计算机(通信实体)

  • 在java中使用InetAddress类代表IP

  • IP分类:IPV4和IPV6;万维网和局域网

  • 域名:www.baidu.com

  • 本地回路地址:127.0.0.1对应着localhost

  • 如何实例化InetAddress:两个方法:getByName(String host)、本机的IP:getLocalHost()

  • 常用方法: 域名:getHostName 本机地址:getHostAddress

  • .端口号:

    • 不同进程有不同的端口号

    • 被规定为一个16位的整数0~65535

    • 端口分类:公认端口:0~1023.被预先定义的服务通信占用(如FTP占用端口21);注册端口:1024~49151.分配给用户进程或应用程序如MYSQL占用端口3306;动态私有端口:49152~65535

  • 端口号和IP地址在一起组合的出一个网络套接字:Socket

@Test
public void test() throws UnknownHostException {
    //获取IP
    InetAddress inet1=InetAddress.getByName("192.168.10.14");
    System.out.println(inet1);
    InetAddress inet2=InetAddress.getByName("www.atguigu.com");
    System.out.println(inet2);
    //获取本机IP地址
    InetAddress inet3=InetAddress.getByName("127.0.0.1");
    System.out.println(inet3);
    InetAddress inet4=InetAddress.getLocalHost();
    System.out.println(inet4);
    //获取域名和主机地址
    System.out.println(inet2.getHostName());
    System.out.println(inet2.getHostAddress());

}

 

TCP

  • 示例一

//客户端
@Test
public void client(){
    Socket socket= null;//服务端端口号
    OutputStream os= null;
    try {
        //1.创建Socket对象,指明服务器端IP和端口号
        InetAddress inet=InetAddress.getByName("127.0.0.1");
        socket = new Socket(inet,8848);
        //2.获取一个输出流,用于输出数据
        os = socket.getOutputStream();
        //3.写出数据的操作
        os.write("你好".getBytes());
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //资源的关闭
        if(os!=null){
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
        }
        if(socket!=null){
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
        }
    }


}
//服务端
@Test
public void server() throws IOException {
    //1.创建服务端SeverSocket,指明自己的端口号
    ServerSocket ss = new ServerSocket(8848);
    //2.调用accept方法表示接收来自于客户端的socket
    Socket socket=ss.accept();
    //3.获取输入流
    InputStream is=socket.getInputStream();
    //4.读取输入流的数据
    ByteArrayOutputStream baos=new ByteArrayOutputStream();
    byte[] buffer=new byte[5];
    int len;
    while((len=is.read(buffer))!=-1){
        baos.write(buffer,0,len);
    }
    System.out.println(baos.toString());
    //5.资源的关闭
    baos.close();
    is.close();
    socket.close();
    ss.close();

}

 

 

  • 示例二:实现交互

@Test
public void client() throws IOException {
    //1.
    InetAddress inet=InetAddress.getByName("127.0.0.1");
    Socket socket = new Socket(inet,8849);
    //2.
    OutputStream os = socket.getOutputStream();
    //3.
    FileInputStream fis=new FileInputStream(new File("李沁.jpg"));
    byte[] buffer=new byte[5];
    int len;
    while((len=fis.read(buffer))!=-1){
        os.write(buffer,0,len);
    }
    socket.shutdownOutput();//表示传完了
    //4.接收反馈信息
    InputStream is =socket.getInputStream();
    ByteArrayOutputStream baos=new ByteArrayOutputStream();
    byte[] buffer1=new byte[5];
    int len1;
    while((len1=is.read(buffer1))!=-1){
        baos.write(buffer1,0,len1);
    }
    System.out.println(baos.toString());
    //5.资源关闭
    is.close();
    baos.close();
    fis.close();
    os.close();
    socket.close();
}
@Test
public void server() throws IOException {
    //1.
    ServerSocket ss = new ServerSocket(8849);
    //2.
    Socket socket=ss.accept();
    //3.获取输入流
    InputStream is=socket.getInputStream();
    //4.读取输入流的数据
    FileOutputStream fos=new FileOutputStream(new File("李沁1.jpg"));
    byte[] buffer=new byte[1024];
    int len;
    while((len=is.read(buffer))!=-1){
        fos.write(buffer,0,len);
    }
    //read方法阻塞,后面的不走了,不知道传媒传完,仍在接收
    //5.反馈
    OutputStream os=socket.getOutputStream();
    os.write("谢谢".getBytes());
    //6.资源的关闭
    fos.close();
    is.close();
    os.close();
    socket.close();
    ss.close();

}
  • 流的关闭部分偷懒了

UDP

@Test
public void test() throws IOException {
    DatagramSocket socket=new DatagramSocket();
    String str="我是。。。。";
    byte[] data=str.getBytes();
    InetAddress inet=InetAddress.getByName("127.0.0.1");
    DatagramPacket packet =new DatagramPacket(data,0,data.length,inet,8847);
    socket.send(packet);
    socket.close();
}
@Test
public void test1() throws IOException {
    DatagramSocket socket=new DatagramSocket(8847);
    byte[] buffer=new byte[100];
    DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
    socket.receive(packet);
    System.out.println(new String(packet.getData(),0,packet.getLength()));
    socket.close();
}

 

二者比较

一个还不错的链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冉卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值