Java基础(网络编程)
一、概述
目的:网络通信:
1、设备和设备
2、进程和进程
1)不同设备之间
2)本地设备之间
需要解决的问题:
如何准确地发送到对方的主机 - IP地址 - 唯一的定位网络中的一台主机
如何准确的发送到对方主机的进程 - 端口
找到主机后如何可靠高效地进行数据传输,要能看懂 - 协议 - 规定/标准
二、网络通信要素
如何实现网络中的主机互相通信?
~一定的规则(即:网络通信协议。有两套参考模型)
OSI参考模型
TCP/IP参考模型(或TCP/IP协议)
~通信双方地址
IP地址
端口号
2.1、网络协议:
一种规则,人与人交流有语言的规则,计算机之间通过网络交流也要有网络的规则。
2.1.1、OSI参考模型
模型过于理想化,未能在因特网上进行广泛推广
2.1.2、TCP\IP协议
出现较早,事实上的标准。
两种协议之间存在对应关系:
传输控制协议(TCP)和网络互联协议(IP),一组协议,不同功能互相关联
2.1.3、TCP和UDP
TCP协议:
使用TCP协议前,须先建立TCP连接,形成传输数据通道;
传输前,采用三次握手方式,是可靠的;
TCP协议进行通信的两个应用进程:客户端、服务端;
在连接中可进行大数据量的传输;
传输完毕,使用四次挥手方式,释放连接,结束传输,效率低。
UDP协议:
将数据、源、目的封装成数据包,不需要建立连接;
每个数据报的大小限制在64KB内;
因无需连接,故是不可靠的;
发送数据结束时无需释放资源,速度快。
三次握手过程:
四次挥手过程
2.2、IP地址和端口号
2.2.1、IP地址
唯一的标识Internet上的计算机(通信实体)
分类:
IPV4:4个字节组成,4个0~255,如192.168.0.1
IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制表示
如:3ffe:3201:1401:1280:c8ff:fe4d:db39:198
2.2.2、端口号省略。。。
三、TCP编程_服务器和客户端
目标:
1、客户端能够连接服务器
2、客户端能够给服务器发送字符串并在服务器的控制台打印,直到发送exit表示发送结束
这里见源码及其注释:
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;/*
* 服务器
* */
public class Server {public static void main(String[] args) throws IOException {//创建监听套接字 最大端口65535ServerSocket serverSocket = new ServerSocket(60000);while (true) {//创建已连接套接字 - 返回表示有客户端连接Socket socket = serverSocket.accept();//获取客户端的IP和端口System.out.println(socket.getInetAddress().getHostAddress() + ":" + socket.getPort() + "已连接");int len = 0;byte[] arr = new byte[1024];//IO操作InputStream in = socket.getInputStream();while(true) {len = in.read(arr, 0, arr.length);if(len == -1) {break;}//byte[] --> StringString s = new String(arr, 0, len);System.out.println(s);}//关闭socket.close();}}
}
package day31;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws IOException {Scanner sc = new Scanner(System.in);//创建套接字 -- 如果成功表示和服务器连接成功Socket socket = new Socket("127.0.0.1", 60000);//IO操作OutputStream out = socket.getOutputStream();while(true) {//获取用户输入String s = sc.next();if(s.equals("exit")) {break;}//将输入的数据发送给服务器out.write(s.getBytes());}//关闭socket.close();}
}