Java基础之网络编程

举报
小小张自由--张有博 发表于 2021/11/22 23:26:41 2021/11/22
【摘要】     Java基础之网络编程 基本概念 Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。 构造函数与常用方法 客户端实现步骤--使用Socket类 ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。 构造函数与...
 
 

基本概念

IP:每个电脑都有一个IP地址,在局域网内IP地址是可变的。

网络通信协议通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格

式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守,最终完成数据交换。

TCP协议(传输控制协议):是面向连接的传输层协议,应用程序在使用TCP之前,必须先建立TCP连接,在传输数据完毕后,必须释放已经建立的连接(跟打电话是否类似)。TCP可以保证从一端将数据传送至连接的另一端时,数据能够准确送达,而且送到的数据的排列顺序和送出时的顺序相同。

UDP协议(用户数据报协议):是无连接的通信协议,不保证可靠的数据传输,但能够向若干个目标发送数据,接收发自若干个源的数据。(在线影片,下载文件)。

端口(Port):如果把IP地址比作一间房子 ,端口就是出入这间房子的门。

套接字(Socket)用于将应用程序与端口连接起来,类似于连接电器与电线的插座。

在Java中,提供了两个类用于实现TCP通信程序:

1.客户端:java.net.Socket类表示。创建Socket对象,向服务端发送连接请求,服务端相应请求,两者建立连接开始通信。

2.服务端:java.net.ServerSocket 类表示创建 ServerSocket 对象,相当于开启一个服务,并等待客户端的连接。


Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。

构造函数与常用方法

public Socket(String host, int port) :创建套接字对象并将其连接到指定主机上的指定端口号。如果指定的hostnull ,则相当于指定地址为回送地址。

public InputStream getInputStream() : 返回此套接字的输入流。

        如果此Scoket具有相关联的通道,则生成的InputStream 的所有操作也关联该通道。 关闭生成的InputStream也将关闭相关的Socket

public OutputStream getOutputStream() : 返回此套接字的输出流。

        如果此Scoket具有相关联的通道,则生成的OutputStream 的所有操作也关联该通道。 关闭生成的OutputStream也将关闭相关的Socket

public void close() :关闭此套接字。 一旦一个socket被关闭,它不可再使用。 关闭此socket也将关闭相关的InputStreamOutputStream

public void shutdownOutput() : 禁用此套接字的输出流。 任何先前写出的数据将被发送,随后终止输出流

客户端实现步骤--使用Socket

1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号

2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象

3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据

4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象

5.使用网络字节输入流InputStream对象中方法read,读取服务器回写的数据

6.使用资源(Socket.Close)


  
  1. public static void main(String[] args) throws IOException {
  2. //1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
  3. Socket socket = new Socket("127.0.0.1",8888);
  4. //2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
  5. OutputStream os = socket.getOutputStream();
  6. //3.使用网络字节输出流OutputStream对象中的方法write,给服务器发送数据
  7. os.write("你好服务器".getBytes());
  8. //4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
  9. InputStream is = socket.getInputStream();
  10. //5.使用网络字节输入流InputStream对象中方法read,读取服务器回写的数据
  11. byte[] bytes = new byte[1024];
  12. int len = is.read(bytes);
  13. System.out.println(new String(bytes,0,len));
  14. //6.使用资源(Socket.Close)
  15. socket.close();
  16. }

ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。

构造函数与常用方法

public ServerSocket(int port) :使用该构造方法在创建ServerSocket对象时,就可以将其绑定到一个指定的端口号上,参数port就是端口号。

public Socket accept() :侦听并接受连接,返回一个新的 Socket 对象,用于和客户端实现通信。该方法会一直阻塞直到建立连接。

 服务器端实现步骤--使用ServerSocket

1.使用服务器ServerSocket对象和系统要指定的端口号

2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象socket

3.使用Socket对象中的getInputStream()获取网络字节输入流Inputstream对象

4.使用网络字节输入流InputStream对象中方法read,读取客户端发送的数据

5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象

6.使用网络字节输出流Outputstream对象中的方法Write,给客户端回写数据

7.释放资源(Socket,ServerSocket)


  
  1. public static void main(String[]args)throws IOException{
  2. //1.使用服务器ServerSocket对象和系统要指定的端口号
  3. ServerSocket server=new ServerSocket(8888);
  4. //2.使用ServerSocket对象中的方法accept,获取到请求的客户端对象socket
  5. Socket socket=server.accept();
  6. //3.使用Socket对象中的getInputStream()获取网络字节输入流Inputstream对象
  7. InputStream is=socket.getInputStream();
  8. //4..使用网络字节输入流InputStream对象中方法read,读取客户端发送的数据
  9. byte[]bytes=new byte[1024];
  10. int len=is.read(bytes);
  11. System.out.println(new String(bytes,0,len));
  12. //5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
  13. OutputStream os=socket.getOutputStream();
  14. //6.使用网络字节输出流Outputstream对象中的方法Write,给客户端回写数据
  15. os.write("收到谢谢".getBytes());
  16. //7.释放资源(Socket,ServerSocket)
  17. server.close();
  18. socket.close();
  19. }

文件上传练习

客户端


  
  1. public static void main(String[]args)throws IOException{
  2. //1.创建一个本地字节输入流FileInputStream对象,构造方法中绑定要读取的数据源
  3. FileInputStream fis=new FileInputStream("c:\\1.jpg");
  4. //2.创建一个客户端Socket对象,构造方法中绑定服务器的IP地址和端口号
  5. Socket socket=new Socket("127.0.0.1",8888);
  6. //3.使用Socket中的方法getOutputStream,获取网络字节输出流OutputStream对象
  7. OutputStream os=socket.getOutputStream();
  8. //4.使用本地字节输入流FileInputStream对象中的方法read,读取本地文件
  9. int len=0;
  10. byte[]bytes=new byte[1024];
  11. while((len=fis.read(bytes))!=-1){
  12. //5.使用网络字节输出流OutputStream对象中的方法write,把读取到的文件上传到服务器
  13. os.write(bytes,0,len);
  14. }
  15. /*
  16. 解决:上传完文件,给服务器写一个结束标记
  17. voidshutdownOutput()禁用此套接字的输出流。
  18. 对于TCP套接字,任何以前写入的数据都将被发送,并且后跟TCP的正常连接终止序列。
  19. */
  20. socket.shutdownOutput();
  21. //6.使用Socket中的方法getInputStream,获取网络字节输入流InputStream对象
  22. InputStream is=socket.getInputStream();
  23. System.out.println("333333333333333333333");
  24. //7.使用网络字节输入流InputStream对象中的方法read读取服务回写的数据
  25. while((len=is.read(bytes))!=-1){
  26. System.out.println(new String(bytes,0,len));
  27. }
  28. System.out.println("444444444444444444while死循环打印不到");
  29. //8.释放资源(FileInputStream,Socket)
  30. fis.close();
  31. socket.close();
  32. }

 服务端


  
  1. public static void main(String[]args)throws IOException{
  2. //1.创建一个服务器ServerSocket对象,和系统要指定的端口号
  3. ServerSocket server=new ServerSocket(8888);
  4. //2.使用ServerSocket对象中的方法accept,获取到请求的客户端Socket对象
  5. Socket socket=server.accept();
  6. //3.使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象
  7. InputStream is=socket.getInputStream();
  8. //4.判断d:\\upload文件夹是否存在,不存在则创建
  9. File file=new File("d:\\upload");
  10. if(!file.exists()){
  11. file.mkdirs();
  12. }
  13. //5.创建一个本地字节输出流FileOutputStream对象,构造方法中绑定要输出的目的地
  14. FileOutputStream fos=new FileOutputStream(file+"\\1.jpg");
  15. //6.使用网络字节输入流InputStream对象中的方法read,读取客户端上传的文件
  16. System.out.println("11111111111111111111");
  17. int len=0;
  18. byte[]bytes=new byte[1024];
  19. while((len=is.read(bytes))!=-1){
  20. //7.使用本地字节输出流FileOutputStream对象中的方法write,把读取到的文件保存到服务器的硬盘上
  21. fos.write(bytes,0,len);
  22. }
  23. System.out.println("22222222222222222222222while死循环打印不到");
  24. //8.使用Socket对象中的方法getOutputStream,获取到网络字节输出流OutputStream对象
  25. //9.使用网络字节输出流OutputStream对象中的方法write,给客户端回写"上传成功"
  26. socket.getOutputStream().write("上传成功".getBytes());
  27. //10.释放资源(FileOutputStream,Socket,ServerSocket)
  28. fos.close();
  29. socket.close();
  30. server.close();
  31. }

创作不易,如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。

文章来源: blog.csdn.net,作者:小小张自由—>张有博,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/promsing/article/details/112792700

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。