Java基础 网络编程概述

1.什么是网络编程

网络通信三要素 

2.InetAddress类:

package day1_ip;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class IpTest {
    public static void main(String[] args) throws IOException {
        //获取本机IP地址对象
        InetAddress ip1 = InetAddress.getLocalHost();
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());
        //获取指定IP或者域名的IP地址对象
        InetAddress ip2 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip2.getHostName());
        System.out.println(ip2.getHostAddress());
        //ping www.baidu.com
        System.out.println(ip2.isReachable(6000));

    }

}

3.端口号:

协议: 

 1.DatagramSocket:创建客户端,服务端

1.1udp快速入门: 单发单收

 

 client.java:

package day1_ip;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;

public class Client {

    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();

        byte[] bytes = "我是wwx客户端".getBytes(StandardCharsets.UTF_8);
/*
DatagramPacket(byte buf[], int offset, int length,
                          InetAddress address, int port)
                          参数1:封装要发出去的数据
                          参数2:发送出去的数据大小(字节个数)
                          参数3:服务器的IP地址(找到服务端主机)
                          参数4:服务端程序的端口
 */

        DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
                InetAddress.getLocalHost(), 7777);
        socket.send(packet);
        System.out.println("客户端发送完毕");

        socket.close();
    }
}

server.java

package day1_ip;

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

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

        System.out.println("服务端启动");

        DatagramSocket socket = new DatagramSocket(7777);

        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        socket.receive(packet);

        int packetLength = packet.getLength();

        String recievestring = new String(buffer, 0, packetLength);

        System.out.println(recievestring);

        socket.close();
    }
}

 2.多发多收:

先设置:设置完成后,才能启动多个客户端

Client.java:

package day1_ip;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws Exception {
       //创建客户端对象,别指定端口,让系统自动分配端口,才不会导致端口冲突
        DatagramSocket socket = new DatagramSocket();

/*
DatagramPacket(byte buf[], int offset, int length,
                          InetAddress address, int port)
                          参数1:封装要发出去的数据
                          参数2:发送出去的数据大小(字节个数)
                          参数3:服务器的IP地址(找到服务端主机)
                          参数4:服务端程序的端口
 */
//创建数据包对象封装要发出去的数据
        Scanner sc = new Scanner(System.in);
        while (true) {

            System.out.println("欢迎来到聊天室");
            String s = sc.nextLine();
        //    byte[] bytes = s.getBytes(s);

            if("exit".equals(s)){
                System.out.println("退出成功");
                socket.close();
                break;
            }
            byte[] bytes = s.getBytes();
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
                    InetAddress.getLocalHost(), 6666);

            socket.send(packet);
            System.out.println("客户端发送完毕");


        }
    }
}

Server.java:

package day1_ip;

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

public class Server {
    public static void main(String[] args) throws Exception {

        System.out.println("服务端启动");
        //创建一个服务端对象
        DatagramSocket socket = new DatagramSocket(6666);
        //创建一个数据包对象,用于接收数据
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        while (true) {
            //开始正式使用数据包接收客户端发来的数据
            socket.receive(packet);
            //从字节数组中,把接收到的数据打印出来
            int packetLength = packet.getLength();

            String recievestring = new String(buffer, 0, packetLength);

            System.out.println(recievestring);
            System.out.println("**********************************");
           // socket.close();  //服务端不要关闭资源
        }
    }
}

Tcp :

tcp快速入门:单收单发

Client.java

package day_tcp;

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

public class Client {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8888);

        //从socket通信管道中得到一个字节输出流,发给服务端程序
        OutputStream os = socket.getOutputStream();
        //把低级字节输出流包装成数据输出流
        DataOutputStream dataOutputStream = new DataOutputStream(os);
        dataOutputStream.writeUTF("哈哈哈哈");
        dataOutputStream.close();
        socket.close();
    }
}

server.java

package day_tcp;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class Server {

    public static void main(String[] args) throws IOException {
        System.out.println("*****服务端启动*****");
        //1,创建ServerSocket的对象,同时为服务注册端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //2,使用serverSocket对象,调用一个accept方法,等待客户端的链接请求
        Socket socket = serverSocket.accept();
        //3,从socket通信管道中得到一个字节输入流
        InputStream inputStream = socket.getInputStream();
        //4,把原始字节输入流包装成数据输入流
        DataInputStream dataInputStream = new DataInputStream(inputStream);
        //5,用数据输入流读取客户端发送的消息
        String s = dataInputStream.readUTF();
        System.out.println(s);

        //获取客户端ip地址
        System.out.println(socket.getRemoteSocketAddress());

        socket.close();
    }
}

 运行效果:

 

tcp通信:多发多收(单服务端,单客户端)

Client.java

package day_tcp;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws IOException {
        System.out.println("欢迎来到聊天室内");

        Socket socket = new Socket("127.0.0.1", 8888);

        //从socket通信管道中得到一个字节输出流,发给服务端程序
        OutputStream os = socket.getOutputStream();
        //把低级字节输出流包装成数据输出流
        DataOutputStream dataOutputStream = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);
        while (true) {
            String s = sc.nextLine();

            if ("exit".equals(s)){
                System.out.println("恭喜您退出成功!欢迎下次光临");
                dataOutputStream.close();
                socket.close();
                break;
            }

            dataOutputStream.writeUTF(s);
            dataOutputStream.flush();

        }

        //dataOutputStream.close();

       // socket.close();
    }
}

server.java

package day_tcp;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class Server {

    public static void main(String[] args) throws IOException {
        System.out.println("*****服务端启动*****");
        //1,创建ServerSocket的对象,同时为服务注册端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //2,使用serverSocket对象,调用一个accept方法,等待客户端的链接请求
        Socket socket = serverSocket.accept();
        //3,从socket通信管道中得到一个字节输入流
        InputStream inputStream = socket.getInputStream();
        //4,把原始字节输入流包装成数据输入流
        DataInputStream dataInputStream = new DataInputStream(inputStream);
        //5,用数据输入流读取客户端发送的消息

        while (true) {
            try {
                String s = dataInputStream.readUTF();
                System.out.println(s);
            } catch (Exception e) {
                System.out.println(socket.getRemoteSocketAddress()+"下线了");
                socket.close();
                dataInputStream.close();
                break;
            }
        }

        //获取客户端ip地址
        // System.out.println(socket.getRemoteSocketAddress());

        //socket.close();
    }
}

运行效果:

tcp通信:多发多收(多客户端)

Client1.java

package day_tcp2;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client1 {

    public static void main(String[] args) throws IOException {
        System.out.println("欢迎来到聊天室内");

        Socket socket = new Socket("127.0.0.1", 8888);

        //从socket通信管道中得到一个字节输出流,发给服务端程序
        OutputStream os = socket.getOutputStream();
        //把低级字节输出流包装成数据输出流
        DataOutputStream dataOutputStream = new DataOutputStream(os);

        Scanner sc = new Scanner(System.in);
        while (true) {
            String s = sc.nextLine();

            if ("exit".equals(s)){
                System.out.println("恭喜您退出成功!欢迎下次光临");
                dataOutputStream.close();
                socket.close();
                break;
            }

            dataOutputStream.writeUTF(s);
            dataOutputStream.flush();

        }

        //dataOutputStream.close();

       // socket.close();
    }
}

Server.java

package day_tcp2;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    public static void main(String[] args) throws Exception {
        System.out.println("*****服务端启动*****");

        //1,创建ServerSocket的对象,同时为服务注册端口
        ServerSocket serverSocket = new ServerSocket(8888);


        while (true) {
            //2,使用serverSocket对象,调用一个accept方法,等待客户端的链接请求
            Socket socket = serverSocket.accept();
            //把这个客户端对于的socket通信管道,交给一个独立的进程负责处理
            new ServerReadThread(socket).start();

            System.out.println(socket.getRemoteSocketAddress() + "上线了");

        }

    }
}

ServerReadThread.java

package day_tcp2;

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

public class ServerReadThread extends Thread {


    private Socket socket;

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


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

            DataInputStream dis = new DataInputStream(is);

            while (true) {
                try {
                    String msg = dis.readUTF();
                    System.out.println(msg);
                } catch (Exception e) {
                    System.out.println(socket.getRemoteSocketAddress() + "下线了");
                    dis.close();
                    socket.close();
                    break;
                }
            }

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

    }
}

运行效果 

tcp通信:群聊 (B/S)架构

tcp通信:线程池优化群聊 (B/S)架构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值