一、概念

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. PHP+XML写注册登录

    2018/12/06  今天尝试了下PHP   使用PHP+XML写注册登录   具体保存于上传的文件中 从此山水不相逢  莫问他人长与短

  2. 背水一战 Windows 10 (98) - 关联启动: 使用外部程序打开一个文件, 使用外部程序打开一个 Uri

    [源码下载] 背水一战 Windows 10 (98) - 关联启动: 使用外部程序打开一个文件, 使用外部程序打开一个 Uri 作者:webabcd 介绍背水一战 Windows 10 之 关联启动 ...

  3. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  4. Android之Activity系列总结(二)--任务和返回栈

    任务和返回栈 应用通常包含多个 Activity.每个 Activity 均应围绕用户可以执行的特定操作设计,并且能够启动其他 Activity. 例如,电子邮件应用可能有一个 Activity 显示 ...

  5. ELK搭建elasticsearch常见报错

    问题一: [2018-01-31T16:27:21,712][WARN ][o.e.b.JNANatives ] unable to install syscall filter: Java.lang ...

  6. HBase之RPC调用流程简介

    首先分析hbase中对于master协议的调用: 在ConnectionImplementation的方法getKeepAliveMasterService被调用时,会通过MasterServiceS ...

  7. JDK,JRE,JVM,JMM关系与区别

    JVM: Java Virtual Machine, 将java文件编译成class文件并运行class文件的软件 JRE:Java  Runtime  Enviromental,包含了JVM和Jav ...

  8. java --Integer 学习

    本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 在网上看到一个面试题,没有完全做, 本代码基于JDK8 //下面代码运行结果是 public class ...

  9. [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  10. 数据结构(一) 单链表的实现-JAVA

    数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数 ...