12.7-全栈java笔记:java网络编程

     2022-03-20     787

关键词:

UDP通讯的实现

1.DatagramSocket:用于发送或接收数据包

当服务器要向客户端发送数据时,需要在服务器端产生一个DatagramSocket对象,在客户端产生一个DatagramSocket对象。服务器端的DatagramSocket将DatagramPacket发送到网络上,然后被客户端的DatagramSocket接收。

DatagramSocket有两种构造函数。一种是无需任何参数的,常用于客户端。另一种需要指定端口,常用于服务器。

常用方法:send、receive、 close

 

2.DatagramPacket:数据容器(封包)的作用

常用方法:构造函数、getAddrress(获取发送或接收方计算机的IP地址)、getData(获取发送或接收的数据)、setData(设置发送的数据)

 

3.UDP通信编程基本步骤:

a)创建客户端的DatagramSocket,创建时,定义客户端的监听端口

b)创建服务器端的DatagramSocket,创建时,定义服务器端的监听端口

c)在服务器端定义DatagramPacket对象,封装待发送的数据包。

d)服务器端将数据包发送出去

e)客户端接收数据包

【示例1】客户端与服务器端单向通信之客户端

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetSocketAddress;

 

public class Client {

    public static void main(String[] args) throws   Exception {

       byte[] b = "aaaa".getBytes();

        //必须告诉数据包要发到哪里去

       DatagramPacket dp = new DatagramPacket(b,b.length,new   InetSocketAddress("localhost",8999));

       //我本身占用9000端口向外面机器发数据包

       DatagramSocket ds = new DatagramSocket(9000);

       ds.send(dp);

       ds.close();

    }

} 

【示例2】客户端与服务器端单向通信之服务器端

import java.net.DatagramPacket;

import java.net.DatagramSocket;

 

public class Server {

    public static void main(String[] args) throws   Exception {

       DatagramSocket ds = new DatagramSocket(8999);

       byte[] b = new byte[1024];

       DatagramPacket dp = new DatagramPacket(b,b.length);

      

       ds.receive(dp);  //阻塞式方法

       String string = new   String(dp.getData(),0,dp.getLength());    //dp.getLength()返回实际收到的数据的字节数

       System.out.println(string);

       ds.close();

    }

}

通过ByteArrayInputStreamByteArrayOutputStream可以传递基本类型数据。

【示例3】客户端

public class Client {

    public static void main(String[] args) throws   Exception {

       long n = 2000L;

        ByteArrayOutputStream bos = new ByteArrayOutputStream();

       DataOutputStream   dos = new   DataOutputStream(bos);

       dos.writeLong(n);

       byte[] b = bos.toByteArray();

      

       //必须告诉数据包要发到哪里去

       DatagramPacket dp = new DatagramPacket(b,b.length,new   InetSocketAddress("localhost",8999));

       //我本身占用9000端口向外面机器发数据包

       DatagramSocket ds = new DatagramSocket(9000);

       ds.send(dp);

       ds.close();

    }

} 

【示例4】服务器端

public class Server {

    public static void main(String[] args) throws   Exception {

       DatagramSocket ds = new DatagramSocket(8999);

       byte[] b = new byte[1024];

       DatagramPacket dp = new DatagramPacket(b,b.length);

      

       ds.receive(dp);  //阻塞式方法

       ByteArrayInputStream   bis = new   ByteArrayInputStream(dp.getData());

       DataInputStream   dis = new   DataInputStream(bis);

       System.out.println(dis.readLong());

       ds.close();  

}

}

通过ByteArrayInputStreamByteArrayOutputStream可以传递对象。

【示例5Person(客户端与服务器端都需要存在Person)

class Person implements Serializable{

    int age;

    String name;

    public Person(int age, String name) {

       super();

       this.age = age;

       this.name = name;

    }

}

【示例6】客户端

public class Client {

    public static void main(String[] args) throws   Exception {

       Person person = new Person(20,"aa");

 

       ByteArrayOutputStream   bos = new   ByteArrayOutputStream();

       ObjectOutputStream   oos = new   ObjectOutputStream(bos);

       oos.writeObject(person);

       byte[] b = bos.toByteArray();

      

       //必须告诉数据包要发到哪里去

       DatagramPacket dp = new DatagramPacket(b,b.length,new   InetSocketAddress("localhost",8999));

       //我本身占用9000端口向外面机器发数据包

       DatagramSocket ds = new DatagramSocket(9000);

       ds.send(dp);

       ds.close();

    }

}  

【示例7】服务器端

public class Server {

    public static void main(String[] args) throws   Exception {

       DatagramSocket ds = new DatagramSocket(8999);

       byte[] b = new byte[1024];

       DatagramPacket dp = new DatagramPacket(b,b.length);

      

       ds.receive(dp);  //阻塞式方法

 

       ByteArrayInputStream   bis = new   ByteArrayInputStream(dp.getData());

       ObjectInputStream   ois = new   ObjectInputStream(bis);

       Person   person = (Person) ois.readObject();

       System.out.println(person.name);

       ds.close();

    }

}




「全栈Java笔记」是一部能帮大家从零到一成长为全栈Java工程师系列笔记。笔者江湖人称 Mr. G,10年Java研发经验,曾在神州数码、航天院某所研发中心从事软件设计及研发工作,从小白逐渐做到工程师、高级工程师、架构师。精通Java平台软件开发,精通JAVAEE,熟悉各种流行开发框架。


 笔记包含从浅入深的六大部分:

 A-Java入门阶段

 B-数据库从入门到精通

 C-手刃移动前端和Web前端

 D-J2EE从了解到实战

 E-Java高级框架精解

 F-Linux和Hadoop 



本文出自 “12931675” 博客,请务必保留此出处http://12941675.blog.51cto.com/12931675/1946251

12.4-全栈java笔记:java网络编程

 基于TCP协议的Socket编程和通信在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务... 查看详情

12.6-全栈java笔记:java网络编程

上节回顾:在学习了Socket建立客户端和服务器双向交流后,我们发现它的问答形式不够灵活。本节课我们讲解如何在服务器和客户端之间实现聊天室~需要思考的问题:服务器端:一个线程专门发送消息,一个线程专门接收消息... 查看详情

12.5-全栈java笔记:java网络编程

上节回顾:在学习了Socket在建立客户端和服务器单项通讯中,分别创建独立的Socket,并通过Socket的属性。那么如何将两个Socket进行连接,从而达到客户端和服务器之间建立输入输出流进行通信呢?在上节中我们已经讲到,TCP/IP套... 查看详情

12.1-全栈java笔记:网络编程的基本概念

什么是计算机网络?把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。计算机网络的主要功... 查看详情

12.2-全栈java笔记:tcp协议和udp协议

...发送失败则客户端无法获得。这两种传输方式都是实际的网络编程中进行使用,重要的数据一般使用TCP方式进行数据传输,而大 查看详情

11.1-全栈java笔记:多线程技术的基本概念

多线程是JAVA语言的重要特性,大量应用于网络编程、应用于服务器端程序的开发、以及最常见的UI界面底层原理、操作系统底层原理都大量使用了多线程。我们可以流畅的点击软件或者游戏中的各种按钮,其实,底层就是多线程... 查看详情

10.1-全栈java笔记:最全面的io技术

IO技术对于任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能。程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件、数据库、其他程序、网络、IO设备等等。外部系统比较复杂... 查看详情

10.8-全栈java笔记:序列化/反序列化的步骤和实例

 本节我们详细讲解10.3节中提到的序列化和反序列化操作。序列化和反序列化是什么当两个进程远程通信时,彼此可以发送各种类型的数据。 无论是何种类型的数据,都会以二进制序列的形式在网络上传送。比如,我们... 查看详情

4.1-全栈java笔记:对象的进化史

面向对象和面向过程的区别面向过程编程思想思考问题时,我们首先思考“怎么按步骤实现?”并将步骤对应成方法,一步一步,最终完成。 这个适合简单任务,不需要过多协作的情况下。比如,如何开车?我们很容易就列... 查看详情

java语言程序设计基础篇编程练习题12.7

1packagetest.com;23importjava.awt.GridLayout;45importjavax.swing.*;6/*7*显示一个包含9个标签的框架,标签有3类图形。圈、叉和空白8*每次运行随机显示9*/10publicclassGameextendsJFrame{11privateImageIconx=newImageIcon("d:\x.jpg");12privateI 查看详情

4.3-全栈java笔记:面向对象的内存分析

面向对象的内存分析为了让大家对于面向对象编程有更深入的了解,我们要对程序的执行过程中,内存到底发生了什么变化,进行剖析,让大家做到“心中有数”,通过更加形象的方式理解程序的执行方式。老鸟建议:  ... 查看详情

5.1-全栈java笔记:面向对象的特征继承|上

JAVA面向对象进阶本章重点针对面向对象的三大特征:继承、封装、多态,进行详细的讲解。很多概念对于初学者来说,更多的是先进行语法性质的了解,不要期望,通过本章学习就“搞透面向对象”。本章只是面向对象的起点... 查看详情

14.2-全栈java笔记:javaswing创建窗口,原来这么简单!!!

上节我们聊到GUI(GraphicalUserInterface)的概念,并学习GUI编程中主要需掌握两个包,分别是:AWT和Swing,本节我们会通过Swing程序中常用的类和控件来实现第一个窗口。 javax.swing.JFrameJFrame在GUI中为一个窗口对象,继承于Frame。JF... 查看详情

14.1-全栈java笔记:java语言中gui到底是神马鬼?|awt|swing

到目前为止,我们在Java中编写的基本都是基于控制台的程序;而Java编程语言之所以如此流行的一个主要原因之一,就是因为它支持图形用户界面功能,即GUI(GraphicalUserInterface)。GUI(GraphicalUserInterface)即图形用户界面,就是... 查看详情

10.10-全栈java笔记:apacheioutils和fileutils的使用

JDK中提供的文件操作相关的类,功能非常基础,进行复杂操作时需要做大量编程工作。实际开发中,往往需要你自己动手编写相关的,尤其在遍历目录文件时,经常用到递归,非常繁琐。 Apache-commons工具包中提供了FileUtils,... 查看详情

14.3-全栈java笔记:jpanel原来是这样用的

在GUI编程中,如果我们要向窗口中直接添加控件(如按钮控件、标签控件、文本框控件等)是不建议的,所以就出现了容器(JPanel),以后我们只需要在容器里加控件,然后将容器加到窗口上即可。想象一下,窗口如同黑板的外... 查看详情

13.1-全栈java笔记:打飞机游戏实战项目|awt技术|mygameframe

 简介和项目目标通过游戏项目学习整个Java基础知识体系,我们做了精心的设计,让每一章知识都能获得应用。比如:多线程用来实现动画效果、容器实现对于多发炮弹的存取和处理、常用类等等的应用。寓教于乐,让大家... 查看详情

11.2-全栈java笔记:java中如何实现多线程

在JAVA中使用多线程非常简单,我们先学习如何创建和使用线程,然后结合案例再深入剖析线程的特性。通过继承Thread类实现多线程继承Thread类实现多线程的步骤:1. 在Java中负责线程的这个功能的是java.lang.Thread 这个类2.&n... 查看详情