网络编程~

网络通信三要素

在这里插入图片描述

在这里插入图片描述

IP地址

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

IP地址操作类-InetAddress

在这里插入图片描述
在这里插入图片描述

端口号

在这里插入图片描述
在这里插入图片描述

通信协议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

UDP通信

双方不用建立连接

一发一收

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多发多收

发送端

public class Sender {

    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket();
        DatagramPacket dp;
        Scanner s= new Scanner(System.in);
        while (true){
            String sendStrings = s.next();
            dp = new DatagramPacket(sendStrings.getBytes(), sendStrings.length(), InetAddress.getLocalHost(), 8888);
            ds.send(dp);
            if (sendStrings.equals("exit")){
                break;
            }
        }
    }
}

接收端

public class Receiver {
    public static void main(String[] args) throws Exception {
        DatagramSocket ds = new DatagramSocket(8888);
        byte[] buf = new byte[1024*64];
        DatagramPacket dp = new DatagramPacket(buf,buf.length);
        while (true){
            ds.receive(dp);
            String receiveStrings = new String(buf,0,dp.getLength(), StandardCharsets.UTF_8);
            if (receiveStrings.equals("exit")){
                break;
            }
            System.out.println(receiveStrings);
        }
    }
}

广播、组播

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCP通信

在这里插入图片描述
在这里插入图片描述

客户端

在这里插入图片描述
一个简单的客户端的实现

public class Net {
    public static void main(String[] args) throws Exception {
        //172.18.64.152
        Socket socket = new Socket("172.18.64.152",8888);
        //获得os流
        OutputStream os = socket.getOutputStream();
        //将os流包装成打印流
        PrintStream ps = new PrintStream(os);
        //通过打印流写数据到socket管道
        ps.println("hello");
        ps.flush();
    }
}

服务端

首先,要是使用ServerSocket类注册端口号
在这里插入图片描述
在这里插入图片描述

public class NetReciever {
    public static void main(String[] args) throws Exception{
        //注册端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //等待接收客户端Socket连接
        Socket socket = serverSocket.accept();
        //获得IS流is
        InputStream is =  socket.getInputStream();
        //将IS流包装成字符输入缓冲流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String msg;
        while ((msg = br.readLine())!=null){
            System.out.println(socket.getRemoteSocketAddress()+":"+msg);
        }
    }
}

TCP多发多收

在这里插入图片描述

public class NetSender {
    public static void main(String[] args) throws Exception {
        //172.18.64.152
        Socket socket = new Socket("172.18.64.152",8888);
        //获得os流
        OutputStream os = socket.getOutputStream();
        //将os流包装成打印流
        PrintStream ps = new PrintStream(os);
        //通过打印流写数据到socket管道
        Scanner s = new Scanner(System.in);
        String msg;
        while (true){
            if ((msg=s.next()).equals("exit")){
                break;
            }
            ps.println(msg);
            ps.flush();
        }
    }
}
public class NetReciever {
    public static void main(String[] args) throws Exception{
        //注册端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //等待接收客户端Socket连接
        Socket socket = serverSocket.accept();
        //获得IS流is
        InputStream is =  socket.getInputStream();
        //将IS流包装成字符输入缓冲流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String msg;
        while ((msg = br.readLine())!=null){
            System.out.println(socket.getRemoteSocketAddress()+":"+msg);
        }
    }
}

TCP同时接收多个客户端消息

在这里插入图片描述
服务器端实现

public class ThreadNetR {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true){
            Socket socket = serverSocket.accept();
            new MyThread(socket).start();
        }
    }
}

class MyThread extends Thread{
    private Socket socket;

    public MyThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run()  {
        try {
            //获得IS流is
            InputStream is =  socket.getInputStream();
            //将IS流包装成字符输入缓冲流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String msg;
            while ((msg = br.readLine())!=null){
                System.out.println(Thread.currentThread().getName()+socket.getRemoteSocketAddress()+":"+msg);
            }
        }catch (Exception e){
            System.out.println(socket.getRemoteSocketAddress()+"下线了");;
        }
    }
}
使用线程池优化

TCP即时通讯

在这里插入图片描述

public class NetReciever {
    public static ArrayList<Socket> socketArrayList = new ArrayList<>();
    public static void main(String[] args) throws Exception{

        ServerSocket serverSocket = new ServerSocket(8888);

        while (true){
            Socket socket = serverSocket.accept();
            System.out.println(socket.getRemoteSocketAddress()+"上线了");
            socketArrayList.add(socket);
            new Reciever(socket).start();
        }
    }
}

class Reciever extends Thread{
    private Socket socket;

    public Reciever(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is =  socket.getInputStream();

            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String msg;
            while ((msg = br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress()+":"+msg);
                for (Socket socket1:NetReciever.socketArrayList){
                    OutputStream os = socket1.getOutputStream();
                    PrintStream ps = new PrintStream(os);
                    ps.println(socket1.getRemoteSocketAddress()+":"+msg);
                    ps.flush();
                }
            }
        }catch (Exception e ){
            System.out.println(socket.getRemoteSocketAddress()+"下线了");
            NetReciever.socketArrayList.remove(socket); //下线后,清楚集合内的socket
        }
    }
}
public class NetSender {
    public static void main(String[] args) throws Exception {

//        ServerSocket serverSocket = new ServerSocket();
//        new Thread(new MyReciever(serverSocket.accept())).start();

        //172.18.64.152
        Socket socket = new Socket("172.18.64.152",8888);

        new MyReciever(socket).start();
        //获得os流
        OutputStream os = socket.getOutputStream();
        //将os流包装成打印流
        PrintStream ps = new PrintStream(os);
        //通过打印流写数据到socket管道
        Scanner s = new Scanner(System.in);
        String msg;
        while (true){
            if ((msg=s.next()).equals("exit")){
                break;
            }
            ps.println(msg);
            ps.flush();
        }
    }
}

class MyReciever extends Thread{

    private Socket socket;

    public MyReciever(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is =  socket.getInputStream();
            //将IS流包装成字符输入缓冲流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String msg;
            while ((msg = br.readLine())!=null){
                System.out.println(socket.getRemoteSocketAddress()+":"+msg);
            }

        }catch (Exception e){
            System.out.println("您下线了");
        }
    }
}

BS架构

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值