一、概念

Java 语言从其诞生开始,就和网络紧密联系在一起。在 1995 年的 Sun World 大会上,当时占浏览器市场份额绝对领先的网景公司宣布在浏览器中支持Java,从而引起一系列的公司产品对Java的支持,使得Java很快成为一种流行的语言。

Java 提供的网络功能的相关类主要有三个,它们分别是URL、Socket、Daragram。

二、URL 和 URLConnection

URL类代表一个统一资源定位符号,它是指向互联网资源的指针。 是这三个类中层次级别最高或者说封装最多的类,通过URL可以直接发送或者读取网络上的数据。

    public static void uRLTest(){
try {
//URL:统一资源定位符(网址)
URL url = new URL("http://www.baidu.com");
InputStream inputStream = url.openStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine())!=null){
System.out.println(line);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

前面介绍的 URL 类代表的是一个网络资源的位置,而URLConnection 代表的是一个连接,此类的实例可用于读取或者写入对应URL引用的资源。

public static void uRLConnectionTest(){
try {
URL url = new URL("http://restapi.amap.com/v3/config/district?key=2c95fdacd3f72bdbfec55bd7eac7b5c0");
//1、创建连接对象
URLConnection urlConnection = url.openConnection();
HttpURLConnection httpURLConnection = (HttpURLConnection) urlConnection;
//2、设置参数和一般请求属性
//应用程序要将参数写入URL连接
httpURLConnection.setDoOutput(true);
//应用程序要向URL连接读取数据
httpURLConnection.setDoInput(true);
//不使用缓存
httpURLConnection.setUseCaches(false);
//设置请求参数
httpURLConnection.setRequestProperty("Content-type","application/json");
//设置请求方法
httpURLConnection.setRequestMethod("POST");
//3、使用connect方法建立到远程对象的实际链接
httpURLConnection.connect();
//4、远程对象变为输入输出流,根据需求进一步操作
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("E:\\data.json"));
String line;
while ((line = bufferedReader.readLine()) != null){
bufferedWriter.write(line);
bufferedWriter.newLine();
bufferedWriter.flush();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

三、基于TCP的Socket编程

Socket也称为套接字,应用程序通常通过套接字向网络发出请求或者应答网络的请求。.Java 语言中的 Socket 编程常用到 Socket 和 ServerSocket 这两个类。

ServerSocket 用于服务端,而 Socket 是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个 Socket 实例,操作这个实例完成所需的会话。对于一个网络连接来说,套接字是平等的,不因为在服务端或者客户端而产生不同级别,不管是Socket还是ServerSocket,它们的工作都是通过SocketImpl类及其子类完成的。

TCP 的 Socket 编程示意图:

服务端程序:

public static void main(String[] args) {
try {
System.out.println("启动服务器......");
//创建一个新的ServerSocket,用来监听指定端口上的连接请求
ServerSocket serverSocket = new ServerSocket(8989);
Socket socket = null;
while (true) {
try {
//对accept()方法的调用将被阻塞,直到一个连接创建
//该socket用于客户端和服务器之间的通信
//流对象都派生于该套接字的流对象
socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {
//如果客户端发送了exit,则退出循环
if ("exit".equals(request)) {
break;
}
System.out.println("接收到客户端请求:" + request);
//服务端处理方法
response ="客户端:" + socket.getInetAddress().getHostAddress() + " 请求," + processRequest(request);
//响应给客户端
out.println(response);
}
} catch (Exception e) {
System.out.println("Error");
} finally {
socket.close();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}

客户端程序:

public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("192.168.1.22", 8989);
//向服务器发送数据
//printWriter(字符流)/printStream(字节流)
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
//接收服务器的反馈
InputStream inputStream = socket.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
//模拟交互
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String request, responese;
while ((request = bf.readLine()) != null) {
printWriter.println(request);
responese = in.readLine();
System.out.println(responese);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

四、基于UDP的Socket编程

UDP 是用户数据报协议,它提供的是无连接、不可靠信息传送服务,多用于音频、视频等能够容忍一定的数据包丢失的情况下。Java 主要提供两个类来实现基于 UDP 的 Socket 编程:

DatagramSocket:此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点,每个在数据报套接字上发送或接收的包都是单独编址和路由的。在DatagramSocket上总是启用UDP广播发送。

DatagramPacket:此类表示数据报包。数据报包用来实现无连接包投递服务,每条报文仅根据该包中的信息从一台机器路由到另一台机器。

UDP 的 Socket 编程示例图:

服务端(接收端)程序:

public static void main(String[] args) {
DatagramSocket server = null;
try {
server = new DatagramSocket(8088);
byte[] datas = new byte[1024];
//用一个字节数组接收UDP包,字节数组在传递给构造函数时是空的
DatagramPacket datagramPacket = new DatagramPacket(datas, datas.length);
server.receive(datagramPacket);
System.out.println(new String(datas));
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
server.close();
}
}

客户端(发送端)程序:

public static void main(String[] args) {
DatagramSocket client = null;
try {
client = new DatagramSocket();
//创建数据报
byte[] buffer = "hello,world".getBytes();
InetAddress byName = InetAddress.getByName("192.168.1.22");
//建立将要传输的UDP包,并指定ip地址和端口号
DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length, byName, 8088);
client.send(datagramPacket);
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
client.close();
}
}

Java 原生网络编程.的更多相关文章

  1. 安卓网络编程学习(1)——java原生网络编程(1)

    写在前面 马上要进行第二轮冲刺,考虑到自己的APP在第一轮冲刺的效果不尽人意,有很多网络方面的小BUG,这里就系统学习一下网络编程,了解来龙去脉,以便更好的对项目进行优化处理. http协议 http ...

  2. 安卓网络编程学习(1)——java原生网络编程(2)

    写在前面 该博客紧接上篇博客:https://www.cnblogs.com/wushenjiang/p/12937531.html,继续学习post请求,带参数的post和get请求以及文件上传与下 ...

  3. Java原生网络编程

    一些常见术语 编程中的Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...

  4. 二十三、Java基础--------网络编程

    Java中另一个重要技术就是网络编程了,为了更好的学习web方向的知识,有必要对java之网络编程好好学习,本文将围绕网络编程技术进行分析. 常见的网络协议:UDP.TCP UDP 1. 将数据源和目 ...

  5. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  6. Java Socket 网络编程心跳设计概念

    Java Socket 网络编程心跳设计概念   1.一般是用来判断对方(设备,进程或其它网元)是否正常动行,一 般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于 ...

  7. 20145325张梓靖 实验五 "JAVA的网络编程"

    20145325张梓靖 实验五 "JAVA的网络编程" 实验内容 使用 JVAV语言 进行网络编程 对明文进行加密 设计过程 我完成的是客户端,服务端同伴 20145308刘昊阳 ...

  8. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

  9. JAVA的网络编程【转】

    JAVA的网络编程[转] Posted on 2009-12-03 18:04 火之光 阅读(93441) 评论(20) 编辑 收藏 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能, ...

随机推荐

  1. 解决Mac系统升级导致cocoapods失效问题

    使用pod install出现如下错误 -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2. ...

  2. C++ 基础知识回顾总结

    一.前言 为啥要写这篇博客?答:之前学习的C和C++相关的知识,早就被自己忘到一边去了.但是,随着音视频的学习的不断深入,和C/C++打交道的次数越来越多,看代码是没问题的,但是真到自己操刀去写一些代 ...

  3. Java学习笔记一:数据类型I

    GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/IntPractice1.java https://github.com ...

  4. alibaba的FastJson找不到JSON对象问题

    在现在出现使用JSON.toJsonString()方法时,可能没有JSON这个对象. 这种问题可能是下载的jar版本比较高.在低版本的jar使用的是JSON对象. 我使用的是1.2.47版本的jar ...

  5. Windows平台下kafka环境的搭建

    近期在搞kafka,在Windows环境搭建的过程中遇到一些问题,把具体的流程几下来防止后面忘了. 准备工作: 1.安装jdk环境 http://www.oracle.com/technetwork/ ...

  6. Java核心技术及面试指南 JDBC部分的面试题总结以及答案

    5.5.1 你最近的项目里用到的是哪个数据?或你用过哪些数据库?或你对哪个数据库最熟悉? 通过这个问题,我们将会确认候选人是否在项目里用过数据库或JDBC. 5.5.2 你有没有建过表?或修改表里的字 ...

  7. VueJs(13)---过滤器

    过滤器 过滤器 1.过滤器规则 Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方: 双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤 ...

  8. java提高(6)---Serializable

    Serializable--初解 一 序列化是干什么的? 我们知道,在jvm中引用数据类型存在于栈中,而new创建出的对象存在于堆中.如果电脑断电那么存在于内存中的对象就会丢失.那么有没有方法将对象保 ...

  9. [Jenkins]Console Output中文显示问号的问题解决

    ------------------------------------------------------ 如需转载,请注明出处. 文章链接:https://www.cnblogs.com/dzbl ...

  10. CentOS7.0小随笔——指令基本操作(Part.A)

    与其说是CentOS7.0的小随笔,说老实话,基本指令在每个发行版本的Linux中都基本上是一致的. Part.A部分我们讲述以下四个方面:命令行界面与图形界面.Linux系统的关闭与重启.命令行帮助 ...