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

    网络编程
    网络
    把多台终端(计算机)通过物理线路连接起来,形成网络。便于交换数据、共享信息、组成更强大的逻辑体。
     
    网络通信三要素
    【1】IP地址:唯一标识网络上的每一台计算机
    两台计算机之间通信的必备有素
    【2】端口号:计算机中应用的标号(代表一个应用程序)
    0-1024系统使用或保留端口 ,
    有效端口0-65536
    常见的端口http协议80端口、mysql(3306) oracle(1521)
    【3】通信协议:通信的规则
    TCP,UDP
    TCP/IP参考模型
     
    IP地址分类
    127.0.0.1 表示本机IP地址
     
    InetAddress
    表示IP地址信息
    package cn.net01;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.Arrays;
    public class Test02 {
    public static void main(String[] args) throws UnknownHostException {
     
    // 通过IP地址构建InetAddress对象
    byte[] ip = new byte[] {(byte) 192,(byte) 168,7,(byte)189};
    InetAddress ip1 = InetAddress.getByAddress(ip);
    System.out.println(ip1.toString());
     
     
    System.out.println(ip1.getHostName());
    System.out.println(ip1.getHostAddress());
    // 给定名称www.baidu.com 获取地址
    InetAddress ip3 = InetAddress.getByName("www.baidu.com");
    System.out.println(ip3.toString());
     
    InetAddress[] ips = InetAddress.getAllByName("www.baidu.com");
    System.out.println(Arrays.toString(ips));
     
    }
    }
     
    TCP编程(A)
    案例:服务器向客户端完成一次单向通信
    package cn.net02;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class Server01 {
    public static void main(String[] args){
    System.out.println("server running....");
     
    // 【1】创建serversocket
    ServerSocket serverSocket = null;
    try {
    serverSocket = new ServerSocket(8000);
    } catch (IOException e) {
    e.printStackTrace();
    }
     
    // 【2】等待客户端链入
    Socket clientSocket = null;
    try {
    // accept 阻塞式方法
    clientSocket = serverSocket.accept();
    System.out.println("客户端"+clientSocket.getInetAddress().getHostAddress()+"链入");
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
     
    // 【3】服务器给客户端发信息
    OutputStream out = null;
    try {
    out = clientSocket.getOutputStream();
     
    String msg = "hello!";
    byte[] buf = msg.getBytes();
    out.write(buf);
     
    clientSocket.shutdownOutput();
    out.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
     
    }
    }
    package cn.net02;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import com.sun.org.apache.bcel.internal.generic.NEW;
    public class Client01 {
    public static void main(String[] args) {
    System.out.println("client running...");
    // 【1】创建客户端socket
    Socket socket=null;
    try {
    socket = new Socket("192.168.7.194",8000);
    } catch (UnknownHostException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
     
    // 【2】接收服务器发来的信息
    InputStream in = null;
    try {
    in = socket.getInputStream();
    byte[] buf = new byte[4];
    int len;
    StringBuilder sb = new StringBuilder();
    while( (len=in.read(buf)) != -1) {
    sb.append(new String(buf,0,len));
    }
     
    System.out.println("来自服务器的消息:"+sb.toString());
     
    } catch (IOException e) {
    e.printStackTrace();
    }
     
    }
    }
     
    常见异常
    [1]端口被占用
    java.net.BindException: Address already in use: JVM_Bind
    at java.net.DualStackPlainSocketImpl.bind0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
    at java.net.ServerSocket.bind(ServerSocket.java:375)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at java.net.ServerSocket.<init>(ServerSocket.java:128)
    at cn.net02.Server01.main(Server01.java:15)
    Exception in thread "main" java.lang.NullPointerException
    at cn.net02.Server01.main(Server01.java:24)
     
    [2]服务器没启动
    java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
     
    [3] SocketTimeoutException 连接超时异常。
     
    案例:服务器和客户端双向通信
    package cn.net03;
    import java.io.DataInput;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class Server01 {
    public static void main(String[] args) throws IOException {
     
    System.out.println("server running....");
     
    ServerSocket serverSocket = new ServerSocket(8000);
    Socket clientSocket = serverSocket.accept();
     
    // send msg to client
    OutputStream out = clientSocket.getOutputStream();
    String msg = "hello client";
    DataOutputStream dos = new DataOutputStream(out);
    dos.writeUTF(msg);
    clientSocket.shutdownOutput();
     
    // receive msg2 from client
    InputStream in = clientSocket.getInputStream();
    DataInputStream dis = new DataInputStream(in);
    String msg2 = dis.readUTF();
    System.out.println("来自客户端消息:"+msg2);
    clientSocket.shutdownInput();
     
     
    dos.close();
    out.close();
    in.close();
    dis.close();
     
     
    }
    }
    package cn.net03;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    import javax.print.Doc;
    public class Client01 {
    public static void main(String[] args) throws UnknownHostException, IOException {
    System.out.println("client running...");
     
    Socket socket = new Socket("127.0.0.1",8000);
     
    // receive msg from server
    InputStream in = socket.getInputStream();
    DataInputStream dis = new DataInputStream(in);
    String msg = dis.readUTF();
    System.out.println(msg);
    socket.shutdownInput();
     
     
    // send msg to server
    OutputStream out = socket.getOutputStream();
    DataOutputStream dos = new DataOutputStream(out);
    String msg2 = "hello server";
    dos.writeUTF(msg2);
    socket.shutdownOutput();
     
    in.close();
    dis.close();
    out.close();
    dos.close();
     
    }
    }
     
    需求:请发送一张图片到服务器。
    需求:c/s模式验证用户名密码。
    User序列化是客户端和服务器端的全路径一定要一致。
     
    UDP编程(B)
    需求:客户端A向客户端B发信息
    客户端A
    package cn.net06;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Scanner;
    public class ClientA {
    public static void main(String[] args) throws IOException {
    // 客户端A
    DatagramSocket ds = new DatagramSocket(8000);
    while(true) {
    //System.out.println("请输入");
    Scanner sc = new Scanner(System.in);
    String msg = sc.nextLine();
    // --send msg to ClientB --
    System.out.println("开始发送数据:"+msg);
    byte[] buf = msg.getBytes();
    InetAddress toIp = InetAddress.getLocalHost();
    DatagramPacket dp = new DatagramPacket(buf, buf.length, toIp, 9000);
    // 构造一个数据报包socket,通过8000用于发送数据报
    ds.send(dp);
     
    // --receive msg from clientA--
    byte[] recBuf = new byte[1024];
    DatagramPacket recDp = new DatagramPacket(recBuf, recBuf.length);
    ds.receive(recDp);
     
    String recMsg = new String(recBuf, 0, recDp.getLength());
    System.out.println("clientB说:"+recMsg);
    }
     
    // ds.close();
    }
    }
    客户端B
    package cn.net06;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.util.Scanner;
    public class ClientB {
    public static void main(String[] args) throws IOException {
    // 创建一个datagram socket用于结束clientA 传入的数据
    DatagramSocket ds = new DatagramSocket(9000);
    while (true) {
    // System.out.println("正在接收信息...");
    // --receive msg from clinetA--
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf, buf.length);
    ds.receive(dp);
    // 从dp中获取接收的内容
    String msg = new String(buf, 0, dp.getLength());
    System.out.println("clientA说:" + msg);
    // --send msg to clientA--
    Scanner sc = new Scanner(System.in);
    String sendMsg = sc.nextLine();
    byte[] sendBuf = sendMsg.getBytes();
    InetAddress toIp = InetAddress.getLocalHost();
    DatagramPacket sendPd = new DatagramPacket(sendBuf, sendBuf.length, toIp, 8000);
    // DatagramSocket sendDs = new DatagramSocket(9000);
    ds.send(sendPd);
    }
    }
    }
     
  • 相关阅读:
    swap函数的例子
    实现类似shared_ptr的引用计数
    使用new分配内存的类需要自己定义拷贝构造函数
    练习13.14 13.15 13.16
    查询单词,综合例子。
    无序容器
    关联容器操作
    关联容器概述
    文本查询程序
    shared_ptr与weak_ptr的例子
  • 原文地址:https://www.cnblogs.com/aknife/p/10988095.html
Copyright © 2011-2022 走看看