Java第二十一章总结

2023-12-13 21:27:47
网络编程三要素

ip地址:计算机在网络中的唯一标识
端口:应用程序在计算机中唯一标识
协议:通信协议,常见有UDP和TCP协议

InetAddress类

表示Internet协议地址

? ? ? ? //返回InetAddress对象
? ? ? ? InetAddress byName = InetAddress.getByName("DESKTOP-1ET1T7L");

? ? ? ? //返回计算机名
? ? ? ? String hostName = byName.getHostName();

? ? ? ? //返回Ip地址
? ? ? ? String hostAddress = byName.getHostAddress();

端口
端口号:用两个字节表示的整数,它的取值范围是0~ 65535。其中,0~1023之间的端口号用于一些知名的网络服务和应用,普通的应用程序需要使用1024以上的端口号。如果端口号被占用,会导致程序启动失败

协议
计算机网络中,连接和通信的规则被称为网络通信协议

UDP协议
?用户数据报协议(User Datagram Protocol)
?UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接
?UDP协议消耗系统资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输

TCP协议
?传输控制协议 (Transmission Control Protocol)

?TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

?在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”

三次握手:
??第一次握手,客户端向服务器端发出连接请求,等待服务器确认

??第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

??第三次握手,客户端再次向服务器端发送确认信息,确认连接

UDP发送数据
Java提供了DatagramSocket类作为基于UDP协议的Socket

构造方法

?相关方法

?? ??? ?//创建一个发送数据Socket对象
? ? ? ? DatagramSocket ds=new DatagramSocket();
? ? ? ? //创建一个包,用于存放要发送的数据
? ? ? ? byte[] bys="hello".getBytes();
? ? ? ? DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),8888);
? ? ? ? //发送数据
? ? ? ? ds.send(dp);
? ? ? ? ds.close();
? ? ??

?

UDP接受数据

构造方法

方法名说明
DatagramPacket(byte[] buf, int len)创建一个DatagramPacket用于接收长度为len的数据包

相关方法

? ? ? ? //创建一个接收端的Socket对象
? ? ? ? DatagramSocket ds=new DatagramSocket(8888);
? ? ? ??
? ? ? ? //创建一个接受数据的包
? ? ? ? byte[] bys=new byte[1024];
? ? ? ? DatagramPacket dp=new DatagramPacket(bys,bys.length);
? ? ? ??
? ? ? ? //接收数据
? ? ? ? ds.receive(dp);
? ? ? ? //获取数据
? ? ? ? byte[] data = dp.getData();
? ? ? ? //dp.getLength是接受到的数据长度
? ? ? ? System.out.println(new String(data,0,dp.getLength()));
?? ??? ?ds.close();
?

UDP三种通讯方式

单播:两个主机之间的端对通信

组播:对一组特定的主机进行通信

广播:一个主机对整个局域网所有主机通信

组播代码实现:

//发送端
?? ??? ?//创建发送端的Socket对象
? ? ? ? DatagramSocket ds=new DatagramSocket();
? ? ? ? //创建数据包,
? ? ? ? byte[] bys="hello".getBytes();
? ? ? ? DatagramPacket dp=new DatagramPacket(bys,bys.length, InetAddress.getByName("224.0.1.1"),8888);
? ? ? ? //发送
? ? ? ? ds.send(dp);
? ? ? ? //释放资源
? ? ? ? ds.close();
? ? ? ??
//========================================================
//接收端

? ? ? ? //创建一个接收端的Socket对象
? ? ? ? MulticastSocket ms=new MulticastSocket(8888);
? ? ? ? //创建一个接受数据的包
? ? ? ? byte[] bys=new byte[1024];
? ? ? ? DatagramPacket dp=new DatagramPacket(bys,bys.length);

? ? ? ? //把当前电脑绑定一个组播地址
? ? ? ? ms.joinGroup(InetAddress.getByName("224.0.1.1"));

? ? ? ? //接收数据
? ? ? ? ms.receive(dp);
? ? ? ? //获取数据
? ? ? ? byte[] data = dp.getData();
? ? ? ? //dp.getLength是接受到的数据长度
? ? ? ? System.out.println(new String(data,0,dp.getLength()));
? ? ? ? ms.close();

TCP发送数据
客户端用用Socket类,
服务器端用ServerSocket类

Socket构造方法


相关方法方

? ? ? ? //创建一个客户端Socket对象
? ? ? ? Socket s=new Socket("127.0.0.1",8888);
? ? ? ? //获取输出流,输出数据
? ? ? ? OutputStream outputStream = s.getOutputStream();
? ? ? ? outputStream.write("hello".getBytes());
? ? ? ? //释放资源
? ? ? ? s.close();
?

TCP接收数据

构造方法

方法名说明
ServletSocket(int port)创建绑定到指定端口的服务器套接字

相关方法

方法名说明
Socket accept()监听要连接到此的套接字并接受它

? ? ? ? //创建服务器端ServerSocket对象
? ? ? ? ServerSocket ss=new ServerSocket(8888);
? ? ? ? //监听
? ? ? ? Socket accept = ss.accept();
? ? ? ? //创建一个输入流对象接收数据
? ? ? ? InputStream inputStream = accept.getInputStream();
? ? ? ? byte[] bytes=new byte[1024];
? ? ? ? int len=inputStream.read(bytes);
? ? ? ? String data =new String(bytes,0,len);
? ? ? ? System.out.println(data);
? ? ? ? accept.close();
? ? ? ? ss.close();
?

文件上传

从本地读取文件数据,发送给服务器端
服务器端接受数据后,保存到服务器本地

?

//客户端

? ?//获取客户端Socket对象
? ? ? ? Socket s = new Socket("127.0.0.1", 8888);
? ? ? ? //从本地读取要上次的文件
? ? ? ? BufferedInputStream bis = new BufferedInputStream(new FileInputStream("JavaSE\\aa.jpg"));
? ? ? ? OutputStream os = s.getOutputStream();
? ? ? ? byte[] bys = new byte[1024];
? ? ? ? int i;
? ? ? ? while ((i = bis.read(bys)) != -1) {
? ? ? ? ? ? // os.write(i);
? ? ? ? ? ? os.write(bys, 0, i);
? ? ? ? }

? ? ? ? os.flush();

? ? ? ? //给服务器一个结束标记,标识已经传输完毕
? ? ? ? s.shutdownOutput();

? ? ? ? //获取服务器给回的信息
? ? ? ? BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
? ? ? ? String line;
? ? ? ? while ((line = br.readLine()) != null) {
? ? ? ? ? ? System.out.println(line);
? ? ? ? }

? ? ? ? //释放资源
? ? ? ? bis.close();
? ? ? ? s.close();

//======================================

//服务器端

?//创建服务器ServerScoket对象
? ? ? ? ServerSocket ss = new ServerSocket(8888);
? ? ? ? //开始监听
? ? ? ? Socket s = ss.accept();
? ? ? ? //接受客户端数据
? ? ? ? InputStream is = s.getInputStream();
? ? ? ? //创建一个字符缓冲流保存接受的数据
? ? ? ? BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("JavaSE\\bb.jpg"));
? ? ? ? int len;
? ? ? ? byte[] bys = new byte[1024];
? ? ? ? while ((len = is.read(bys)) != -1) {
? ? ? ? ? ? bos.write(bys, 0, len);
? ? ? ? }
? ? ? ? //告诉客户端已经接受完毕
? ? ? ? s.shutdownInput();

? ? ? ? //给客户端返回“上传成功信息”
? ? ? ? BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
? ? ? ? bw.write("上传成功");
? ? ? ? bw.newLine();
? ? ? ? bw.flush();

? ? ? ? //释放资源
? ? ? ? bos.close();
? ? ? ? s.close();
? ? ? ? ss.close();


?

文章来源:https://blog.csdn.net/xhlxhlqwe/article/details/134869687
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。