网络编程

一、网络基础

1、计算机网络:把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规 模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、 共享硬件、软件、数据信息等资源

2、网络编程的目的:直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。

3、网络编程中有两个主要的问题:

       > 如何准确地定位网络上一台或多台主机;  ------>   IP 和 端口号

              > IP地址 : 唯一的标识Internet上的计算机,Java中使用InetAddress类代表IP

                     > 实例化InetAddress的两个方法: getByName(String host)  、 getLocalHost(String host)

                     > 两个常用方法: getHost()    /   getHostAddress()

InetAddress inet1 = InetAddress("192.168.1.1");//写IP地址

InetAddress inet2 = InetAddress("www.baidu.com");//写域名的方式

              > 端口号: 电脑上的可能有很多进程,不同的进程我们需要用不同的端口号去区分 (0 ~ 65535)

              > IP 和 端口号 组合成网络套接字 socket

       > 定位主机上的特定的应用 找到主机后如何可靠高效地进行数据传  ------>  提供网络协议: TCP/IP

二、网络通信协议

1、 TCP协议 :

       > 使用TCP协议之前,需要先建立TCP连接,形成数据传输通道

       > 传输前,采用三次握手,点对点通信,是可靠的

       > 可以进行大数据量的传输

       > 需要释放已建立的连接,占用资源高,效率低

2、UDP协议:

       > 使用UDP协议,不需要建立连接

       > 只管发送,不管对方是否接受

       > 可广播发送

       > 不需要释放资源,占用资源少,速度快

 

三、TCP编程

客户端发送一张图片,服务器接受图片,并返回信息给客户端,客户端进行接收,并将信息打印到控制台

package org.example.test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Test {

    @org.junit.Test
    public void browser() throws IOException {
        //设置要访问服务器的IP和端口号
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
        //获取socket的输出流,将图片发送给服务端
        OutputStream os = socket.getOutputStream();
        FileInputStream fis = new FileInputStream("beauty.jpg");

        byte[] buffer = new byte[1024];
        int len;
        while( ( len = fis.read(buffer) ) != -1 ) {
            os.write(buffer,0,len);
        }

        // 注意: 一定要关闭输出,不然服务器会一直等待接受客户端的信息
        socket.shutdownOutput();

        // 接受服务器的信息
        InputStream is = socket.getInputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer1 = new byte[1024];

        while( ( len = is.read(buffer1) ) != -1 ) {
            baos.write(buffer1,0,len);
        }

        System.out.println(baos.toString());

        fis.close();
        os.close();
        socket.close();
    }


    @org.junit.Test
    public void server() throws IOException {

        //设置服务器端口号
        ServerSocket ss = new ServerSocket(9090);
        //获取客户端发送的数据
        Socket socket = ss.accept();
        //保存数据
        InputStream is = socket.getInputStream();
        FileOutputStream fos = new FileOutputStream("beauty.jpg");
        byte[] buffer = new byte[1024];
        int len;

        while( ( len = is.read(buffer) ) != -1 ){
            fos.write(buffer,0,len);
        }

        //返回一条信息给客户端
        OutputStream os = socket.getOutputStream();
        os.write("图片收到了".getBytes());

        fos.close();
        is.close();
        socket.close();
        ss.close();

    }
}

四、UDP编程

发送端发送数据,接收端接收数据,并将信息打印到控制台

package org.example.test;

import org.junit.Test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Test2 {

    @Test
    public void send() throws IOException {
        //实例化DatagramSocket
        DatagramSocket socket = new DatagramSocket();
        //实例化一个数据包
        String str = "这是使用UDP发送的数据";
        byte[] data = str.getBytes();
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        DatagramPacket packet = new DatagramPacket(data, 0, data.length, inetAddress, 9090);

        socket.send(packet);

        socket.close();
    }

    @Test
    public void receive() throws IOException {
        DatagramSocket socket = new DatagramSocket(9090);

        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

        socket.receive(packet);
        System.out.println(new String(packet.getData(), 0, packet.getLength()));
        socket.close();
    }

}

五、URL编程

1、URL : 统一资源定位符,它表示Internet上某一资源的地址

        >  URL的基本结构由5部分组成: <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表 

从tomcat服务器中下载资源

package org.example.test;

import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class URLTest {

    @Test
    public void URL(){
        HttpURLConnection urlConnection = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            URL url = new URL("http://localhost:8080/examples/beauty.jpg");

            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.connect();

            is = urlConnection.getInputStream();
            fos = new FileOutputStream("beauty1.jpg");
            byte[] buffer = new byte[1024];
            int len;
            while( ( len = is.read(buffer) ) != -1 ) {
                fos.write(buffer,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值