Java网络编程基础

这篇具有很好参考价值的文章主要介绍了Java网络编程基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java网络编程基于TCP/UDP协议的基础之上,TCP/IP协议是一个协议簇。里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。那么首先我们先介绍一下TCP和UDP的特点:

1.TCP(Transmission Control Protocol,传输控制协议)是面向连接的,也就是说在以TCP协议发送数据的之前需要两台主机建立连接,一个TCP连接必须要经过三次“对话”才能建立起来,也俗称“三次握手”,其中的过程非常复杂,下面将以简单的形式介绍一下三次握手的过程:

有两台主机,主机A与主机B。

1)主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;

2)主机B向主机A发送同意连接和要求同步 (同步就是两台主机一个在发送,一个在接收,协调工作)的数据包 :“可以,你什么时候发?”,这是第二次对话;

3)主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”, 这是第三次对话。

三次“对话”的目的是使数据包的发送和接收同步, 经过三次“对话”之后,主机A才向主机B正式发送数据。

TCP建立连接需要三次握手,而断开连接需要四次,即四次挥手:

1)主机A向主机B发送请求断开连接,这是第一次对话;

2)主机B收到主机A的断开连接请求,返回确认,这是第二次对话;

3)主机B在接收完所有数据之后,向主机A发送确认断开连接,这是第三次对话;

4)主机A回复确认断开,这是第四次对话;

这四次对话完成之后,主机A和主机B才正式断开连接。

2.UDP(User Data Protocol,用户数据报协议),与TCP相反,UDP是不面向连接的协议,所以也是不可靠传输,只能尽力传输数据而保证数据传输的可靠性,常用于视频会议或者消息发送等服务。

了解了基本的概念特点之后,我们将使用Java编程的方式来实现基于这两种协议的数据传输过程:

UDP

传输数据与我们生活中寄快递很相似,在寄快递的时候,我们首先要用一个盒子将物品打包起来,再通过物流公司寄送出去,那么传输数据也是类似的:

首先client,DatagramSocket对象就类似与快递公司,负责最后的物品寄送,DatagramPacket对象就类似于打包过程,将所需要的数据进行打包。

 1 public class SendMessageDemo {
 2     public static void main(String[] args) throws IOException {
 3         //采用UDP协议发送数据
 4         //1.创建DatagramSocket对象(快递公司,负责发送数据)
 5         //空参 随机绑定一个端口号进行使用 有参则指定端口号进行绑定
 6         DatagramSocket ds = new DatagramSocket();
 7         InetAddress address = InetAddress.getByName("127.0.0.1");
 8         int port = 10087;
 9         //2.打包数据,用字节数组的形式发送
10         String str = "Hello world!";
11         byte[] bytes = str.getBytes();
12         DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
13         //3.发送数据
14         ds.send(dp);
15         //4.释放资源
16         ds.close();
17 
18     }
19 }

对于Server端,接收到client发送的数据之后,需要对这些字节进行解析,才能够知道发送的是什么内容:

 1 public class ReceiveMessageDemo {
 2     public static void main(String[] args) throws IOException {
 3         //先运行接收进程,再运行发送进程
 4         //创建快递公司用来接收数据包,必须绑定跟发送端发送的端口一致
 5         DatagramSocket ds = new DatagramSocket(10087);
 6 
 7         //2.接收数据包
 8         byte[] bytes = new byte[1024];
 9         //使用空的数据包存储数据
10         DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
11         //该方法是阻塞的,会一直等待发送方发送消息
12         ds.receive(dp);
13 
14         //3.解析数据包
15         byte[] data = dp.getData();//获取接收到的数据
16         int length = dp.getLength();//获取接收到的数据的长度
17         String str = new String(data,0,length);//解析成字符串的形式
18         InetAddress address = dp.getAddress();//获取发送方的IP信息
19         int port = dp.getPort();
20         System.out.println("接收到的信息为:"+str+",来自主机:"+address+"端口为:"+port);
21         System.out.println("长度为:"+length);
22 
23 
24     }
25 }

如果想发送多条消息呢?我们可以使用while循环来接收用户键盘输入的消息:

 1 public class SendMessageAgent {
 2     public static void main(String[] args) throws IOException {
 3 
 4         //发送方端口可以不指定随机使用
 5         DatagramSocket ds = new DatagramSocket();
 6 
 7         //创建要发送的数据包
 8         Scanner scanner = new Scanner(System.in);
 9         while(true) {
10             System.out.println("请输入你要发送的内容:");
11             String s = scanner.nextLine();
12             if (s.equals("886")) {
13                 break;
14             }
15             //将输入的字符串转为字节数组发送
16             byte[] message = s.getBytes();
17 
18             //选择发送的主机和端口
19             InetAddress address = InetAddress.getByName("127.0.0.1");
20             int port = 10088;
21             DatagramPacket dp = new DatagramPacket(message, message.length, address, port);
22 
23             //发送
24             ds.send(dp);
25         }
26         //释放资源
27         ds.close();
28     }
29 }

TCP

如果要使用TCP协议发送数据,那么和UDP所需要的对象是不一样的:

 1 public class Client {
 2     public static void main(String[] args) throws IOException {
 3         //TCP协议
 4         //1.创建socket对象
 5         //该对象绑定需要连接的主机与端口,如果连接失败则代码报错
 6         Socket socket = new Socket("127.0.0.1",10000);
 7 
 8         //TCP中以IO输出流的形式发送,以输入流的形式接收
 9         //2.获取输出流,并写入数据
10         OutputStream os = socket.getOutputStream();
11         os.write("hello world!你们好".getBytes());
12 
13         //释放资源 这里进行四次挥手
14         os.close();
15         socket.close();
16 
17     }
18 }
public class Server {
    public static void main(String[] args) throws IOException {

        //1.创建serverSocket,并绑定接收端口(必须与发送的端口相同)
        ServerSocket socket = new ServerSocket(10000);

        //2.监听连接,如果连接成功则返回一个socekt对象,没有连接成功则阻塞等待
        Socket accept = socket.accept();//这里进行三次握手

        //3.从accept中读取输入流,并获取信息
        InputStream is = accept.getInputStream();
        //字节流,一个字节一个字节的读入,但是中文会出错,一个中文三个字节,读入的时候会导致中文乱码
        InputStreamReader isr = new InputStreamReader(is);//字符流,一个字符一个字符的读入,解决中文问题
        BufferedReader br = new BufferedReader(isr);//提升读取效率
        int b;
        while((b=br.read()) != -1){//需要定义结束标记,不然会一直卡死在这里等待读取
            System.out.print((char) b);
        }
        //收到信息后写入反馈
        InetAddress address = accept.getInetAddress();
        OutputStream outputStream = accept.getOutputStream();
        String returnMessage = "已经收到:"+address.getHostAddress()+address.getHostName()+"发来的信息!";
        outputStream.write(returnMessage.getBytes());
        //4.释放资源
        accept.close();
        socket.close();
    }
}

需要先运行server端代码,再运行client端代码,因为client端如果没有找到对应主机则会报错。

 文件传输

client端:

 1 public class client {
 2     public static void main(String[] args) throws IOException {
 3         Socket socket = new Socket("127.0.0.1",10000);
 4 
 5         BufferedInputStream bis = new BufferedInputStream(new FileInputStream("mysocketnet/clientdir/neural.png"));
 6         BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
 7 
 8         byte[] bytes = new byte[1024];
 9         int len;
10         while((len=bis.read(bytes)) != -1){
11             bos.write(bytes,0,len);
12         }
13 
14         socket.shutdownOutput();
15         //获取服务器的回写数据
16         BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
17         String line = br.readLine();
18         System.out.println(line);
19 
20         socket.close();
21     }
22 }

通过多线程来解决多用户同时上传文件的问题,每有一个用户建立连接就新创建一个线程来处理上传文件的请求,可以采用线程池进行优化,采用runnable的方式创建线程,这样我们可以定义自己的runnable方法来处理文件上传请求:

 1 public class server {
 2     public static void main(String[] args) throws IOException {
 3 
 4         ServerSocket serverSocket = new ServerSocket(10000);
 5         Socket accept = serverSocket.accept();
 6         //每建立一个连接,就创建一个线程来处理上传请求!
 7         //创建线程池对象
 8         ThreadPoolExecutor pool = new ThreadPoolExecutor(
 9                 3,//核心线程数量
10                 16,//线程池总大小
11                 60,//空闲时间
12                 TimeUnit.SECONDS,
13                 new ArrayBlockingQueue<Runnable>(2),
14                 Executors.defaultThreadFactory(),
15                 new ThreadPoolExecutor.AbortPolicy()
16         );
17         //new Thread(new SocketRunnable(accept) ).start();
18         pool.submit(new SocketRunnable(accept));
19 
20     }
21 }
public class SocketRunnable implements Runnable{
    Socket accept;
    public SocketRunnable(Socket accept){
        this.accept = accept;
    }
    @Override
    public void run() {
        try {
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet/serverdir/neural.png"));
            BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());

            byte[] bytes = new byte[1024];
            int len;
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
            //回写数据
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
            bw.write("上传成功!");
            bw.newLine();
            bw.flush();
        }catch (Exception e){
            System.out.println("上传失败");
        }finally {
            try {
                if(accept != null){
                accept.close();}
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

 文章来源地址https://www.toymoban.com/news/detail-711747.html

到了这里,关于Java网络编程基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [网络编程]UDP协议,基于UDP协议的回显服务器

    目录 1.UDP协议介绍 2.UDP协议在Java中的类 2.1DatagramSocket类 2.2DatagramPacket 3.回显服务器 3.1Sever端  3.2Client端   UDP协议是一种网络协议,它是无连接的,全双工,并且是面向数据报,不可靠的一种协议。 常用于在线视频播放,游戏这种实时性要求比较高的应用。或者无需可靠传输

    2024年01月22日
    浏览(56)
  • 网络编程day2——基于TCP/IP协议的网络通信

            计算机S                                                 计算机C      创建socket对象                                   创建socket对象      准备通信地址(自己的ip(非公网ip))      准备通信地址                                     (计算

    2024年02月10日
    浏览(68)
  • 网络编程——基于TCP协议的通讯录【课程设计】

    题目:基于TCP协议的通讯录 设计目标: (1)了解Socket通信的原理,在此基础上编写一个基于TCP协议的通讯录; (2)理解TCP通信原理; 课程设计系统组成及模块功能: 此TCP/IP课程设计实现了基于TCP的客户/服务器通信程序,需要实现以下一些基本功能: (1)客户端连接服务

    2024年02月06日
    浏览(84)
  • 【Java网络编程】HTTP超文本传输协议

        HTTP 全称为 Hyper Text Transfer Protocol 超文本传输协议,它是基于 TCP 传输协议构建的应用层协议,作为支撑万维网 www 的核心协议,为了保证其效率及处理大量事务的能力,因此在设计时, HTTP 被制定成为一种无状态协议,也就是说: HTTP 本身不会对发送过的请求和相应的通

    2024年04月09日
    浏览(62)
  • 【Java网络编程】OSI七层网络模型与TCP/IP协议簇

    1.1、OSI七层网络模型 OSI七层网络模型中,每层的功能如下: 应用层:人与计算机网络交互的窗口。 表示层:负责数据格式的封装,如加密、压缩、编解码等。 会话层:建立、终止、管理不同端间的会话连接。 传输层:提供端到端(两台机器)之间的传输机制,以及提供流

    2024年04月11日
    浏览(48)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(84)
  • 【Java EE初阶十五】网络编程TCP/IP协议(二)

            tcp的socket api和U大片的socket api差异很大,但是和前面所讲的文件操作很密切的联系         下面主要讲解两个关键的类:         1、ServerSocket:给服务器使用的类,使用这个类来绑定端口号         2、Socket:即会给服务器使用,又会给客户端使用;         

    2024年02月20日
    浏览(51)
  • 【网络编程】——基于TCP协议实现回显服务器及客户端

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【网络编程】【Java系列】 本专栏旨在分享学习网络编程的一点学习心得,欢迎大家在评论区交流讨论💌 TCP提供的API主要有两个类 Socket ( 既会给服务器使用也会给客

    2024年02月03日
    浏览(65)
  • Java 网络编程基础

    一个网络请求、服务之间的调用都需要进行网络通讯,在日常开发时我们可能并不会关心我们的服务端是怎么接收到请求的、调用别的服务是怎么调用的,都是直接使用现成的框架或工具,比如,Tomcat、Dubbo、OkHttp等提供网络服务的框架。作为程序员,我们还是要知其然知其

    2024年02月15日
    浏览(38)
  • Java网络编程基础

    Java网络编程基于TCP/UDP协议的基础之上,TCP/IP协议是一个协议簇。里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就用他两命名了。那么首先我们先介绍一下TCP和UDP的特点: 1.TCP(Transmission Control Protocol,传输控制协议

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包