java网络编程

一、什么是网络编程

计算机网络:地理位置不同的多台计算机通过某种协议连接起来,实现资源共享和信息传递。

网络编程目的:传递交流信息、数据交换、通信

需要干啥:

1、如何定位一台主机IP:端口,定位到这个计算机上某种资源?

2、找到这个主机,如何传输数据呢?

javaweb:网页编程 ,B/S

网络编程 TCP/UDP,C/S

二、网络通信要素

如何实现网络通信?

通信双方地址:

  • ip
  • 端口号

规则:网络通信协议

TCP/IP参考模型

三、IP

IP地址:InetAdress

唯一定位一台网络上的计算机

127.0.0.1:本机,localhost

  • IP地址分类:
  • ipv4/ipv6
  • 公网(互联网)/私网(局域网)
    • ABCD类
    • 192.168.xxx.xxx 专门给组织内部使用
  • 域名:记忆IP www.baidu.com

四、端口

端口 InetSocetAdress

表示计算机上一个程序的进程:

不同进程有不同端口,用来区分软件

被规定0~65535

TCP/UDP,65536*2,tcp:80,udp:80。单个协议下端口号不能冲突

端口分类

  • 公有端口 0~1023
  • HTTP:80
  • HTTPS:443
  • Telnet:23
  • 程序注册端口:1024~49151
    • Tomcat:8080
    • MySQL:3306
    • Oracle:1521
  • 动态、私有端口:49152~65535

netstat -ano #查看所有端口

netstat -ano|findstr "5900" #查看指定端口

tasklist|finder "8696" #查看指定端口进程

Ctrl+Shift+Esc

五、通信协议

协议:约定

TCP UDP对比

TCP:打电话

  • 连接、稳定
  • 三次握手,四次挥手
  • 客户端、服务端
  • 传输完成,释放连接,效率低

UDP

  • 不连接,不稳定
  • 客户端、服务端:没有明确界限
  • 不管有没有准备好,都发给对方

六、TCP

客户端

1、连接服务器 Socket

2、发送消息

package com.yans.java.net;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;

public class TcpClient {
    public static void main(String[] args) {

        OutputStream os = null;
        Socket socket = null;
        try {
            //1.要知道服务器地址、端口
            InetAddress serverIp = InetAddress.getByName("127.0.0.1");
            int port = 9999; //端口

            //创建一个socket连接
            socket = new Socket(serverIp, port);

            //发送消息 IO流
            os = socket.getOutputStream();
            os.write("你好,我是客户端".getBytes());


        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭连接
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

服务端 

1、建立服务的端口 SserverSocket

2、等待用户连接 accept

3、接受用户的消息

package com.yans.java.net;

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

public class TcpServer {
    public static void main(String[] args) {

        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream bos = null;

        try {
            //1、要创建服务器地址、端口
            serverSocket = new ServerSocket(9999);

            //扥扥的客户端连接
            socket = serverSocket.accept();

            //读取客户端信息
            is = socket.getInputStream();

            //管道流
            bos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len= is.read(buffer)) != -1) {
                bos.write(buffer, 0, len);
            }
            System.out.println(bos.toString());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭连接,先关后进来的
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

    }
}

使用Tomcat 服务端 

七、UDP

1、建立Socket

2、建个包

3、发送包

package com.yans.java.net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

//不需连接服务端
public class UdpClientDemo {
    public static void main(String[] args) throws Exception {
        //1、建立Socket
        DatagramSocket datagramSocket = new DatagramSocket();

        // 2、建个包
        //发送对象
        String msg = "你好哈";
        InetAddress loclhost = InetAddress.getByName("localhost");
        int port = 9090;

        //建包: 数据,数据长度起始,发送对象
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, loclhost, port);

        //3、发送包
        datagramSocket.send(packet);

        //4、关闭流
    }
}

定义一个用来接受UDP信息的服务端:

package com.yans.java.net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

//还是要等客户端连接
public class UdpServerDemo {
    public static void main(String[] args) throws Exception {
        //开放端口
        DatagramSocket socket = new DatagramSocket(9090);
        //接受数据包
        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.getLength()));

        //关闭连接
        socket.close();
    }
}

实例:多线程实现简单聊天室

package com.yans.java.net.chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class TalkSend implements Runnable{
    //1、建立Socket
    private DatagramSocket datagramSocket = null;

    //准备数据,控制台读取System.in
    BufferedReader br = null;

    //端口
    private int fromPort;
    private String toIP;
    private int toPort;

    public TalkSend(int fromPort, String toIP, int toPort) {
        this.fromPort = fromPort;
        this.toIP = toIP;
        this.toPort = toPort;

        try {
            //1、建立Socket
            datagramSocket = new DatagramSocket(fromPort);
            //读取控制台输入数据
            br = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                String readline = br.readLine();
                byte[] buffer = readline.getBytes(); //读取信息

                //建包: 数据,数据长度起始,发送对象
                DatagramPacket packet = new DatagramPacket(buffer, 0,buffer.length, new InetSocketAddress(this.toIP, this.toPort));

                //发送包
                datagramSocket.send(packet);

                if (buffer.equals("bye")) {
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        //关闭流
        datagramSocket.close();
    }
}
package com.yans.java.net.chat;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkReceive implements Runnable{
    //开放端口
    DatagramSocket socket = null;

    private int port;
    private String name;

    public TalkReceive(int port, String name) {
        this.port = port;
        this.name = name;
        try {
            socket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                //接受数据包
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer, 0 ,buffer.length);

                //阻塞接收
                socket.receive(packet);

                //获取数据
                byte[] data = packet.getData();
                String recieveData = new String(data, 0, data.length);
                System.out.println(name + ":" + recieveData);

                //断开连接 bye
                if (recieveData.equals("bye")) {
                    break;
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        //关闭连接
        socket.close();
    }
}
package com.yans.java.net.chat;

public class TalkStudent {
    public static void main(String[] args) {
        new Thread(new TalkSend(7777, "localhost", 9999)).start();
        new Thread(new TalkReceive(8888, "老师")).start();
    }
}
package com.yans.java.net.chat;

public class TalkTeacher {
    public static void main(String[] args) {
        new Thread(new TalkSend(5555, "localhost", 8888)).start();
        new Thread(new TalkReceive(9999, "学生")).start();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值