23、java中的网编基础

什么是网络编程?

       在说网络编程之前要先知道什么是网络,网络是一种实现资源共享和数据传输的系统。而网络编程就是使用代码编写程序来进行网络之间数据的传输。使用java进行网络之间数据的传输是比较简单的,java中提供了一些现成的类供我们使用,其实这一块也没什么好理解的,记住就可以了,这里只是简单介绍一下网络之间进行数据传输的方式和如何使用java中提供类进行编程。

如何进行数据的传输?

       假如有两台机器服务器A和客户端B需要进行数据传输,首先,想到的问题应该是如何确定这两台机器。在网络中每一个机器都使用一个ip地址作为自己的唯一标识,所以首先应该确认机器的ip地址,接着,客户端B将信息发送到了服务器A,这是服务器中的哪个应用去接收处理客户端发来的信息呢?每一台机器中有65535个端口, 每一个端口对应着一个应用程序,所以还要指定端口(port)来告诉服务器将信息发送到哪个应用中进行处理。
       这里可能有一个疑问,数据是如何由客户端发送到服务器的呢?
       数据在传输时需要遵循特定的协议,这里有两个协议可供选择: TCP协议提供面向连接的服务,使用字节流的方式进行传输,是有序、可靠传输。 UDP协议提供无连接的服务,使用数据包的方式进行传输,是不可靠的传输。

 java如何实现数据传输?

       接下来介绍一下java中的网编实现方式,在java中使用socket套接字来逻辑表示网络中的结点(客户端B和服务器A),套接字的两个基本属性就是ip和端口。数据进行传输时先通过套接字来连接两个结点,然后使用套接字中提供的数据流来进行数据的传输,等到传输结束后,则注销两个套接字,结束结点之间的通信。
       针对不同协议的数据传输,java中提供了不同的实现方式,使用TCP协议进行java进行网络编程时,由于需要先创建连接,所以必须先开发服务器端,当服务器端没有开启时,客户端访问会报错,看一下根据TCP协议进行数据传输的例子,代码如下:
      

/*** 服务器端**/
public class SocketServer {public static void main(String[] args) {//1.声明套接字和一系列的流对象ServerSocket serverSocket = null;Socket socket = null;InputStream inputStream = null;OutputStream outputStream = null;try {// 2.构造套接字serverSocket = new ServerSocket(9002);// 3.使服务器处于阻塞状态,确定可以通信,获取套接字,等待客户端发送信息socket = serverSocket.accept();// 4.获取流对象,读取流中的信息inputStream = socket.getInputStream();byte []bs = new byte[2048];inputStream.read(bs);System.out.println("接收到客户端的信息:"+new String(bs,"utf-8"));// 5、禁用套接字中的输入流socket.shutdownInput();// 6. 反馈信息,往流中写入数据,供客户端获取outputStream = socket.getOutputStream();outputStream.write("我是服务器端".getBytes());socket.shutdownOutput();} catch (IOException e) {e.printStackTrace();} finally {try {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}socket.close();} catch (IOException e) {e.printStackTrace();}}}
}------------------------------------------------------------------/*** 客户端**/
public class SocketClient {public static void main(String[] args) {// 1.创建客户端套接字和用于获取数据流对象Socket socket = null;InputStream in = null;OutputStream out = null;try {// 2.构造套接字,用于连接服务器端socket = new Socket("127.0.0.1", 9002);// 3.创建与服务器之间的数据连接流,往服务器端发送数据out = socket.getOutputStream();String message = "我是客户端";out.write(message.getBytes());socket.shutdownOutput();// 4.获取与服务器之间的数据连接流,获取到服务器返回的信息byte []b = new byte[2048];in = socket.getInputStream();in.read(b);System.out.println("接收到服务端的信息:"+new String(b,"utf-8"));socket.shutdownInput();} catch (Exception e) {// TODO: handle exception} finally {try {if (in != null) {in.close();}if (out != null) {out.close();}socket.close();} catch (IOException e) {e.printStackTrace();}}}
}

       上边这是一个服务器对应要给客户端,当多个客户端访问一台服务器时,使用多线程即可,每来一个客户端就创建一个新线程,创建一个新的套接字。

        当使用UDP协议进行java开发时,服务器端不需要一定开启,客户端发送信息,不会管服务器是否接受成功了,看一下使用UDP协议进行数据传输的例子,代码如下:

/*** 服务器端 */
public class Recive {public static void main(String[] args) {// 1.创建数据报包套接字DatagramSocket socket = null;// 2.创建数据包DatagramPacket dpGet = null;DatagramPacket dpSend = null;try {// 3.构造一个数据包byte[] b = new byte[2048];dpGet = new DatagramPacket(b, b.length);// 4.构造套接字,并开启服务器,等待接受数据包socket = new DatagramSocket(9002);socket.receive(dpGet);//服务器阻塞,等待访问System.out.println("接受到客户端的信息:"+new String(b));// 5.从包中获取到客户端的套接字地址信息,并返回客户端信息SocketAddress socketAddress = dpGet.getSocketAddress();byte[] sendData = "这是服务器返回的信息".getBytes();dpSend = new DatagramPacket(sendData, sendData.length, socketAddress);socket.send(dpSend);} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {socket.close();}}
}-----------------------------------------------------/*** 客户端 */
public class Send {public static void main(String[] args) {// 1.声明数据报包套接字DatagramSocket socket = null;// 2.声明数据库报包DatagramPacket dp = null;try {// 4.构建套接字socket = new DatagramSocket();// 5.构建发送包byte[] bytes = "客户端发送的信息".getBytes();dp = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 9002);// 6.发送数据报包socket.send(dp);} catch (UnknownHostException e) {e.printStackTrace();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 释放资源socket.close();}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2017西安交大ACM小学期数据结构 [又是树状数组、异或]

Problem F 发布时间: 2017年6月28日 10:31 最后更新: 2017年6月29日 21:35 时间限制: 2000ms 内存限制: 64M 描述 给定一个nm的矩形, 初始时所有元素都为0给出q个操作, 操作有三种 对于形如1x的操作, 将第x行的所有元素异或1对于形如2y的操作, 将第y列的所有元素异或1对于…

P2717-寒假作业【逆序对,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P2717 题目大意 nnn个数,求有多少个连续子序列的平均值大于等于kkk。 解题思路 因为长度会十分干扰,所以我们将所有数减去kkk。问题就变为了求有多少连续子序列的和非负。用前缀和逆序对求就好了。 co…

使用 BenchmarkDotnet 测试代码性能

先来点题外话,清明节前把工作辞了(去 tm 的垃圾团队,各种拉帮结派、勾心斗角)。这次找工作就得慢慢找了,不能急了,希望能找到个好团队,好岗位吧。顺便这段时间也算是比较闲,也能学习…

24、jdbc操作数据库(1)

什么是jdbc? 看一下官方怎么说,JDBC 英文名Java DataBase Connectivity,使用java连接数据库的工具,就是一组使用java代码来执行SQL语句的API。 Jdbc有什么用? 数据库有多种,并且不同数据库操作时的方式和…

jzoj3918-蛋糕【二分】

正题 题目链接:https://jzoj.net/senior/#contest/show/2953/0 题目大意 n∗mn*mn∗m的矩阵&#xff0c;有数字&#xff0c;横着三刀竖着三刀分成16份使得最小那份最大。 解题思路 暴力枚举竖着的三刀&#xff0c;然后二分答案判定即可。 codecodecode #include<cstdio&g…

2017西安交大ACM小学期数论 [阅兵式]

阅兵式 发布时间: 2017年6月25日 12:53 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 阅兵式上&#xff0c;将士们排成一个整齐的方阵&#xff0c;每个将士面朝前方。问正中心的将士能向前看到几个将士&#xff1f;注意&#xff0c;一条直线上的将…

25、jdbc操作数据库(2)

说一下使用jdbc时涉及到的一些基本的接口和类 java.sql.Driver 是数据库驱动接口&#xff0c;com.mysql.jdbc.Driver是mysql对应的驱动&#xff0c;由数据库供应商实现&#xff0c;用于提供驱动&#xff0c;实现了java.sql.Driver接口。 java.sql.DriverManager 管理驱动的…

jzoj3919-志愿者【换根法,线段树,树形dp】

正题 题目链接:https://jzoj.net/senior/#main/show/3919 题目大意 nnn个点kkk个需要到达的点&#xff0c;然后求每个点出发经过这些点的最短路径。 解题思路 因为不用回去&#xff0c;答案就是以这点为根链接所有点的树减去离这个点最远点的距离。 我们用线段树维护最远点距…

2017西安交大ACM小学期数论 [水题]

水题 发布时间: 2017年6月25日 14:06 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 平均因数个数的统计对于估算数论题目复杂度具有非常重要的意义。小A同学听了今天的课后&#xff0c;于是想要自己写一个程序&#xff0c;求出1到n的平均因数个数…

26、jdbc操作数据库(3)

1、结果集的元数据操作 ResultSetMetaData 是描述ResultSet的元数据对象&#xff0c;可以通过元数据对象获取结果集的列信息&#xff0c;使用方式如下&#xff1a; public void query() {Connection connection DBUtil.getConnection();String sql "SELECT ID,UNAME u,…

jzoj3920-噪音【贪心,dp】

正题 题目链接:https://jzoj.net/senior/#main/show/3920 题目链接 nnn头牛&#xff0c;mmm个牛棚&#xff0c;可以清空kkk次。 每头牛会指定进入一个牛棚&#xff0c;进入后产生牛棚中牛数量的噪音值&#xff0c;然后清空可以清空一个牛棚的牛&#xff0c;求最少噪音值。 解…

2017西安交大ACM小学期数论 [完全平方数]

完全平方数 发布时间: 2017年6月24日 17:01 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 给定正整数b&#xff0c;求最大的整数a&#xff0c;使a(ab)是完全平方数。 输入 多组测试数据&#xff08;不超过10000组&#xff09;。 每组数据一个正整…

27、jdbc操作数据库(4)

数据库连接池是什么&#xff1f;为什么使用连接池&#xff1f; 当使用jdbc去操作数据库时&#xff0c;需要先获取连接&#xff0c;然后进行具体的数据库操作&#xff0c;最后释放连接。这一系列操作在演示一个demo时还可以使用&#xff0c;但是当访问数据库次数多了的时候&…

28、jdbc操作数据库(5)

介绍一个稍微封装了jdbc的工具类org.apache.commons.dbutils&#xff0c;使用dbutils可以简化对数据库操作程序的开发。 API介绍 接下来通过实例的方式说一下dbutils的具体使用 添加jar包&#xff1a;commons-dbutils-1.7.jar 增、删、改 进行增、删、改操作&#xff0c;在…

jzoj3910-Idiot的间谍网络【倍增,dfs】

正题 题目链接:https://jzoj.net/senior/#main/show/3910 题目大意 nnn个点的森林mmm个操作&#xff0c; 合并两棵树让xxx节点到根节点的路径标记上cntcntcnt。并让cntcntcnt查询一个节点xxx是否有标记yyy。 解题思路 这里考虑离线的算法。我们可以先将这个森林的最终状态构…

2017西安交大ACM小学期数论 [更新学号]

发布时间: 2017年6月24日 20:27 最后更新: 2017年7月3日 09:27 时间限制: 3000ms 内存限制: 128M 描述 某知名高校有n个学生&#xff0c;每个学生有一个唯一ID。但这些ID有7位数字&#xff0c;学生总是记不住&#xff0c;于是学校想了一个办法。它们将所有ID对m取模作为学…

jzoj4815-ksum【堆】

正题 题目链接:https://jzoj.net/senior/#main/show/4815 题目大意 nnn个数的序列&#xff0c;求前kkk大的子段。 解题思路 一个区间的答案肯定比他的所有子区间要大&#xff0c;所以我们先把(1,i)(1,i)(1,i)都丢进堆里&#xff0c;然后每次取出最大的再将(l1,r)(l1,r)(l1,r)…

2017西安交大ACM小学期数论 [等差数列]

等差数列 发布时间: 2017年6月25日 13:42 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 给定正整数n&#xff0c;试问存在多少个和为n的等差数列&#xff1f; 当然&#xff0c;等差数列中每一项要为非负整数&#xff0c;且不考虑降序的等差数列。…

29、jdbc操作数据库(6)

通常真正实际开发时&#xff0c;dao层虽然会涉及很多实体&#xff0c;但是可以借助泛型、反射、一些简单工具类来封装一些通用的查询、更新等操作的方法&#xff0c;下面介绍两种方法 第一种&#xff1a;借助元数据类ResultSetMetaData来实现方法的封装&#xff0c;使用Map或者…

30、JAVA_WEB开发基础之servlet(1)

servlet是什么 Servlet 是一种独立的 web 开发标准&#xff0c;用来接受、处理、返回浏览器的访问请求&#xff0c;它不应和服务器耦合在一起&#xff0c;servlet和servlet容器之间相互独立又相互依存&#xff0c;自我感觉&#xff0c;servlet有了容器才得以实现自己的价值&am…