从0开始学编程(21)-Java网络编程入门

java网络编程是java非常重要的一个部分, 现在没啥程序是不联网的, 极少数程序是单机的外, 大部分都要连接网络, java的网络功能已经很强大, 同时由于java有非常庞大的开源社区,里面各种资源都有, 基本常见需要的网络等程序, 网络开发框架非常齐全, 通过java开发的网络程序也比较简单, 性能也不差。 能满足各种不同需求的。

另外网络编程也涉及很多java的基础知识, 对java流的读取方式, java的线程等等都要有很好的理解才能做好。

学习java的网络编程一方面可以学习网络知识,同时可以巩固前面学习的java等知识。

还是从网络上找个 网络编程的知识来, 可以简单看看, 能看明白多少都可以总之看来, 在今后工作中慢慢 加固就好!!

这里有两份 java网络编程的 视频, 都是比较好的!  前面一个 比较简洁, 快速的讲解了网络编程的 相关总体内容, 后面比较详细。

http://pan.baidu.com/s/1c08PIIc  eemv       马士兵的  网络编程, 比较好, 快速入门。

http://pan.baidu.com/s/1gdncWfh vp7f 传智播客毕向东Java基础视频教程- 网络基础知识, 这个讲的比较全面, 还是很值得一看的。

另外, 下面是从网络查找的java相关资料,也可以参考阅读。

Java网络编程菜鸟进阶:TCP和套接字入门

JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)这两个数据传输协议的支持。本文开始探讨 TCP。

TCP 基础知识

在“服务器-客户端”这种架构中,服务器和客户端各自维护一个端点,两个端点需要通过网络进行数据交换。TCP 为这种需求提供了一种可靠的流式连接,流式的意思是传出和收到的数据都是连续的字节,没有对数据量进行大小限制。一个端点由 IP 地址和端口构成(专业术语为“元组 {IP 地址, 端口}”)。这样,一个连接就可以由元组 {本地地址, 本地端口, 远程地址, 远程端口} 来表示。

连接过程

在 TCP 编程接口中,端点体现为 TCP 套接字。共有两种 TCP 套接字:主动和被动,“被动”状态也常被称为“侦听”状态。服务器和客户端利用套接字进行连接的过程如下:

1、服务器创建一个被动套接字,开始循环侦听客户端的连接。

2、客户端创建一个主动套接字,连接服务器。

3、服务器接受客户端的连接,并创建一个代表该连接的主动套接字。

4、服务器和客户端通过步骤 2 和 3 中创建的两个主动套接字进行数据传输。

下面是连接过程的图解:

TCP 连接

一个简单的 TCP 服务器

JDK 提供了 ServerSocket 类来代表 TCP 服务器的被动套接字。下面的代码演示了一个简单的 TCP 服务器(多线程阻塞模式),它不断侦听并接受客户端的连接,然后将客户端发送过来的文本按行读取,全文转换为大写后返回给客户端,直到客户端发送文本行 bye:

public class TcpServer implements Runnable {
private ServerSocket serverSocket;

public TcpServer(int port) throws IOException {
// 创建绑定到某个端口的 TCP 服务器被动套接字。
serverSocket = new ServerSocket(port);
}

@Override
public void run() {
while (true) {
try {
// 以阻塞的方式接受一个客户端连接,返回代表该连接的主动套接字。
Socket socket = serverSocket.accept();
// 在新线程中处理客户端连接。
new Thread(new ClientHandler(socket)).start();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}

public class ClientHandler implements Runnable {
private Socket socket;

public ClientHandler(Socket socket) {
this.socket = Objects.requireNonNull(socket);
}

@Override
public void run() {
try (Socket s = socket) { // 减少代码量的花招……
// 包装套接字的输入流以读取客户端发送的文本行。
BufferedReader in = new BufferedReader(new InputStreamReader(
s.getInputStream(), StandardCharsets.UTF_8));
// 包装套接字的输出流以向客户端发送转换结果。
PrintWriter out = new PrintWriter(new OutputStreamWriter(
s.getOutputStream(), StandardCharsets.UTF_8), true);

String line = null;
while ((line = in.readLine()) != null) {
if (line.equals("bye")) {
break;
}

// 将转换结果输出给客户端。
out.println(line.toUpperCase(Locale.ENGLISH));
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

阻塞模式的编程方式简单,但存在性能问题,因为服务器线程会卡死在接受客户端的 accept() 方法上,不能有效利用资源。套接字支持非阻塞模式,现在暂时略过。

一个简单的 TCP 客户端

JDK 提供了 Socket 类来代表 TCP 客户端的主动套接字。下面的代码演示了上述服务器的客户端:

public class TcpClient implements Runnable {
private Socket socket;

public TcpClient(String host, int port) throws IOException {
// 创建连接到服务器的套接字。
socket = new Socket(host, port);
}

@Override
public void run() {
try (Socket s = socket) { // 再次减少代码量……
// 包装套接字的输出流以向服务器发送文本行。
PrintWriter out = new PrintWriter(new OutputStreamWriter(
s.getOutputStream(), StandardCharsets.UTF_8), true);
// 包装套接字的输入流以读取服务器返回的文本行。
BufferedReader in = new BufferedReader(new InputStreamReader(
s.getInputStream(), StandardCharsets.UTF_8));

Console console = System.console();
String line = null;
while ((line = console.readLine()) != null) {
if (line.equals("bye")) {
break;
}

// 将文本行发送给服务器。
out.println(line);
// 打印服务器返回的文本行。
console.writer().println(in.readLine());
}

// 通知服务器关闭连接。
out.println("bye");
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

从 JDK 文档可以看到,ServerSocket 和 Socket 在初始化的时候,可以设定一些参数,还支持延迟绑定。这些东西对性能和行为都有所影响。后续两篇文章将分别详解这两个类的初始化。

另外推荐有时间可以查找一下netty的资料。

Netty是由JBOSS提供的一个java开源框架是做java网络开发的框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
“快速”和“简单”并不意味着会让你的最终应用产生维护性或性能上的问题。Netty 是一个吸收了多种协议的实现经验,这些协议包括FTP,SMTP,HTTP,各种二进制,文本协议,并经过相当精心设计的项目,最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

推荐看:《Netty权威指南》这个本书, 前面一部分对java的io,网络模型有很好的介绍, 大家可以 到csdn的下载频道搜索, 下载。

下面的资料都是将来网络编程要涉及到的, 现在看看了解了解

Java NIO与IO的区别和比较

在Java7中NIO.2异步执行

Java NIO类库Selector机制解析

 

 

相关文章

从0开始学编程(22)-android开发环境搭建与入门教程

从0开始学编程(21)-Java网络编程入门

从0开始学编程(20)-Java线程入门

从0开始学编程(19)–java流概念入门

从0开始学编程(18)–java快速入门

从0开始学编程(17)–面向对象思想了解

从0开始学编程(16)–数据库加强

从0开始学编程(15)–总结篇-php编程强化巩固

从0开始学编程(14) – Php数据相关操作

从0开始学编程(13) Php获取form表单数据

从0开始学编程(12) 使用 eclipse的 php插件单步调试php程序

从0开始学编程(11) 使用 eclipse的 php插件 调试php程序

从0开始学编程(10) 用例子学习bootstrap的布局

从0开始学编程(9) – css、html和js简便工具

从0开始学编程(8) – 数据库简介

从0开始学编程(7) – 常用网站介绍

从0开始学编程(6)–在多了解一下php都涉及些啥东西

从0开始学编程(5)–方便的php编辑工具notepad++

从0开始学编程(4)–html基础入门

从0开始学编程(3)–学习必备的基础技能

从0开始学编程(2)–学习的方法和目标

从0开始学编程(1)–xampp配置php学习环境

发表评论