搜索
首页Javajava教程关于网络通信的实例详解

关于网络通信的实例详解

Jun 25, 2017 am 09:33 AM
网络通信

 

一 概述

1.网络模型

OSI(Open System Interconnection,开放式系统互联)模型,是对网络系统结构的概括,将网络分为七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

2.IP协议

网络层协议,规定了在互联网上确定与寻找计算机的规则。

3.TCP协议

传输层的一种数据传输协议,数据传输前通过“三次握手”建立连接,然后再发送数据,适用于对数据准确性要求较高的情况,由于数据传输前需要建立连接,传输速度较慢。

4.UDP协议

传输层的一种数据传输协议,数据传输前不需要建立连接,适用于对数据准确性要求不高的情况,传输数据较快,一般聊天信息都通过该协议传输。

5.HTTP协议

HTTP协议属于应用层协议,为操作系统或网络应用程序提供访问网络服务的接口。

6.端口port

当数据到达计算机后,为了找到目标应用程序,为每一个应用程序分配了一个整数值,取值0-65535,这个整数值就是端口,从中可以看出,端口代表了计算机上一个应用程序,保证数据准确到达预定的程序。一个端口不能同时被多个应用程序占用,一个应用程序结束以后,端口不会立即释放,有一个内存延迟占有的时间,这个时间一般很短。端口、0-1023已经被系统应用程序及其他应用程序占用,程序设计时避免使用这个范围的端口。

7.套接字Socket

套接字是数据发送与接收的工具。发送者通过套接字发送数据,接受者通过套接字监听指定的端口获取数据。

8.无论采用TCP协议,还是UDP协议,数据都只能以字节形式发送。

二 TCP程序设计

1.关闭通过Socket获取的输入流或者输出流将关闭Socket。

2.通过Socket获取的输出流输出完毕后必须关闭,不然另一端对应的输入流将阻塞。由于通过输出流对象关闭输出流时,同时关闭Socket对象,将导致另一端无法获取对应Socket的对象,因此只能通过Socket下的方法shutdownOutput关闭输出流。

3.客户端的一般步骤: 

Socket socket=new Socket(String host,int port);//创建客户端Socket,发送与接收数据,需要指明服务器IP与端口OutputStream os=socket.getOutputStream();//获取输出流,向服务器发送数据..........
os.flush();
socket.shutdownOutput();//关闭输出流,防止服务器端阻塞InputStream is=socket.getInputStream();//获取输入流,输入流包含服务器的反馈信息............

socket.close();//关闭socket,同时关闭输入与输出流

4.服务器的一般步骤:

ServerSocket server=new ServerSocket(int port);//建立服务器端套接字,指定监听端口Socket socket=server.accept();//获取访问客户端的Socket,阻塞线程InputStream is=socket.getInputStream();//获取输入流,其中包含客户端发送的数据.............

OutputStream os=socket.getOutputStream();//获取输出流,向客户端反馈信息..............
os.flush();
os.shutdownOutput();

server.close();

5.Demo

客户端

package com.javase.networkCommunication.tcp.demo02;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class ImgClient {public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("192.168.146.1", 10007);
        FileInputStream is = new FileInputStream("Files/1.jpg");
        OutputStream os = socket.getOutputStream();byte[] buf = new byte[1024];// 先将数据读取到缓冲区,比频繁的从硬盘读取速度快int length = 0;while ((length = is.read(buf)) != -1) {
            os.write(buf, 0, length);
        }
        os.flush();
        socket.shutdownOutput();// 如果输出流不关闭,服务端对应的输入流会阻塞InputStream replyIs = socket.getInputStream();//不会阻塞线程byte[] buf01 = new byte[1024];int length01 = replyIs.read(buf01);
        String reply = new String(buf01, 0, length01);
        System.out.println(reply);
        
        is.close();
        socket.close();
    }

}

服务器

package com.javase.networkCommunication.tcp.demo02;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import org.junit.Test;public class ImgServer {

    @Testpublic void test01() throws IOException {
        ServerSocket serverSocket = new ServerSocket(10007);
        Socket socket = serverSocket.accept();// 线程阻塞,等待请求System.out.println("hostAddress=" + socket.getInetAddress().getHostAddress());
        InputStream is = socket.getInputStream();
        FileOutputStream os = new FileOutputStream("Files/2.jpg");
        System.out.println(1);byte[] buf = new byte[1024];int length = 0;
        System.out.println(2);int count = 3;while ((length = is.read(buf)) != -1) {
            os.write(buf, 0, length);
            System.out.println(count++);
        }
        os.flush();
        os.close();
        System.out.println("图片上传结束");/*PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.write("success");*/OutputStream out = socket.getOutputStream();
        out.write("success".getBytes());
        out.flush();
        socket.shutdownOutput();
        System.out.println("响应数据已发出");
        
        serverSocket.close();
    }

}

三 UDP程序设计

1.数据处理方式

UDP协议以数据包的形式发送数据,每个包的最大值64k。

2.发送数据的一般步骤:

DatagramSocket socket=new DatagramSocket();//创建数据报套接字用于发送数据//DUP协议采用数据包分段发送数据,因此需要建立数据包,在数据包中指明目的地IP与端口DatagramPacket packet= DatagramPacket(byte buf[], int offset, int length,InetAddress address, int port);
socket.send(packet);

3.接收数据的一般步骤:

DatagramSocket socket=new DatagramSocket(int port);//创建监听指定端口的数据报套接字DatagramPacket packet=new DatagramPacket(byte buf[], int length);
socket.receive(packet);


以上是关于网络通信的实例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Spring Boot子线程如何访问主线程的请求信息?Spring Boot子线程如何访问主线程的请求信息?Apr 19, 2025 pm 06:03 PM

SpringBoot子线程无法访问主线程Request信息解决方案在Spring...

Java单线程下的指令重排序会影响System.out.println的输出顺序吗?Java单线程下的指令重排序会影响System.out.println的输出顺序吗?Apr 19, 2025 pm 06:00 PM

Java单线程下的指令重排序与输出顺序在Java编程中,指令重排序是一个常见的优化技术,用于提高程序的执行效�...

IntelliJ IDEA是如何通过JavaAgent技术识别Spring Boot项目的端口号的?IntelliJ IDEA是如何通过JavaAgent技术识别Spring Boot项目的端口号的?Apr 19, 2025 pm 05:57 PM

IntelliJIDEA如何识别SpringBoot项目的端口号?在使用IntelliJIDEAUltimate版本时,启动Spring...

如何通过 OAuth2.0 的 scope 机制精细控制 access_token 的接口访问权限?如何通过 OAuth2.0 的 scope 机制精细控制 access_token 的接口访问权限?Apr 19, 2025 pm 05:54 PM

通过OAuth2.0的access_token如何精细控制接口访问权限?在现代应用开发中,OAuth2.0...

RuoYi框架如何实现Bean依赖注入而无需显式编写DataSource实现类?RuoYi框架如何实现Bean依赖注入而无需显式编写DataSource实现类?Apr 19, 2025 pm 05:51 PM

深入剖析RuoYi框架的Bean依赖注入机制:无需显式实现类RuoYi框架是一个流行的Java前后端分离框架,其简洁的代码...

使用RedisTemplate进行批量查询时返回值为空的原因是什么?如何解决这个问题?使用RedisTemplate进行批量查询时返回值为空的原因是什么?如何解决这个问题?Apr 19, 2025 pm 05:48 PM

使用RedisTemplate进行批量查询时返回值为空的原因及解决方案在使用SpringData...

在Java中如何在一个Map中使用不同类型的Key?在Java中如何在一个Map中使用不同类型的Key?Apr 19, 2025 pm 05:45 PM

在Java中如何在同一个Map中使用不同类型的Key在Java编程中,我们经常会使用Map数据结构来存储键值对。然而,有�...

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用