(1)网络通信:将数据通过网络从一台设备传输到另一台设备
(2)java.net 包下提供了一系列的类或接口,完成网络通信
(1)概念:用于唯一标识网络中的每台计算机/主机
(2)查看ip地址:ipconfig
(3)ip地址的表示形式:点分十进制 XX.XX.XX.XX(4个字节,8位)
(4)每一个十进制数的范围:0~255
(5)ip地址的组成 = 网络地址 + 主机地址,比如:192.168.16.69
(6)IPV6 是互联网工程任务组设计的用于替代 IPV4 的下一代IP协议,其地址数量号称可
为全世界的每一粒沙子编上一个地址(7)由于 IPV4 最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6
的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联的障碍
将 IP 地址映射成域名
(1)概念:用于标识计算机上某个特定的网络程序
(2)表示形式:以整数形式,范围0~65535
(3)0~1024已经被占用
【Transmission Control Protocol / Internet Protocol】
传输控制协议/因特网互联协议,又叫网络通讯协议。
这个协议是 Internet 最基本的协议、Internet 国际互联网络的基础,简单地说,就是由网络层的IP协议和传输层的TCP协议组成的。
TCP协议:传输控制协议
(1)使用TCP协议前,须先建立 TCP 连接,形成传输数据通道
(2)传输前,采用”三次握手“方式,是可靠的
(3)TCP协议进行通信的两个应用进程:客户端、服务端
(4)在连接中可进行大数据量的传输
(5)传输完毕,需释放已建立的连接,效率低
UDP协议:用户数据协议
(1)将数据、源、目的封装成数据包,不需要建立连接
(2)每个数据报的大小限制在64K内
(3)因无需连接,故是不可靠的
(4)发送数据结束时无需释放资源(因为不是面向连接的),速度快
- public static void main(String[] args) throws Exception {
-
- //1.获取本机InetAddress对象
- InetAddress localHost = InetAddress.getLocalHost();
- System.out.println(localHost); // yiry/192.168.1.5
-
- //2.根据指定主机名获取ip地址对象
- InetAddress host1 = InetAddress.getByName("yiry");
- System.out.println(host1); // yiry/192.168.1.5
-
- //3.根据指定域名获取ip地址对象
- InetAddress host2 = InetAddress.getByName("www.baidu.com");
- System.out.println(host2); // www.baidu.com/183.232.231.172
-
- //4.获取 InetAddress对象的主机名
- String hostName = host2.getHostName();
- System.out.println(hostName);// www.baidu.com
-
- //5.获取 InetAddress对象的地址
- String hostAddress = host2.getHostAddress();
- System.out.println(hostAddress);// 183.232.231.172
-
- }
(1)套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准
(2)通信的两端都要有 Socket,是两台机器间通信的端点
(3)网络通信其实就是 Socket 的通信。
(4)Socket 允许程序把网络连接当成一个流,数据在两个 Socket 间通过 IO 传输。
(5)一般主动发起通信的应用程序属客户端,等待通信请求的为服务端
- public static void main(String[] args) throws IOException {
- // 在本机的 9999 端口监听,等待连接
- ServerSocket serverSocket = new ServerSocket(9999);
- // 没有客户端连接 9999 端口时,程序会阻塞,等待连接
- Socket socket = serverSocket.accept();
- System.out.println("服务端:" + socket.getClass());
- InputStream is = socket.getInputStream();
- byte[] buf = new byte[1024];
- int readLen = 0;
- while ((readLen = is.read(buf)) != -1) {
- System.out.println(new String(buf, 0, readLen));
- }
- is.close();
- socket.close();
- serverSocket.close();
- }
- public static void main(String[] args) throws Exception {
- Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
- System.out.println("客户端:" + socket.getClass());
- OutputStream os = socket.getOutputStream();
- os.write("hello,server".getBytes());
- os.close();
- socket.close();
- }
设置写入结束标记
【socket.shutdownOutput();】
- public static void main(String[] args) throws IOException {
- // 在本机的 9999 端口监听,等待连接
- ServerSocket serverSocket = new ServerSocket(9999);
- // 没有客户端连接 9999 端口时,程序会阻塞,等待连接
- Socket socket = serverSocket.accept();
- System.out.println("服务端:" + socket.getClass());
- InputStream is = socket.getInputStream();
- byte[] buf = new byte[1024];
- int readLen = 0;
- while ((readLen = is.read(buf)) != -1) {
- System.out.println(new String(buf, 0, readLen));
- }
-
- OutputStream os = socket.getOutputStream();
- os.write("hello,client".getBytes());
- socket.shutdownOutput();
-
- os.close();
- is.close();
- socket.close();
- serverSocket.close();
- }
- public static void main(String[] args) throws Exception {
- Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
- System.out.println("客户端:" + socket.getClass());
- OutputStream os = socket.getOutputStream();
- os.write("hello,server".getBytes());
- socket.shutdownOutput();
-
- InputStream is = socket.getInputStream();
- byte[] buf = new byte[1024];
- int readLen = 0;
- while ((readLen = is.read(buf))!= -1){
- System.out.println(new String(buf,0,readLen));
- }
-
- is.close();
- os.close();
- socket.close();
- }
设置写入结束标记
【bufferedWriter.newLine();】
- public static void main(String[] args) throws IOException {
- // 在本机的 9999 端口监听,等待连接
- ServerSocket serverSocket = new ServerSocket(9999);
- // 没有客户端连接 9999 端口时,程序会阻塞,等待连接
- Socket socket = serverSocket.accept();
- System.out.println("服务端:" + socket.getClass());
- InputStream is = socket.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- String s = br.readLine();
- System.out.println(s);
-
- OutputStream os = socket.getOutputStream();
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
- bw.write("hello,client");
- bw.newLine();
- bw.flush();
-
- bw.close();
- br.close();
- socket.close();
- serverSocket.close();
- }
- public static void main(String[] args) throws Exception {
- Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
- System.out.println("客户端:" + socket.getClass());
- OutputStream os = socket.getOutputStream();
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
- bw.write("hello,server");
- // 插入一个换行符,表示结束标记
- bw.newLine();
- // 字符流需要刷新
- bw.flush();
-
- InputStream is = socket.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- String s = br.readLine();
- System.out.println(s);
-
- br.close();
- bw.close();
- socket.close();
- }
- public class StreamUtils {
-
- /*
- 将输入流转换成byte[],即把文件的内容读入到byte[]
- */
- public static byte[] streamToByteArray(InputStream is) throws IOException {
- ByteArrayOutputStream bos = new ByteArrayOutputStream();
- byte[] b = new byte[1024];
- int len;
- while ((len = is.read(b)) != -1) {
- bos.write(b, 0, len);
- }
- byte[] array = bos.toByteArray();
- bos.close();
- return array;
- }
-
- /*
- 将InputStream 转换成 String
- */
- public static String streamToString(InputStream is) throws IOException {
- BufferedReader reader = new BufferedReader(new InputStreamReader(is));
- StringBuilder builder = new StringBuilder();
- String line;
- while ((line = reader.readLine()) != null) {
- builder.append(line + "\r\n");
- }
- return builder.toString();
- }
-
- }
- public class Server_04 {
- public static void main(String[] args) throws IOException {
-
- ServerSocket serverSocket = new ServerSocket(8888);
- // 等待连接
- Socket socket = serverSocket.accept();
-
- InputStream is = socket.getInputStream();
- BufferedInputStream bis = new BufferedInputStream(is);
-
- // 文件对应的字节数组
- byte[] bytes = StreamUtils.streamToByteArray(bis);
- String filepath = "src\\ces1.jpg";
- BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filepath));
- bos.write(bytes);
- bos.close();
-
- OutputStream os = socket.getOutputStream();
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
- bw.write("服务端收到图片");
- bw.flush();
- socket.shutdownOutput();
-
- bw.close();
- bis.close();
- socket.close();
- serverSocket.close();
-
- }
- }
- public class Client_04 {
- public static void main(String[] args) throws Exception {
-
- String filepath = "d:\\ces.jpg";
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filepath));
- // 文件对应的字节数组
- byte[] bytes = StreamUtils.streamToByteArray(bis);
-
- Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
- OutputStream os = socket.getOutputStream();
- BufferedOutputStream bos = new BufferedOutputStream(os);
- bos.write(bytes);
- // 结束标记
- socket.shutdownOutput();
-
- InputStream is = socket.getInputStream();
- String s = StreamUtils.streamToString(is);
- System.out.println(s);
-
- is.close();
- bis.close();
- bos.close();
- socket.close();
-
- }
- }
(1)netstat-an可以查看当前主机网络情况,包括端口监听情况和网络连接愉况
(2)netstat-anmore可以分页显示
(3)要求在dos控制台下执行