• JAVA Socket基础(简单实现)


    学习Socket需要了解的几个概念:

    Socket 指的是互联网连接中的各个终结点。互联网连接是怎么创建的,通过IP地址加端口号,进行互通。

    A电脑(192.168.3.125:80)》》》》B电脑(192.168.3.111:80)   那么这一个个的Ip地址+端口号就是一个Socket(套接字。)

    Http协议:两台互联网的通讯需要遵守统一的应用层协议,通常指Http协议。应用层协议还有FTP协议,SMPT简单邮件协议等。

    底层协议:IP/TCP协议。除了http需要遵守,还需要遵守IP/TCP协议。

    URL: 应用层协议+IP地址+端口号+资源路径    例如  http://www.baidu.com/index.html;   (http协议默认遵守的端口号为80)    文件传输默认为21    远程登录Telnet 23

    Java中提供的支持Socket操作的几个常用类:

    InetAddress :就是表示IP地址啦,没有构造函数。可以用过静态方法InetAddress.getLocalhost()等方法来或者本机的InetAddress对象。toString方法就是打印IP地址。其他方法请参见api文档。

    URL: 资源对象。   就是上面所说的URL对象。

    Socket:send方法,getOutPutStream()  getInputStream()等

    DatagramSocket:数据包,UDP传输保存数据的类。

    IP/TCP传输:有序,规则,稳定安全。但速度较慢。

    服务端:

    package tcp_ip;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * tcp/ip传输  服务器端
     * @author Administrator
     *
     */
    
    public class Server {
        public static void main(String[] args) throws IOException {
            //创建服务器端socket
            ServerSocket serverSocket = new ServerSocket(9999);
            //创建指定端口的serverSocket后  设置监听状态! 会阻塞
            System.out.println("socket服务端启动成功!正在监听9999端口......");
            Socket socket = serverSocket.accept();
            //成功接收到请求后会返回一个socket
            InputStream is = socket.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader reader = new BufferedReader(isr);
            String data = reader.readLine();
            while(data!=null&&!data.equals("")){
                System.out.println(data);
                data=reader.readLine();
            }
            reader.close();
            isr.close();
            is.close();
            socket.close();
            
        }
    }

    客户端:

    package tcp_ip;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    public class Client {
        public static void main(String[] args) throws Exception {
            //创建client客户端指定目标ip及端口 (即目标socket)
            Socket socket = new Socket("localhost", 9999);
            //或者这个socket的输出流
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter writer = new OutputStreamWriter(outputStream);
            writer.write("我是客户端,我发送给你的内容是"+"你好啊!服务端!");
            writer.close();
            outputStream.close();
            socket.close();
        }
    }

    //多线程版本:

    服务端:

    package tcp_ip;
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ServerThread {
        public static void main(String[] args) throws IOException {
            //创建服务器端socket
            ServerSocket serverSocket = new ServerSocket(9999);
            //创建指定端口的serverSocket后  设置监听状态! 会阻塞
            System.out.println("socket服务端启动成功!正在监听9999端口......");
            
            while(true){
                Socket socket = serverSocket.accept();
                new RunThread(socket).start();
            }
        }
    }

    客户端:

    package tcp_ip;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    public class Client {
        public static void main(String[] args) throws Exception {
            //创建client客户端指定目标ip及端口 (即目标socket)
            Socket socket = new Socket("localhost", 9999);
            //或者这个socket的输出流
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter writer = new OutputStreamWriter(outputStream);
            writer.write("我是客户端,我发送给你的内容是"+"你好啊!服务端! 又给你发啦~~");
            writer.close();
            outputStream.close();
            socket.close();
        }
    }

    UDP传输:无序,不规则,不安全,速度快。

    服务端:

    package udp;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    /**
     * udp客户端
     * @author Czt
     * 
     */
    public class Client {
        public static void main(String[] args) {
            try {
                String data=new String("你好啊!----来自客户端的消息!".getBytes(),"utf-8");
                DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788);
                DatagramSocket socket = new DatagramSocket();
                socket.send(datagramPacket);
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SocketException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }

    客户端:

    package udp;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    /**
     * udp客户端
     * @author Czt
     * 
     */
    public class Client {
        public static void main(String[] args) {
            try {
                String data=new String("你好啊!----来自客户端的消息!".getBytes(),"utf-8");
                DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788);
                DatagramSocket socket = new DatagramSocket();
                socket.send(datagramPacket);
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SocketException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
  • 相关阅读:
    MariaDB日志文件、备份与恢复
    实例讲解ip地址、子网掩码、可用地址范围的计算
    Nginx配置文件、优化详解
    Centos系统的升级
    编译安装nginx
    虚拟化云计算的相关概念汇总
    ELK日志管理
    Kubernetes 监控
    用 ConfigMap 管理配置
    K8s管理机密信息
  • 原文地址:https://www.cnblogs.com/cztisthebest/p/6281456.html
Copyright © 2020-2023  润新知