网络编程

基本知识

  • 计算机网络:由两台或更多计算机组成的网络
  • 互联网:连接网络的网络
  • TCP/IP协议泛指互联网协议,只有使用TCP/IP协议的计算机才能够联入互联网
  • IP地址分为IPv4和IPv6两种,有一个特殊的IP地址,称为本机地址(localhost),总是127.0.0.1
  • 域名:因为直接记忆IP地址非常困难,所以我们通常使用域名访问某个特定的服务
  • 网络模型(osi七层模型)

网络通信的要素

  • IP地址 和 端口
    1. IP地址:计算机的网络接口(通常是网卡)在网络中的唯一标识
    2. 端口:每个应用程序对应一个端口号
  • 网络协议:TCP协议 和 UDP协议
    1. TCP协议:一种面向连接,可靠传输的协议
    2. UDP协议:一种无连接,不可靠传输的协议

TCP

  • 服务器端:用ServerSocket监听指定端口
//服务器端
public class TcpServerDemo2 {
    public static void main(String[] args) throws IOException {
        //创建服务
        ServerSocket serverSocket = new ServerSocket(9000);
        //监听客户端的链接
        Socket socket = serverSocket.accept();
        //读取文件
        InputStream is = socket.getInputStream();
        //写出文件
        FileOutputStream fos = new FileOutputStream("receive.png");
        int len;
        while ((len = is.read()) != -1) {
            fos.write(len);
        }
        //关闭资源
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}
  • 客户端 :用Socket(InetAddress, port)连接服务器
//客户端
public class TcpClientDemo2 {
    public static void main(String[] args) throws IOException {
        //创建一个Socket链接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9000);
        //创建一个输出流
        OutputStream os = socket.getOutputStream();
        //读取文件
        FileInputStream fis = new FileInputStream(new File("lol.png"));
        //写出文件
        int len;
        while ((len = fis.read()) != -1) {
            os.write(len);
        }
        //关闭资源
        fis.close();
        os.close();
        socket.close();
    }
}

UDP

public class UdpServer {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket socket = new DatagramSocket(8090);
        //接受数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData(),0,packet.getData().length));
        //关闭连接
        socket.close();
    }
}
public class UdpClient {
    public static void main(String[] args) throws Exception {
        //建立一个socket
        DatagramSocket socket = new DatagramSocket();
        //建包
        String msg = "上善若水,水善利万物而不争!";
        InetAddress IP = InetAddress.getByName("localhost");
        int port = 8090;
          //参数(数据,数据的起始、长度,发送的地址)
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,
                msg.getBytes().length,IP,8090);
        //发送包
        socket.send(packet);
        //关闭资源
        socket.close();
    }
}