zoukankan      html  css  js  c++  java
  • 网络编程

    1.Socket

    1.TCP通信

    1. 客户端: java.net.Socket类表示. 创建Socket对象
    2. 服务端: java.net.ServerSocket类表示. 创建ServerSocket对象

    2.Socket类

    构造方法
    • public Socket(String host, int port): 创建套接字对象, 指定主机和端口号, 如果host是null, 则相当于指定地址为回送地址

      例子

      Socket client = new Socket("127.0.0.1", 6666);
      
    成员方法
    • public InputStream getInputStream(): 返回套接字的输入流
      • 如果此Socket具有相关联的通道, 则生成的InputStream的所有操作也关联该通道
      • 关闭生成的InputStream也将关闭相关的Socket.
    • public OutputStream getOutputStream(): 返回套接字的输出流
      • 如果此Socket具有相关联的通道, 则生成的OutputStream的所有操作也关联该通道
      • 关闭生成的OutputStream也将关闭相关的Socket.
    • public void close():关闭套接字
      • 一旦关闭,则不可使用
      • 关闭Socket,也关闭OutputStreamInputStream
    • public void shutdownOutput():禁止此套接字的输出流
      • 任何先前写出的数据将被发送,随后终止输出流

    3.ServerSocket

    构造方法
    • public ServerSocket(int port): 使用该构造方法创建ServerSocket对象时,就可以将其绑定到一个指 定的端口号上,参数port就是端口号

      例子

      ServerSocket server = new ServerSocket(6666);
      
    成员方法
    • public Socket accept(): 侦听并接受连接, 返回一个新的Socket对象,用于和客户端实现通信。该方法 会一直阻塞直到建立连接。

    4.简单的使用

    TCP通信分析图解

    1. 【服务端】启动,创建ServerSocket对象,等待连接。

    2. 【客户端】启动,创建Socket对象,请求连接。

    3. 【服务端】接收连接,调用accept方法,并返回一个Socket对象。

    4. 【客户端】Socket对象,获取OutputStream,向服务端写出数据。

    5. 【服务端】Scoket对象,获取InputStream,读取客户端发送的数据。 到此,客户端向服务端发送数据成功。 自此,服务端向客户端回写数据。

    6. 【服务端】Socket对象,获取OutputStream,向客户端回写数据。

    7. 【客户端】Scoket对象,获取InputStream,解析回写数据。

    8. 【客户端】释放资源,断开连接。

      1562145409429

    服务端实现
    public class ServerTCP{
        public static void main(String[] args) throws IOException{
            System.out.println("服务端启动, 等待连接");
            // 1.创建ServerSocket对象,绑定端口,开始等待连接
            ServerSocket ss = new ServerSocket(6666);
            // 2.接受连接accept方法, 返回Socket
            Socket server = ss.accept();
            // 3.通过Socket获取输入流
            InputStream is = server.getInputStream();
            // 4.一次性读取数据
            // 1.创建字节数数组
            byte[] b = new byte[1024];
            // 2.读取数据到字节数组中
            int len = is.read(b);
            // 3.解析数据,打印字符串信息
            String msg = new String(b,0,len);
            System.out.prinln(msg);
            /*服务端回送数据
            // 5. 通过 socket 获取输出流
    		OutputStream out = server.getOutputStream();
    		// 6. 回写数据
    		out.write("我很好,谢谢你".getBytes());
            */
            // 5.关闭资源
            is.close();
            server.close();
        }
    }
    
    客户端实现
    public class ClientTCP{
        public static void main(String[] args) throws Exception{
            System.out.println("客户端,发送数据");
            //1.创建Socket(ip, port), 确定连接数据
            Socket client = new Socket("localhost", 6666);
            //2.通过Socket,获取输出流对象
            OutputStream os = client.getOutputStream();
            // 3.写出数据
            os.write("你好,约吗?".getBytes());
            //4.Socket获取输入流对象
            InputStream in = client.getInputStream();
            //5.读取数据
            byte[] b = new byte[1024];
            int len = in.read(b);
            System.out.println(new String(b,0,len));
            //6.关闭资源
            in.close();
            os.close();
            client.close();
        }
    }
    

    UDP

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java,.net.InetAddress;
    /*
    udp客户端
    */
    public class UDPClient{
        public static void main(String[] args)throws IOException{
            // 要发送的消息
            byte[] bs = "我是客户端给你发消息".getBytes();
            // 本机ip地址巡回
            InetAddress ip = InetAddress.getLocalHost();
            // 数据报文,udp服务端口为多少  10000代表的是服务端的端口号
            DatagramPacket p = new DatagramPacket(bs, bs.length,ip,10000);
            // 创键客户端套接字, 设置端口号
            DatagramSocket socket = new DetagramSocket(10010);
            //向服务端发送数据
            socket.send(p);
            //关闭套接字
            socket.close();
        }
    }
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java,.net.InetAddress;
    
    public class UDPServer{
        public static void main(String[] args) throws IOException{
            //用数组接受数据包
            byte[] bs = new byte[1024];
            DatagramPacket p = new DetagramPacket(bs, bs,length);
            // 创建服务端报文套接字
            DatagramSocket socket = new DatagramSocket(10000);
            // 接受数据包
            socket.receive(p);
            System.out.println(new String(bs, 0, p.getLength()));
            //关闭套接字
            socket.close();
        }
    }
  • 相关阅读:
    WEB-INF下的jsp通过servlet中超链接跳转
    WEB-INF下的jsp怎么访问
    迭代器一般用法
    接口深层理解
    java中的接口深层理解
    动态SQL与静态SQL的区别
    TIDB集群部署
    ora-00245报错解决方法
    PostgreSQL 密码验证功能增强
    多台机器之间一键化互信脚本实现
  • 原文地址:https://www.cnblogs.com/liudemeng/p/11364642.html
Copyright © 2011-2022 走看看