Java基础——网络编程(一)

一、IP地址-InetAddress类

1.文档

链接:http://blog.fondme.cn:8000/apidoc/jdk-1.8-google/

2.实例

//获取本机IP和计算机名
System.out.println(InetAddress.getLocalHost().getHostAddress());
System.out.println(InetAddress.getLocalHost().getHostName());
//获取远程IP地址,通过Name
System.out.println(InetAddress.getByName("www.baidu.com").getHostAddress());
System.out.println(InetAddress.getByName("www.jd.com").getHostAddress());

二、Socket

Socket就是为网络服务提供的一种机制。通信的两端都有Socket,一个网络服务端点。网络通信其实就是Socket之间的通讯。而数据在两个Socket之间通过IO传输。

1.UDP,DatagramSocket类

1.1.UDP发送端

步骤:

  • 建立udp的socket服务。
  • 将要发送的数据封装到数据包中
  • 通过udp的socket服务将数据包发送出去
  • 关闭socket服务
//1,udpsocket服务。使用DatagramSocket对象。
DatagramSocket ds = new DatagramSocket(8888);
		
//2,将要发送的数据封装到数据包中。
String str = "udp传输演示:哥们来了!";
    //使用DatagramPacket将数据封装到的该对象包中。
byte[] buf = str.getBytes();
		
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.100"),10000);
		
//3,通过udp的socket服务将数据包发送出去。使用send方法。
ds.send(dp);
		
//4,关闭资源。
ds.close();

1.2.UDP接收端

步骤

  • 建立UDP。socket服务,因为是要接收数据,必须要明确一个端口号。
  • 创建数据包。数据包用于存储接收到的数据,以便用数据包对象的方法解析这些数据.
  • 使用socket服务的receive方法将接收的数据存储到数据包中。
  • 通过数据包的方法解析数据包中的数据。
  • 关闭资源
//1,建立udp socket服务。
DatagramSocket ds = new DatagramSocket(10000);
	
//2,创建数据包。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
		
//3,使用接收方法将数据存储到数据包中。
ds.receive(dp);//阻塞式的。
		
//4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String text = new String(dp.getData(),0,dp.getLength());
		
System.out.println(ip+":"+port+":"+text);
		
//5,关闭资源。
ds.close();

2.TCP-Socket和ServerSocket

2.1.客户端Socket

客户端发送数据到服务端的步骤:

  1. 创建tcp客户端socket服务。使用的是socket对象。建议一建立就明确目的地进行连接。
  2. 如果连接建立成功,就说明数据传输通道已建立。这个链接称为Socket流,是底层建立好的。既然是流,说明这里既有输入又有输出。想要输入或者输出流对象,可以找socket来获取。API里查到getOutputStream和getInputStream两个方法来获取资源;
  3. 使用输出流(输出到服务端),将数据写出。
  4. 关闭资源。

2.2.服务端ServerSocket

服务端接收数据的步骤:

  1. 创建服务端socket服务。通过ServerSocket对象。
  2. 服务端必须对外提供一个端口,否则客户端无法连接。
  3. 获取链接过来的客户端对象。
  4. 通过客户端对象获取socket流读取客户端发来的数据。
  5. 并关闭资源。关客户端。关服务端。

用一个例子来对步骤进行说明: 

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

public class ConvertClientOfTCP {
    /**
     * 建立客户端
     * 将键盘录入信息输入到客户端输出流
     * 接收客户端返回的数据到控制台
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //建立客户端
        Socket client = new Socket("localhost",22222);
        //新建流
        PrintStream printOut = new PrintStream(client.getOutputStream());
        BufferedReader buffKey = new BufferedReader(new InputStreamReader(System.in));//键盘录入
        BufferedReader buffIn = new BufferedReader(new InputStreamReader(client.getInputStream()));

        //开始操作
        String line = null;
        while((line = buffKey.readLine())!=null){
            if(line.equals("over")) break;
            printOut.println(line);
            System.out.println(buffIn.readLine());//注意点
        }

        client.close();
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ConvertServerOfTCP {
    /**
     * 接收客户端发来的数据
     * 将数据显示在自己的控制台并转换为大写发送回客户端
     * 关闭资源
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //建立服务器
        ServerSocket server = new ServerSocket(22222);
        //接收客户端
        Socket client = server.accept();
        String clientIP = client.getInetAddress().getHostAddress();
        System.out.println(clientIP+"已登入");
        //新建输入流:从字节流到字符流
        BufferedReader buffIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
        //新建输出流:从字符流转回字节流发给客户端,用printStream
        PrintStream printOut = new PrintStream(client.getOutputStream(), true);

        //开始操作
        String line = null;
        while((line = buffIn.readLine())!=null){
            //先打印到自己屏幕
            System.out.println(line);
            //输出到客户端
            printOut.println(line.toUpperCase());
        }
        System.out.println("服务端已结束");
        //关闭资源

    }
}

上面的例子是单客户端模式的样子,那么多客户端该怎么实现?这时就要使用多线程来实现。以下是修改后的实例:

服务端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ConvertServerOfTCP {
    /**
     * 接收客户端发来的数据
     * 将数据显示在自己的控制台并转换为大写发送回客户端
     * 关闭资源
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //建立服务器
        ServerSocket server = new ServerSocket(22222);
        while (true) {
            //接收客户端
            Socket client = server.accept();
            //新建线程
            new Thread(new Converter(client)).start();

        }
    }
}

class Converter implements Runnable{

    private final Socket client;

    public Converter(Socket client){
        this.client = client;
    }
    @Override
    public void run() {
        try {
            converty(client);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void converty(Socket client) throws IOException {
        String clientIP = client.getInetAddress().getHostAddress();
        System.out.println(clientIP+"已登入");
        //新建输入流:从字节流到字符流
        BufferedReader buffIn = new BufferedReader(new InputStreamReader(client.getInputStream()));
        //新建输出流:从字符流转回字节流发给客户端,用printStream
        PrintStream printOut = new PrintStream(client.getOutputStream(), true);

        //开始操作
        String line = null;
        while((line = buffIn.readLine())!=null){
            //先打印到自己屏幕
            System.out.println(line);
            //输出到客户端
            printOut.println(line.toUpperCase());
        }
    }
}

客户端:

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

public class ConvertClientOfTCP {
    /**
     * 建立客户端
     * 将键盘录入信息输入到客户端输出流
     * 接收客户端返回的数据到控制台
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        //建立客户端
        Socket client = new Socket("localhost",22222);
        //新建流
        PrintStream printOut = new PrintStream(client.getOutputStream());
        BufferedReader buffKey = new BufferedReader(new InputStreamReader(System.in));//键盘录入
        BufferedReader buffIn = new BufferedReader(new InputStreamReader(client.getInputStream()));

        //开始操作
        String line = null;
        while((line = buffKey.readLine())!=null){
            if(line.equals("over")) break;
            printOut.println(line);
            System.out.println(buffIn.readLine());//注意点
        }

        client.close();
    }
}

 

你可能感兴趣的:(Java基础学习)