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

    Java网络编程,应用方向:电商。
         web编程在整个Java中占据很大一部分!
         编写程序运行在同一网络下的两个终端上。
        
         计算机网络就是:通过硬件设施、传输媒介把分散在不同地区的计算机进行连接,形成一个资源共享和数据传输的网络系统
         遵循:network protocol,包含三部分,
             1.语法:数据信息的结构
             2.语义:描述请求、动作和响应
             3.同步:动作的实现顺序
            
         ---TCP/IP、IPX/SPX、NetBEUI
             TCP/IP是分层,
                 优点:
                     各层相互独立,互不干扰
                     维护性、扩展性好
                     有利于系统的标准化
             分为四层,由上至下:layer
                 应用层:通过应用程序之间的数据交互完成网络应用
                 传输层:数据传输服务
                 网络层:IP层,网络中不同终端提供通信服务
                 网络接口层:数据链路层(链路协议)、物理层(传递信号的各种物理介质)
                
             IP和端口
                 IP:终端设备在互联网,唯一的标示。网络中的请求可以根据这个标示找到具体的计算机。
                 网络地址:主机所在的网络。
                 主机地址:找到网络中的主机。
                
         java.net.InetAddress    :localhost    或     127.0.0.1
        
    端口:
         IP地址+端口:互联网中接收请求的服务端。
        
    URL&URLConnection
         URI:统一资源定位符指向目标实体(网络资源)
         java.net.URI——实例化对象,面向对象的方式来管理网络资源。
        
         URI.getHost()getPort()getPath()
        
    URL:统一资源位置,在URI的基础上进行扩充,定位资源的同时,还提供了对应的网络地址。
         java.net.URL
         获取流
         获取其他信息:主机地址,port等
             getHost()getPort()getPath()
        
         URLConnection
             描述URL指定资源的连接, 抽象类,常用:HTTPURLConnection,底层通过HTTP协议来处理,定义了
             访问远程网络资源的方法。
            
         TCP协议
             建立稳定的连接
             Socket类,通过Socket可以在服务端和客户端之间建立起可靠的连接。Socket表示客户端,服务端使用
             ServerSocket来表示,ServerSocket也是一个类,ServerSocket和Socket都存放在java.net中。
                 --accept

    TCP协议开发——传送的是字节数组

    //注意接收、发送端口问题

    //本地端

                //接收消息
                 datagramSocket = new DatagramSocket(6600);
                 datagramSocket.receive(datagramPacket);
                 String receive = new String(datagramPacket.getData());
                 System.out.println("Terminal A 接受到"+datagramPacket.getPort()+"端口传来的消息:"+receive);
                 //发送消息
                 String sendMeassage = "hello Termial B";
                 byte[] buf1 = sendMeassage.getBytes();
                 datagramPacket = new DatagramPacket(buf1,buf1.length,datagramPacket.getSocketAddress());
                 datagramSocket.send(datagramPacket);
                 System.out.println("Termain A 发送消息:"+sendMeassage);

    //服务端

    //发送消息
    String sendMeassage = "hello Termial A";
    byte[] buf1 = sendMeassage.getBytes();
    //获取接受方的地址
    InetAddress inetAddress = InetAddress.getByName("localhost");
    datagramPacket = new DatagramPacket(buf1,buf1.length,inetAddress,6600);
    datagramSocket = new DatagramSocket(6080);
    datagramSocket.send(datagramPacket);
    System.out.println("Termain B 发送消息:"+sendMeassage);
    //接收消息
    datagramSocket.receive(datagramPacket);
    String receive = new String(datagramPacket.getData());
    System.out.println("Terminal B 接受到"+datagramPacket.getPort()+"消息:"+receive);

    UDP应用

    //A:客户端

    Socket socket = new Socket("127.0.0.1", 8080);
    //发送请求
    OutputStream outputStream = socket.getOutputStream();
    DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
    String request = "客户端请求信息:hello server http ip";
    dataOutputStream.writeUTF(request);
    //接受请求
    InputStream inputStream = socket.getInputStream();
    DataInputStream dataInputStream = new DataInputStream(inputStream);
    String response = dataInputStream.readUTF();
    System.out.println("客户端获得响应信息:"+response);

    //B:服务端

    serverSocket = new ServerSocket(8080);
    Socket socket = serverSocket.accept();//这块会出现丢包问题
    InputStream inputStream = socket.getInputStream();
    DataInputStream dataInputStream = new DataInputStream(inputStream);
    String receive = dataInputStream.readUTF();
    System.out.println("服务端接收到消息:"+receive);
    //反馈
    String response = "hello client:protocal TCP\IP";
    OutputStream outputStream = socket.getOutputStream();
    //outputStream.write(response.getBytes());
    DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
    dataOutputStream.writeUTF(response);
    System.out.println("服务端给客户端作出响应:"+response);

    不知道:总感觉还是差点业务上的实际应用!【自学当中出现的困惑点:需要不断实践才能沉淀处真知灼见!】——碰到高人指点是一定要感恩回报的!

    体会这种封装的思想——简单的聊天程序

    【1】明白是两个线程进行通话

    【2】采用UDP协议,客户端Socket对象,服务端ServerSocket对象

    【3】简单两个线程之间通话,多个线程的问题???

    //客户端代码

    public class Client implements Runnable{
         private Socket socket;
         public Client(Socket socket) {
             // TODO Auto-generated constructor stub
             this.socket = socket;
         }
         @Override
         public void run() {
             // TODO Auto-generated method stub
             while (true) {
                 try {
                     //线程本身一直在监听,而不是重新启动线程!!
                     //客户端发送消息
                     OutputStream outputStream = socket.getOutputStream();
                     DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
                     Scanner scanner = new Scanner(System.in);
                     System.out.print("客户端:");
                     String string=scanner.nextLine();
                     //System.out.println(string);
                     dataOutputStream.writeUTF(string);
                 } catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
                 //客户端接收消息
                 try {
                     InputStream inputStream = socket.getInputStream();
                     DataInputStream dataInputStream = new DataInputStream(inputStream);
                     String receive = dataInputStream.readUTF();
                     System.out.println("服务端:"+receive);
                 } catch (IOException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
         }
    }

    //服务端代码

    public class Server extends Thread{
         private ServerSocket serverSocket;
         public Server(ServerSocket serverSocket) {
             this.serverSocket = serverSocket;
         }
         @Override
         public void run() {
             // TODO Auto-generated method stub
             //super.run();
             try {
                 Socket socket = serverSocket.accept();
                 while (true) {
                     String receive = new DataInputStream(socket.getInputStream()).readUTF();
                     System.out.println("客户端:"+receive);
                     Scanner scanner = new Scanner(System.in);
                     System.out.print("服务端:");
                     String response = scanner.nextLine();
                     //System.out.println(response);
                     new DataOutputStream(socket.getOutputStream()).writeUTF(response);
                 }
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
         }
    }

    //客户端线程调用

    Socket socket = null;
    Thread q1 = null;
    try {
         socket = new Socket("localhost", 8080);
         Client client = new Client(socket);
         q1 = new Thread(client);q1.start();
    } catch (UnknownHostException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
    } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
    }

    //服务端线程调用

    Server server = null;
    try {
         server = new Server(new ServerSocket(8080));server.start();
    } catch (IOException e) {
         e.printStackTrace();
    }

    注意一点:java.net.ConnectException: Connection refused: connect  原因:

    Socket socket = serverSocket.accept();//服务端需要先建立连接

  • 相关阅读:
    C# winform 获取标题栏,状态栏,菜单栏的高度
    <转载>OleDb操作Access数据库:新增记录时获取自动编号的主键值
    《名利场》:微软 “ 失落的十年”
    Lisp的永恒之道(转)
    Google Earth KML数据格式转换成Shp数据格式(转)
    【转】ArcGIS投影转换与坐标转换
    利用Mono.Cecil动态修改程序集来破解商业组件(仅用于研究学习)
    C# mouseDoubleClick与DoubleClick的关系
    ACCESS通用操作数据类
    VS2010单元测试入门实践教程
  • 原文地址:https://www.cnblogs.com/macro-renzhansheng/p/12636519.html
Copyright © 2011-2022 走看看