专栏首页Fdu弟中弟java-网络编程

java-网络编程


网络编程本质还是在处理IO流上。

InetAddress类

这个类主要用来表示IP地址,有两个子类:Inet4Address和Inet6Address

import java.net.InetAddress;

public class InetAddressDemo {
    public static void main(String[] args) throws Exception{
        InetAddress locAdd = InetAddress.getLocalHost();
        InetAddress remAdd = InetAddress.getByName("luxuantao.github.io");
        System.out.println("本机IP地址"+locAdd.getHostAddress());
        System.out.println("我的博客的IP地址"+remAdd.getHostAddress());
        System.out.println("本机是否可达"+locAdd.isReachable(5000));
    }
}

URL类

import java.net.URL;

//URL类的基本方法
public class ParseURL {
    public static void main(String[] args) throws Exception{
        URL Aurl = new URL("http://java.sun.com:80/docs/books/"); //基地址
        URL tuto = new URL(Aurl,"tutorial.intro.html#DOWNLOADING"); //相对地址
        System.out.println("协议信息"+tuto.getProtocol());
        System.out.println("地址"+tuto.getHost());
        System.out.println("文件名"+tuto.getFile());
        System.out.println("端口"+tuto.getPort());
        System.out.println("引用信息"+tuto.getRef());
        System.out.println("查询信息"+tuto.getQuery());
        System.out.println("路径"+tuto.getPath());
        System.out.println("用户信息"+tuto.getUserInfo());
        System.out.println("权限信息"+tuto.getAuthority());
    }
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

//从URL读取网络资源
public class URLReader {
    public static void main(String[] args) throws Exception {
        URL tire = new URL("https://luxuantao.github.io/");
        BufferedReader in = new BufferedReader(new InputStreamReader(tire.openStream()));
        String inputLine;
        while((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
        }
        in.close();
    }
}

URLConnection类

URL是单向的,而URLConnection是双向的,可以通过它对URL资源读或写。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

//与指定URL建立动态链接,可向服务器发送请求
public class URLConnectionDemo {
    public static void main(String[] args) throws Exception{
        URL url = new URL("http://www.mldnjava.cn");
        URLConnection urlCon = url.openConnection(); //建立连接
        System.out.println("内容大小"+urlCon.getContentLength());
        System.out.println("内容类型"+urlCon.getContentType());
        BufferedReader in = new BufferedReader(new 		InputStreamReader((urlCon.getInputStream())));
        String inputline;
        while ((inputline = in.readLine()) != null) {
            System.out.println(inputline);
        }
        in.close();
    }
}

服务端与客户端简单交互

单向传输(服务端给客户端)

示例:服务端传输helloworld给客户端。

客户端代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class HelloClient {
    public static void main(String[] args) throws UnknownHostException, IOException{
        Socket client = new Socket("localhost",8888);
        BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String context = br.readLine();
        System.out.println("当前服务端输出的语句是:"+context);
        br.close();
        client.close();
    }
}

服务端代码:

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class HelloServer {
    public static void main(String[] args) throws IOException{
        ServerSocket server = new ServerSocket(8888);
        System.out.println("服务器运行,等待客户端连接");
        Socket client = server.accept();
        OutputStream out = client.getOutputStream();
        PrintWriter pw =new PrintWriter(out);
        pw.println("hello world!");
        pw.close();
        client.close();
        server.close();
    }
}

一对一TCP传输(单个服务端和单个客户端)

示例:客户端发送半径给服务端,服务端算出圆的面积后把结果返回给客户端。

客户端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.rmi.UnknownHostException;
import java.util.Scanner;

public class RadiusClient {
    public static void main(String[] args) throws UnknownHostException, IOException{
        Socket client = new Socket("localhost",8888);
        Scanner sc = new Scanner(System.in);
        DataInputStream fromServer = new DataInputStream(client.getInputStream());
        DataOutputStream toServer = new DataOutputStream(client.getOutputStream());
        while (true) {
            System.out.println("请输入半径:");
            double radius = sc.nextDouble();
            toServer.writeDouble(radius);
            toServer.flush();
            double area = fromServer.readDouble();
            System.out.println("客户端:输入的半径是:"+radius);
            System.out.println("客户端:收到的圆的面积是:"+area);
        }
    }
}

服务端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class RadiusServer {
    public static void main(String[] args) throws IOException{
        ServerSocket server = new ServerSocket(8888);
        System.out.println("服务器启动成功,时间是"+new Date());
        Socket client = server.accept();
        DataInputStream inputFromClient = new DataInputStream(client.getInputStream());
        DataOutputStream outputToClient = new DataOutputStream(client.getOutputStream());
        while(true) {
            double radius = inputFromClient.readDouble();
            double area = radius*radius*Math.PI;
            System.out.println("服务端:接受到客户端半径为:"+radius);
            System.out.println("服务端:计算面积为:"+area);
            outputToClient.writeDouble(area);
        }
    }
}

一对多TCP传输(单个服务端和多个客户端)

当多个客户端同时对服务器发送请求时,上面的方法就不行了(在IDE上的表现就是多次启动了客户端程序,这时只有第一个客户端程序能够成功连接上服务端)。

不过,可以通过多线程解决这个问题。

客户端代码:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.rmi.UnknownHostException;
import java.util.Scanner;

public class RadiusClient {
    public static void main(String[] args) throws UnknownHostException, IOException{
        Socket client = new Socket("localhost",8888);
        Scanner sc = new Scanner(System.in);
        DataInputStream fromServer = new DataInputStream(client.getInputStream());
        DataOutputStream toServer = new DataOutputStream(client.getOutputStream());
        while (true) {
            System.out.println("请输入半径:");
            double radius = sc.nextDouble();
            toServer.writeDouble(radius);
            toServer.flush();
            double area = fromServer.readDouble();
            System.out.println("客户端:输入的半径是:"+radius);
            System.out.println("客户端:收到的圆的面积是:"+area);
        }
    }
}

服务端代码:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class RadiusServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8888);
        System.out.println("服务器启动成功,时间是"+new Date());
        while(true) {
            Socket client = server.accept();
            Thread thread = new Thread(new AreaRunnable(client)); //多创建一个线程回应请求
            thread.start();
        }
    }
}

AreaRunnable类(处理每个线程):

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class AreaRunnable implements Runnable {
    private Socket client;
    public AreaRunnable(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {
        try {
            DataInputStream inputFromClient = new DataInputStream(client.getInputStream());
            DataOutputStream outputToClient = new DataOutputStream(client.getOutputStream());
            while (true) {
                double radius = inputFromClient.readDouble();
                double area = radius * radius * Math.PI;
                System.out.println("服务端:接受到客户端半径为:" + radius);
                System.out.println("服务端:计算面积为:" + area);
                outputToClient.writeDouble(area);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上这些内容基本上都属于TCP(要先进行服务端与客户端的连接),而实际上现在用的更多的是UDP(非连接,直接发送数据包),今后有空再研究了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java网络编程

    网络IO会涉及到同步,异步,阻塞,非阻塞等几个概念。一个网络IO读取过程是数据从 网卡 到 内核缓冲区 到 用户内存 的过程。同步和异步区别在于数据从内核到用户...

    春哥大魔王
  • Java网络编程

    ip:全称为:互联网协议地址,也称IP地址,是分配给上网设备的数字标签,常见的IP分类为:ipv4和ipv6

    乐心湖
  • Java 网络编程

    黑白格
  • Java 网络编程

    Java 中网络编程接口在java.net 包中 在使用C/C++进行网络编程时,针对TCP Server端需要这些操作

    Masimaro
  • Java---网络编程(1)

    1、计算机网络与Internet 2、TCP/IP协议 3、Internet地址 - - -IP地址,形如xxx.xxx.xxx.xxx - -...

    谙忆
  • Java网络编程--InetAdress类

    听着music睡
  • 【java网络】编程基础

    Java 网络编程 基于套接字的通信可以使程序通过指定的套接字进行通信。套接字是两个主机之间逻辑链接的端点,可以用于发送和接收数据,Java对套接字的处理非常类...

    程序员互动联盟
  • 初识Java网络编程

      事实上网络编程简单的理解就是两台计算机相互通讯数据而已,对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了,Java SDK提供一些...

    I Tech You_我教你
  • Java---网络编程(2)-UDP

    ☆ UDP 将数据及源和目的封装成数据包中,不需要建立连接 每个数据报的大小在限制在64k内 因无连接,是不可靠协议 不需要建立连接,速度快

    谙忆

扫码关注云+社区

领取腾讯云代金券