首页 > 技术文章 > java 网络编程学习笔记

shijunzhang 2015-10-07 00:23 原文

1.IP地址

IP地址组成:网络号段+主机号段

IP地址分类:

A类:第一号段为网络号段+后三段的主机号段

1.0.0.1---127.255.255.254(10.x.x.x是私有地址)

一个网络号可分配256*256*256个IP

B类:前二号段为网络号段+后二段的主机号段

128.0.0.1---191.255.255.254(172.16.0.0---172.31.255.255是私有地址)

一个网络号可分配256*256个IP

C类:前三号段为网络号段+后一段的主机号段(常用)

192.0.0.1---223.255.255.254(192.168.x.x是私有地址)

一个网络号可分配256个IP

D类:保留地址

224.0.0.1---239.255.255.254

E类:保留地址

240.0.0.1---247.255.255.254

特殊IP地址:

127.0.0.1:回环地址,表示本机

x.x.x.255:广播地址

x.x.x.0:网络地址

 2.端口(逻辑端口)

每个网络程序都至少有一个逻辑端口

用于标识进程的逻辑地址,不同进程的标识

有效端口:0--65535,其中0--1024为系统使用或保留端口

3.协议

UPD:把数据打包,数据有限制,不建立连接,速度快,不可靠

TCP:建立连接通道,数据无限制,速度慢,可靠

4.Socket:网络套接字,包含了IP地址+端口号

通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输

5.UDP协议发送接收数据

public class SendDemo {
    public static void main(String[] args) throws Exception {
        //1.创建UDP协议发送端Socket对象
        DatagramSocket ds = new DatagramSocket();

        //2.创建数据,并把数据打包
        byte[] bytes = "Hello World".getBytes();//创建要发送的数据
        int length = bytes.length;
        //创建要发送的Ip地址对象
        InetAddress address = InetAddress.getByName("127.0.0.1");
        //设置端口(1024以上)
        int port = 10110;
        //public DatagramPacket(byte buf[], int length,InetAddress address, int port)
        DatagramPacket dp = new DatagramPacket(bytes, length, address, port);

        //3.调用Socket对象的发送方法发送数据包,public void send(DatagramPacket p)
        ds.send(dp);

        //4.释放资源
        ds.close();
    }
}
public class ReceiveDemo {
    public static void main(String[] args) throws Exception {
        //1.创建UDP协议接收端Socket对象,端口号与发送端一致
        DatagramSocket ds = new DatagramSocket(10110);

        //2.创建一个数据包(接收容器)
        byte[] bytes = new byte[1024];
        int length = bytes.length;
        DatagramPacket dp = new DatagramPacket(bytes, length);

        //3.调用Socket对象的接收方法接收数据包
        ds.receive(dp);

        //4.解析数据包
        String ip = dp.getAddress().getHostAddress();//获取发送端的IP
        byte[] bytes1 = dp.getData();//获取数据缓冲区
        int length1 = dp.getLength();//获取数据实际长度
        String str = new String(bytes1, 0, length1);
        System.out.println(ip + ":" + str);//接收到的数据显示在控制台

        //5.释放资源
        ds.close();
    }
}

6.TCP协议发送接收数据

public class ClientDemo {
    public static void main(String[] args) throws IOException {

        //1.创建发送端的Socket对象,设置访问的IP和端口
        Socket s = new Socket(InetAddress.getByName("127.0.0.1"), 8888);

        //2.获取通道内的输出流,写数据
        OutputStream os = s.getOutputStream();
        os.write("Hello World".getBytes());
        s.shutdownOutput();//写数据完成,服务端不用在等待

        //3.获取输入流,读取返回结果
        InputStream is = s.getInputStream();
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        String str = new String(bytes, 0, len);
        System.out.println("返回结果:" + str);

        //4.释放资源
        s.close();
    }
}
public class ServerDemo {
    public static void main(String[] args) throws IOException {

        //1.创建接收端的Socket对象
        ServerSocket ss = new ServerSocket(8888);

        while (true) {
            //2.监听客户端连接,返回一个对应的Socket对象
            Socket s = ss.accept();

            new Thread(new ClientThread(s)).start();
        }
    }
}
public class ClientThread implements Runnable {

    private Socket s;

    public ClientThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {

        try {
            //3.获取输入流,读取数据显示在控制台
            InputStream is = null;
            is = s.getInputStream();
            byte[] bytes = new byte[1024];
            int len = is.read(bytes);
            String str = new String(bytes, 0, len);
            String ip = s.getInetAddress().getHostAddress();//获取客户端IP地址
            System.out.println(ip + ":" + str);

            //4.获取输出流,写入返回结果
            OutputStream os = s.getOutputStream();
            os.write("数据已收到".getBytes());
            //5.释放资源
            s.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

推荐阅读