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

  categories:0基础编程  author:

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机制解析



快乐成长 每天进步一点点