您的位置:首页 > 理论基础 > 计算机网络

22、网络编程

2020-07-26 22:09 281 查看

一、网络基本概念

1、TCP和UDP协议(传输层)

  1. TCP协议:

    一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议 。
    特点:面向连接、点到点、高可靠性(三次握手)、占用系统资源多,效率低
  2. UDP协议:

    一种无连接传输层协议,提供面向事务的简单不可靠信息传送服务。

    特点:非面向连接,传输不可靠,可能丢失、发送不管对方是否准备好,接收到方收到不确认、可以广播发送、非常简单               的协议,开销小

2、IP地址和端口

  1. IP地址:用来标志网络中的一个通信实体(计算机、路由器等)的地址。

    分类:
            IPV4:32位地址,以点分十进制表示,如192.168.0.1
            IPV6:128位地址,写成8个16位的无符号整数,每个整数用四个十六进制位表示,数之间用冒号(:)分开,
                        如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984

    特殊的IP地址:127.0.0.1 本机地址
                             192.168.0.0--192.168.255.255私有地址,属于非注册地址,专门为组织机构内部使用。
     
  2. 端口port:IP地址用来标志一台计算机,但是一台计算机上可能提供多种应用程序,使用端口来区分这些应用程序。

    范围:0---65535,16位整数。

    分类:公认端口  0—1023   比如80端口分配给WWW,21端口分配给FTP
               注册端口  1024—49151    分配给用户进程或应用程序
               动态/私有端口 49152—65535
     
  3. IP和端口的关系:

    IP地址好比每个人的地址(门牌号),端口好比是房间号。必须同时指定IP地址和端口号才能够正确的发送数据。

    IP地址好比为电话号码,而端口号就好比为分机号。
     
  4. IP和端口的API:

    InetAddress类:封装计算机的ip地址 ,没有端口。
    InetSocketAddress:包含端口,用于socket通信的。

二、TCP编程

  1. URL:统一资源定位符

    组成:由4部分组成:协议 、存放资源的主机域名、端口号和资源文件名。
    概念:是指向互联网资源(文件或目录,对象(对数据库或搜索引擎的查询))的指针。
  2. socket套接字:是传输层供给应用层的编程接口。

    使用Socket编程可以开发客户机和服务器应用程序,可以在本地网络上进行通信,也可通过Internet在全球范围内通信。
  3. TCP编程:
    ①一次单向通信
    ②一次双向通信
    ③传输对象
    ④多线程
    [code]import java.io.Serializable;
    
    public class User implements Serializable {
    private static final long serialVersionUID = 8908496199663592530L;
    private String userId;
    private String password;
    
    @Override
    public String toString() {
    return "User{" +
    "userId='" + userId + '\'' +
    ", password='" + password + '\'' +
    '}';
    }
    
    public String getUserId() {
    return userId;
    }
    
    public void setUserId(String userId) {
    this.userId = userId;
    }
    
    public String getPassword() {
    return password;
    }
    
    public void setPassword(String password) {
    this.password = password;
    }
    
    public User() {
    }
    
    public User(String userId, String password) {
    this.userId = userId;
    this.password = password;
    }
    }
    
    import java.io.DataOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    
    public class LoginThread extends Thread {
    Socket socket;
    
    public LoginThread(Socket socket) {
    this.socket = socket;
    }
    
    @Override
    public void run() {
    try(
    //1、使用对象输入流,读取对象信息
    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
    ){
    Object o = ois.readObject();
    //2、判断对象是否正确
    String mess = "";
    if (o instanceof User){
    User user = (User)o;
    if (user.getUserId().equals("xulong")&&user.getPassword().equals("xl123")){
    mess = "登录成功";
    }else {
    mess = "登录失败";
    }
    }
    //3、创建数据输出流,写出登录结果
    
    dos.writeUTF(mess);
    }catch (Exception e){
    e.printStackTrace();
    }
    }
    }
    
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
    public static void main(String[] args) throws IOException {
    //1、创建服务器对象
    ServerSocket serverSocket = new ServerSocket(43999);
    while (true){
    //2、接收数据
    Socket socket = serverSocket.accept();
    //3、利用线程,执行操作
    Thread thread = new LoginThread(socket);
    thread.start();
    System.out.println("socket.getInetAddress() = " + socket.getInetAddress());
    }
    }
    }
    
    import java.io.DataInputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class Client {
    public static void main(String[] args) throws IOException {
    //1、创建客户端对象
    Socket socket = new Socket(InetAddress.getLocalHost(), 43999);
    //2、创建对象输出流,写出对象
    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    User user = new User("xulong", "xl123");
    oos.writeObject(user);
    //3、创建数据输入流,接收服务器反馈
    DataInputStream dis = new DataInputStream(socket.getInputStream());
    String s = dis.readUTF();
    //4、展示反馈信息
    System.out.println(s);
    //5、关流
    oos.close();
    dis.close();
    }
    }

     

  4. UDP编程:
    ①一次单向通信
    ②一次双向通信
    ③多次双向通信
[code]import java.net.*;
import java.util.Scanner;

public class Client {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
//1、创建客户端对象
DatagramSocket socket = new DatagramSocket(43998);
while (true) {
//2、创建发送数据数据包
System.out.println("你想说什么:");
String s = in.next();
byte[] bytes = s.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getLocalHost(), 43999);
//3、发送数据
socket.send(packet);
if (s.equals("bye")) {
break;
}
//4、创建接收数据的数据包
byte[] bytes1 = new byte[100];
DatagramPacket packet1 = new DatagramPacket(bytes1, bytes1.length);
//4、接收数据
socket.receive(packet1);
//5、展示内容
String s1 = new String(packet1.getData(), 0, packet1.getLength());
System.out.println("服务器说:" + s1);
if (s1.equals("bye")) {
break;
}
}
//6、关闭客户端
socket.close();
}
}

import java.net.*;
import java.util.Scanner;

public class Server {
public static void main(String[] args) throws Exception {
Scanner in = new Scanner(System.in);
//1、创建服务器对象
DatagramSocket socket = new DatagramSocket(43999);
while (true) {
//2、创建接收数据的数据包
byte[] bytes = new byte[100];
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
//3、接收数据
socket.receive(packet);
//4、展示信息
String s = new String(packet.getData(), 0, packet.getLength());
System.out.println("客户端说:" + s);
if (s.equals("bye")) {
break;
}
//5、创建发送数据的数据包
System.out.println("你想说什么:");
String s1 = in.next();
byte[] bytes1 = s1.getBytes();
DatagramPacket packet1 = new DatagramPacket(bytes1, bytes1.length, InetAddress.getLocalHost(), 43998);
//6、发送数据
socket.send(packet1);
if (s1.equals("bye")) {
break;
}
}
//7、关闭服务器
socket.close();
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: