最近在研究kafka的源码,先说一下感触,虽然kafka不是用java写的,只是提供了java的客户端,但是单纯这个客户端的代码已经让我焦头烂额了,可以很肯定的说现在的我真的是太菜了,需要学习的东西太多,不过乐观点的说我的成长空间也很大,而且读源码真的是非常好的学习机会,很推荐有时间的朋友们读一个框架的源码。通过读源码我发现了很多的不足,这里仅仅记录一些关于java网络编程的,顺便将以前总结的关于网络编程的笔记汇总一下。关于kafka的源码中的补充的知识也会逐渐添加进来。
1、InetAddress类,这个出现于kafkaProducer的源码中。这个类表示的是ip地址的详细信息,通过它既可以获得域名也可以获得ip地址,但是这个类是不含有端口号的。
InetAddress没有构造方法,只能通过类中的静态方法获得实例,既可以通过getBy***方法获得指定域名的ip也可以通过getLocalhost来获得本机的ip。
2、InetSocketAddress类,这个是在对InetAddress类的补充,在ip地址的基础上添加了端口号。
InetSocketAddress的构造方法很简单,既可以使用域名+端口号,也可以使用InetAddress + 端口号。
数据的传输:TCP(transfer control protocal,传输控制协议) UDP(user datagram protocal)
TCP是面向连接的传输,必须要建立起连接之后才可以进行通信。tcp的连接的建立需要三次握手,先是客户端发送SYN同步报文,然后服务器端发送ACK确认报文即SYN同步报文,最后客户端再次发送ACK确认报文连接即建立。tcp就像是打电话,通话双方都必须拿起电话才可以讲话。tcp的这个特性决定了他的安全性,消息不会丢失,但是效率去相对较低。
UDP一种无连接的传输层协议,提供面向事物的简单不可靠信息传送服务。他是非面向连接的,即不用连接也能通信,所以存在传输不可靠的特点,就像是发送短信,即使另一方没有开机也可以发,而且发送方无法得知是否已经发送。
在java的网络编程中,UDP使用的是DatagramSocket + DatagramPacket,DatagramSocket是用来发送和接收DataGramPacket(数据报)的对象,服务器端和客户端都使用的是DatagramSocket,DatagramPacket就是数据报,里面含有要发送的信息和此数据报要发送到的目的地的ip地址和端口号,在服务器端和客户端的数据报的建立方法不同。 TCP使用的是:ServerSocket + Socket,ServerSocket是用来监听访问的,每当有新的请求来时服务器端就会建立socket用来和此进行会话。
UDP的编程实例:
//这是服务器端的代码 public class UDPServer { public static void main(String[] args) throws IOException { DatagramSocket server = new DatagramSocket(9999); byte[] container = new byte[1024]; //这个是用来接受数据的信息报 DatagramPacket pack = new DatagramPacket(container, container.length); server.receive(pack);//程序执行到这的时候就会阻塞 byte[] data = pack.getData(); String dataStr = new String(data, 0, pack.getLength()); System.out.println(dataStr); server.close(); } } //这是客户端的代码 public class UDPClient { public static void main(String[] args) throws IOException { DatagramSocket cli = new DatagramSocket(8888); byte[] data = "hello world".getBytes(); //这个是用来发送的信息报的,所以必须指定此数据报的发送的ip和端口 DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 9999)); cli.send(packet);; cli.close(); } }可以在不运行服务器端的情况下运行客户端,并且不会报错,因为UDP不是面向连接的,所以不用建立连接,不过这样也就会丢失数据报。所以如果要看到实验的结果必须要先运行服务器端(服务器端在执行到receive时就会阻塞),然后再运行客户端。
除了发送字符串类之外,也可以发送java类,先用ObjectOutputStream将java类转换为byte[],然后发送byte[],再接收端用ObjectInputStream将接受到的byte[]转化为指定的java类。
public class UDPServer { public static void main(String[] args) throws IOException, ClassNotFoundException { DatagramSocket server = new DatagramSocket(9999); byte[] container = new byte[1024]; //这个是用来接受数据的信息报 DatagramPacket pack = new DatagramPacket(container, container.length); server.receive(pack); byte[] data = pack.getData(); ByteArrayInputStream stream = new ByteArrayInputStream(data, 0, pack.getLength()); ObjectInputStream in = new ObjectInputStream(stream); UDPClient c = (UDPClient) in.readObject(); System.out.println(c.name); server.close(); } } public class UDPClient implements Serializable { private static final long serialVersionUID = 5810472933704265330L; public String name = "hello world"; public static void main(String[] args) throws IOException { DatagramSocket cli = new DatagramSocket(8888); UDPClient c = new UDPClient(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(stream); out.writeObject(c); byte[] data = stream.toByteArray(); //这个是用来发送的信息报的,所以必须指定此数据报的发送的ip和端口 DatagramPacket packet = new DatagramPacket(data, data.length, new InetSocketAddress("localhost", 9999)); cli.send(packet);; cli.close(); } }
TCP编程实例
服务器端:
public class Server { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(9999); while(true){ Socket socket = server.accept();// System.out.println("有请求来了"); new Thread(new SocketTask(socket)).start(); } } } class SocketTask implements Runnable{ Socket socket = null; public SocketTask(Socket socket) { if(socket == null){ throw new IllegalArgumentException(); } this.socket = socket; } public void run() { try { InputStream inputStream = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); String msg = reader.readLine(); System.out.println(msg); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
说明:ServerSocket的accept方法会阻塞,这里采用的办法是无限循环,只要有一个请求来了就会建立一个线程去处理这个这次请求,将返回的socket实例加入到这个线程中去。
客户端:
public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost",9999); OutputStream outStream = socket.getOutputStream(); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream,"UTF-8")); writer.write("中国"); writer.close(); socket.close(); } }
在TCP中,如果先启动客户端的话就会报错,因为TCP是面向连接的,必须现有连接才可以进行通信,而UDP则相反。如果想得到预期的效果就必须先启动服务器端。
这几个小例子都很简单,最初学java的时候经常写,重新写一遍的原因就是复习一下,做到温故知新,熟能生巧。
相关推荐
Java网络编程是软件开发中的重要组成部分,特别是在分布式系统和互联网应用中不可或缺。本文将深入探讨Java网络编程的核心概念、关键技术和实用技巧。 首先,我们来理解Java中的Socket编程。Socket在计算机网络中...
Java网络编程是编程领域中的重要组成部分,它允许程序在不同的设备之间交换信息。本文将深入讲解Java中的网络编程基础知识,帮助初学者理解并掌握这一技术。 首先,理解网络编程的本质至关重要。网络编程涉及两个或...
Java网络编程是构建分布式应用程序的关键技术,而Java Socket编程则是其核心部分,允许两台计算机通过网络进行双向通信。在Java中,Socket是基于TCP/IP协议的,提供了可靠的、面向连接的数据传输服务。 首先,理解...
总结起来,这份资料包涵盖了Java网络编程的核心部分:基础的Socket编程,深入的TCP协议理解,以及高级的事务管理机制。通过学习这些内容,开发者能够熟练地构建和优化网络应用程序,处理并发和数据传输问题,同时...
Java网络编程是计算机科学中的一个重要领域,特别是在分布式系统和服务器端开发中不可或缺。这个实验报告主要涉及了两个关键概念:I/O操作和线程管理,同时包含了一个基本的聊天室代码实现,这为我们提供了理解Java...
总结来说,这个"java网络编程基础"示例涵盖了如何创建基本的服务器和客户端应用程序,以及如何通过TCP连接进行数据交换。通过分析和学习这两个文件,初学者可以了解Java网络编程的基本概念,为进一步的网络应用开发...
总结来说,Java网络编程和分布式计算是构建现代网络应用的基础技术,它们允许开发者创建出可以协同工作的网络应用程序,并将这些程序部署在分布式环境中。掌握这些技术,能够使程序员充分利用Java语言的跨平台优势,...
总结来说,Java网络编程与分布式计算涉及的内容广泛,包括网络通信的基本原理,Java提供的相关API,以及分布式系统的设计和实现。掌握这些知识,对于成为专业的Java开发人员,尤其是从事云计算和大数据领域的开发者...
Java Socket 编程总结 Java Socket 编程是Java语言中用于网络编程的主要技术之一。它允许开发者创建网络应用程序,通过Socket实现客户机/服务器结构的通信。在Java中,Socket编程主要是基于TCP/IP协议的网络编程。 ...
### Java网络编程精讲知识点概览 #### 一、Java网络编程基础 1. **网络编程概念**: - 网络编程是指利用计算机网络技术进行数据交换和资源共享的一种编程方式。 - Java提供了强大的网络编程支持,使得开发者能够...
总结,本Java网络编程聊天程序报告详细阐述了一个基于Java的聊天程序的设计与实现,涵盖了系统的需求分析、功能设计、特点、架构以及权限管理等方面。这样的系统为用户提供了一个安全、高效的在线交流平台,充分体现...
在网络编程中,了解网络基础知识是非常重要的,这有助于更好地理解Java网络编程的相关概念和技术。 ##### 1. 什么是计算机网络 计算机网络是指将分布在不同地理位置的计算机系统通过通信线路连接起来形成的一个系统...
《Java网络高级编程》是一本专注于Java网络编程的教材,涵盖了从基础到高级的各种网络编程技术和概念。根据描述,本书共分为11章,每一章都详细介绍了网络编程中的不同知识点。以下是对本书内容的详细介绍: 在第1...
在本项目中,"Java网络编程 五子棋 课程设计"是一个综合性的学习任务,旨在让学生通过实际操作深入理解网络编程和游戏开发的基本概念。这个项目涵盖了多个关键知识点,包括Java编程语言、网络通信协议、多线程、游戏...
总结一下,本教程主要介绍了Java网络编程的基础知识,包括使用`ServerSocket`创建服务器,`Socket`建立客户端连接,以及如何通过输入输出流进行数据交换。同时,也提到了使用Swing创建简单GUI的方法。继续深入实践,...
本实验主要涉及Java网络编程的基础知识,包括使用InetAddress类获取主机的IP地址和主机名称,使用Socket和ServerSocket类实现C/S通信。这些知识点对于Java网络编程非常重要,对于后续的学习和开发具有重要的参考价值...
总结来说,Java网络编程中的端口扫描器通过Socket类实现了对目标IP的端口探测,结合多线程技术提高了扫描效率。然而,使用此类工具时,我们必须意识到可能涉及的法律和道德问题,合理合法地使用这些技术。
总结来说,Java网络编程包括了对UDP和TCP协议的支持,通过Socket API可以实现客户端和服务器之间的通信。无论是简单聊天软件还是复杂的分布式系统,理解并熟练掌握这些基础知识都是至关重要的。