zoukankan      html  css  js  c++  java
  • Java 网络通信(TCP/UDP)

    1.InetAdress类 与  Socket类

     >InetAdress

     >Socket

    2.TCP/IP协议簇 

     客户端:

    • 创建 Socket根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
    • 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输
    • 按照一定的协议对 Socket  进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
    • 关闭 Socket断开客户端到服务器的连接,释放线路

    服务器端:

    public class TestTCP3 {
        @Test
        public void client()throws Exception{
            //1.创建Socket的对象
            Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9898);
            //2.从本地获取一个文件发送给服务端
            OutputStream os = socket.getOutputStream();
            FileInputStream fis = new FileInputStream(new File("1.jpg"));
            byte[] b = new byte[1024];
            int len;
            while((len = fis.read(b)) != -1){
                os.write(b,0,len);
            }
            socket.shutdownOutput();//告知服务器端传送完毕
            //3.接收来自于服务端的信息
            InputStream is = socket.getInputStream();
            byte[] b1 = new byte[1024];
            int len1;
            while((len1 = is.read(b1)) != -1){
                String str = new String(b1,0,len1);
                System.out.print(str);
            }
            //4.关闭相应的流和Socket对象
            is.close();
            os.close();
            fis.close();
            socket.close();
        }
        @Test
        public void server() throws Exception{
            //1.创建一个ServerSocket的对象
            ServerSocket ss = new ServerSocket(9898);
            //2.调用其accept()方法,返回一个Socket的对象
            Socket s = ss.accept();
            //3.将从客户端发送来的信息保存到本地
            InputStream is = s.getInputStream();
            FileOutputStream fos = new FileOutputStream(new File("3.jpg"));
            byte[] b = new byte[1024];
            int len;
            while((len = is.read(b)) != -1){
                fos.write(b, 0, len);
            }
            System.out.println("收到来自于" + s.getInetAddress().getHostAddress() + "的文件");
            //4.发送"接收成功"的信息反馈给客户端
            OutputStream os = s.getOutputStream();
            os.write("你发送的图片我已接收成功!".getBytes());
            //5.关闭相应的流和Socket及ServerSocket的对象
            os.close();
            fos.close();
            is.close();
            s.close();
            ss.close();
        }
    }

     

    3.UDP网络通信

    • 调用 ServerSocket(int port) 创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求
    • 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
    • 调用 该Socket类对象的 getOutputStream() 和 getInputStream ()获取输出流和输入流,开始网络数据的发送和接收。
    • 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
    //UDP编程的实现
    public class TestUDP {
    
        // 发送端
        @Test
        public void send() {
            DatagramSocket ds = null;
            try {
                ds = new DatagramSocket();
                byte[] b = "你好,我是要发送的数据".getBytes();
                //创建一个数据报:每一个数据报不能大于64k,都记录着数据信息,发送端的IP、端口号,以及要发送到
                //的接收端的IP、端口号。
                DatagramPacket pack = new DatagramPacket(b, 0, b.length,
                        InetAddress.getByName("127.0.0.1"), 9090);
                
                ds.send(pack);
            }catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(ds != null){
                    ds.close();
                    
                }
            }
            
        }
    
        // 接收端
        @Test
        public void rceive() {
            DatagramSocket ds = null;
            try {
                ds = new DatagramSocket(9090);
                byte[] b = new byte[1024];
                DatagramPacket pack = new DatagramPacket(b, 0, b.length);
                ds.receive(pack);
                
                String str = new String(pack.getData(), 0, pack.getLength());
                System.out.println(str);
            }catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                if(ds != null){
                    ds.close();
                    
                }
            }
        }
    }

    附上http请求:

    URL的方法 openStream():能从网络上读取数据

    l  若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。

    URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException.

    • URL netchinaren = new URL ("http://www.atguigu.com/index.shtml");
    • URLConnectonn u = netchinaren.openConnection( ); 
  • 相关阅读:
    c++ 为自定义类添加stl遍历器风格的遍历方式
    C++ 生成随机数
    c/c++ 函数说明以及技巧总结
    XSLT 教程
    C# 高效过滤DataTable 中重复数据方法
    xml获取指定节点的路径
    TreeView控件
    推荐一些C#相关的网站、资源和书籍
    C#多线程操作
    C#二进制序列化
  • 原文地址:https://www.cnblogs.com/pjlhf/p/8663506.html
Copyright © 2011-2022 走看看