AI智能
改变未来

22、网络编程


一、网络基本概念

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;@Overridepublic 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;}@Overridepublic 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();}}

 

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 22、网络编程