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

    网络编程的概念:

    网络编程从大的方面说就是对信息的发送到接收,中间传输为物理线路的作用,编程人员可以不用考虑……

    网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的!中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理!

    网络编程三要素:

     A:IP地址  B:端口  C:协议

    什么是Socket:

    Socket的底层机制复杂,Java平台提供了一些简单的API,可以更简单有效的使用Socket开发而无需了解底层机制

    Socket套接字 :
    是网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
    socket实现的原理机制:
    1、通信的两端都有Socket
    2、网络通信其实就是Socket间的通信
    3、数据在两个Socket间通过IO传输

    Socket网络编程一般可以分成如下步骤进行:

    服务器端流程:
    1、创建服务器套接字---分配内存、初始化
    2、服务器套接字--侦听
    3、建立与客户端配套的客户端套接字
    4、与客户端通讯(可以多客户端)
    5、关闭、销毁服务器端相应套接字
    ----------------
    客户端:
    1、创建客户端套接字---分配内存、初始化
    2、连接服务器
    3、与服务器通讯
    4、关闭、销毁客户端套接字

    模拟用户登录的功能:

    来个例子:

    package cn;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class Socket {
    
        public static void main(String[] args) throws Exception {
            DatagramSocket ds=new DatagramSocket();
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            String line="s";
            byte [] bys=line.getBytes();
            int num=bys.length;
            InetAddress address=InetAddress.getByName("192.168.60.89");
            int port=10861;
            DatagramPacket dp=new DatagramPacket(bys,num, address,port);
            ds.send(dp);        
            ds.close();
    
    
        }
    
    }
    Socket类
    package cn;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    
    public class Socket1 {
    
        public static void main(String[] args) throws Exception {
            DatagramSocket ds=new DatagramSocket(10861);
    
            byte[] bys = new byte[1024];
            int len = bys.length;
            DatagramPacket dp = new DatagramPacket(bys, len);
    
            ds.receive(dp);
    
            byte[] by = dp.getData();
            int length = dp.getLength();
    
            InetAddress address = dp.getAddress();
            String ip = address.getHostAddress();
    
            String s = new String(by, 0, length);
            System.out.println(ip + "---" + s);
    
        ds.close();
    
    
        }
    
    }
    Socket1

    运行结果:

    基于UDP协议的Socket编程:

    DatagramPacket类:封装了数据报的数据、数据长度、目标地址和目标端口

    DatagramSocket类:接收和发送DatagramPacket对象封装好的数据报

    基于UDP协议的Socket网络编程步骤:

    来个栗子:

    客户咨询问题:

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    public class ServerSocket1 {
    
        public static void main(String[] args) throws Exception{
                   //1.创建对象
                    ServerSocket sk=new ServerSocket(11111);
                    //2.监听
                    Socket s=sk.accept();
                    //打包数据
                    BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));    
                    BufferedReader bw=new BufferedReader(new InputStreamReader(System.in));
                    OutputStream os=s.getOutputStream();
                    String line=null;
                    while((line=br.readLine())!=null){
                        System.out.println("Client 	"+line);        
                        
                        os.write(bw.readLine().getBytes());
                    }            
                    //释放资源
                    s.close();
                    //sk.close();
    
    
        }
    
    }
    ServerSocket1服务器
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.Socket;
    
    
    public class Socket1 {
    
        public static void main(String[] args) throws Exception {
            Socket sk=new Socket("192.168.60.89",11111);
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
            String line=null;
            while((line=br.readLine())!=null){            
                bw.write(line);
                bw.newLine();
                bw.flush();
                
                InputStream is=sk.getInputStream();            
                byte [] by=new byte[1024];
                int num=is.read(by);
                String h=new String(by, 0, num);
                System.out.println("Service:	"+h);
            }                    
                //br.close();
                //bw.close();
                sk.close();
    
        }
    
    }
    Socket1客户类

     运行结果:

  • 相关阅读:
    无参考数据集
    dropout层
    postgresql查询表的大小
    vue 消息订阅与发布
    echarts实现pie自定义标签
    elementUI 时间线居左显示
    css+div实现各种常见边框
    css实现中括号边框
    div中多行内容垂直居中显示
    vue 实现组件全屏展示及退出
  • 原文地址:https://www.cnblogs.com/3020815dzq/p/8686683.html
Copyright © 2011-2022 走看看