`
frank-liu
  • 浏览: 1682222 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java TCP/UDP socket 编程流程总结

阅读更多

    最近正好学习了一点用java socket编程的东西。感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下。

Socket

    Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据。就像通过一个文件的file handler就可以都写数据到存储设备上一样。根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的。

     对socket的本身组成倒是比较好理解。既然是应用通过socket通信,肯定就有一个服务器端和一个客户端。所以它必然就包含有一个对应的IP地址。另外,在这个地址上server要提供一系列的服务,于是就需要有一系列对应的窗口来提供服务。所以就有一个对应的端口号(Port)。端口号是一个16位的二进制数字,那么范围就是从(0-65535)。IP地址加端口号基本上就构成了socket。下面这幅图可以描绘出socket和整个TCP/IP之间的关系:

socket

 

TCP

    TCP主要是面向连接的协议,它包含有建立和拆除连接,保证数据流的顺序和正确性等功能。每次对TCP中间的数据操作相当于对一个数据流进行访问。它最典型的特征就是那三次握手的建立连接过程。TCP的连接建立和撤销过程如下图:

 

tcp

Server端

Server端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的处理步骤如下:

1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。

2.重复如下几个步骤:

a. 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。

b.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。

c.结束的时候调用socket实例的close()方法关闭socket连接。

 

这个流程的典型示例代码如下:

//1. 构造ServerSocket实例,指定服务端口。
ServerSocket servSock = new ServerSocket(servPort);


while(true)
{
	   // 2.调用accept方法,建立和客户端的连接
           Socket clntSock = servSock.accept();
           SocketAddress clientAddress =    
                clntSock.getRemoteSocketAddress();
           System.out.println("Handling client at " + clientAddress);

	    // 3. 获取连接的InputStream,OutputStream来进行数据读写
            InputStream in = clntSock.getInputStream();
            OutputStream out = clntSock.getOutputStream();

            while((recvMsgSize = in.read(receiveBuf)) != -1)
            {
                out.write(receiveBuf, 0, recvMsgSize);
            }   
	    // 4.操作结束,关闭socket.
            clntSock.close();
}  
 

Client端

客户端的请求过程稍微有点不一样:

1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。

2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。

3.操作结束后调用socket实例的close方法,关闭。

示例代码如下;

// 1.根据指定的server地址和端口,建立socket连接。
Socket socket = new Socket(server, servPort);

// 2. 根据socket实例获取InputStream, OutputStream进行数据读写。
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
out.write(data);

//3.操作结束,关闭socket.
socket.close();
 

 

UDP

UDP和TCP有两个典型的区别,一个就是它不需要建立连接,另外就是它在每次收发的报文都保留了消息的边界。

server端

因为UDP协议不需要建立连接,它的过程如下:

1. 构造DatagramSocket实例,指定本地端口。

2. 通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。

3. 通过DatagramSocket的send和receive方法来收和发DatagramPacket.

典型的交互流程代码如下:

 

// 1. 构建DatagramSocket实例,指定本地端口。
DatagramSocket socket = new DatagramSocket(servPort);

// 2. 构建需要收发的DatagramPacket报文
DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX);

while(true)
{
	// 3. 收报文
	socket.receive(packet);
	System.out.println("Handling client at " + packet.getAddress().getHostAddress()
	    + " on port " + packet.getPort());
	// 4. 发报文
	socket.send(packet);
	packet.setLength(ECHOMAX);
}
 

 

client端

UDP客户端的步骤也比较简单,主要包括下面3步:

1. 构造DatagramSocket实例。

2.通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。

3.结束后,调用DatagramSocket的close方法关闭。

因为和TCP不同,UDP发送报文的时候可以在同一个本地端口随意发送给不同的服务器,一般不需要在UDP的DatagramSocket的构造函数中指定目的服务器的地址。

另外,UDP客户端还有一个重要的不同就是,TCP客户端发送echo连接消息之后会在调用read方法的时候进入阻塞状态,而UDP这样却不行。因为UDP中间是可以允许报文丢失的。如果报文丢失了,进程一直在阻塞或者挂起的状态,则进程会永远没法往下走了。所以会一般设置一个setSoTimeout方法,指定在多久的时间内没有收到报文就放弃。也可以通过指定一个数字,循环指定的次数来读取报文,读到就返回,否则就放弃。

 

一个典型的UDP Client代码示例如下:

// 1. 构造UDP DatagramSocket对象
DatagramSocket socket = new DatagramSocket();

// 2。指定timeout时间,防止进入无限等待状态
socket.setSoTimeout(TIMEOUT);

// 3. 构造收发的报文对象
DatagramPacket sendPacket = new DatagramPacket(bytesToSend,
    bytesToSend.length, serverAddress, servPort);
DatagramPacket receivePacket =
    new DatagramPacket(new byte[bytesToSend.length], bytesToSend.length);

// 4.指定尝试的次数
int tries = 0;
boolean receivedResponse = false;
 do
{
	socket.send(sendPacket);
	try
	{
		socket.receive(receivePacket);
 
		if(!receivePacket.getAddress().equals(serverAddress))
		{
			throw new IOException("Received packet from an unknown source");
		}
		receivedResponse = true;
	}
	catch(InterruptedIOException e)
	{
		tries += 1;
		System.out.println("Timed out, " + (MAXTRIES - tries) + "");
	}
}while((!receivedResponse) && (tries < MAXTRIES));

// 根据是否接收到报文进行反馈
if(receivedResponse)
{
	System.out.println("Received: " + new String(receivePacket.getData()));
}
else
{
	System.out.println("No response -- giving up.");
}

// 5. 关闭socket
socket.close();

总结

TCP的server和client之间通信就好比两个人打电话,需要互相知道对方的电话号码,然后开始对话。所以在两者的连接过程中间需要指定端口和地址。

UDP的server和client之间的通信就像两个人互相发信。我只需要知道对方的地址,然后就发信过去。对方是否收到我不知道,也不需要专门对口令似的来建立连接。

这些示例其实只是一个最简单的,单线程,也只能一次处理单个请求的情况。在实际应用中一般会应用到多线程和一些处理高并发的策略,比如基于事件驱动的reactor模式等。可以在后续的文章中深入讨论。

参考资料

1. TCP/IP Sockets in Java

  • 大小: 65.6 KB
  • 大小: 59.1 KB
分享到:
评论

相关推荐

    Java TCP_IP Socket编程源代码书籍以及附带源码

    Java TCP/IP Socket编程是网络通信领域中的核心技术,广泛应用于服务器端和客户端之间的数据传输。本资源包含一本关于Java TCP/IP Socket编程的书籍及其配套源代码,对于深入理解Socket编程至关重要。 书籍《Java ...

    tcp_udp_socket.zip_Java TCP/UDP_java Tcp _java socket _java tcp

    总结来说,这个实验项目旨在帮助开发者实践TCP和UDP的Socket编程,理解它们在可靠性和效率上的区别,以及在Java中如何利用相关API进行实际的网络通信操作。通过分析和运行这些示例代码,可以深化对网络编程的理解,...

    Java TCP/IP Socket编程

    ### Java TCP/IP Socket编程 #### 1. 计算机网络、分组报文和协议 计算机网络是指通过通信设备和线路将地理位置分散、功能独立的多个计算机系统互连起来,以功能完善的网络软件(即网络通信协议、信息交换方式及...

    Java_TCP_IP_Socket编程(原书第2版)

    以上只是Java TCP/IP Socket编程的一些基本概念和关键点,实际应用中还会涉及到更多高级话题,如SSL/TLS安全套接层、多播Socket、UDP(用户数据报协议)编程等。通过深入学习和实践,你可以掌握构建高效、稳定的网络...

    Tcp/udp网络调试助手

    在Java编程环境中,开发网络应用时,可以利用Java的Socket类实现TCP通信,DatagramSocket类实现UDP通信。结合“TCP/UDP网络调试助手”,开发者可以在代码编写和调试阶段,验证程序的正确性和性能,确保网络应用的...

    TCP/UDP Socket 调试工具,基于Qt & C++ 开发

    Socket编程是计算机网络通信的核心部分,它为应用程序提供了在不同设备间交换数据的接口。TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的网络传输协议,它们各有特点并适用于不同的应用场景。本项目是一个...

    Java TCP IP Socket编程(中文版).pdf

    在计算机网络领域,TCP/IP是一组用于互联网数据传输的协议,而Socket编程则是实现这些协议功能...通过上述知识点的介绍,可以了解Java TCP/IP Socket编程的基础和进阶内容,以及如何利用Java语言开发高性能的网络应用。

    Java+TCP/IP+Socket编程++原书第2版

    《Java+TCP/IP+Socket编程++原书第2版》是一部深入探讨Java网络编程的权威著作,主要聚焦于TCP/IP协议栈与Socket编程技术。在Java编程领域,掌握网络通信能力是开发分布式系统、服务器端应用以及实时数据传输等项目...

    TCP/UDP网络聊天室.zip

    项目中的"网络作业"可能包含了实现聊天功能的源代码文件,这些文件可能包括服务器端的Socket编程,客户端的连接建立,数据的编码与解码,以及UI组件的事件处理等。在解决压缩程序导致的乱码问题时,附带的PDF文档...

    TCP/UDP模拟服务端

    7. **网络编程库**:许多编程语言提供了网络编程库,如Python的socket库,Java的Socket类,可以帮助简化TCP和UDP服务器的实现。 通过分析和实践"TCP/UDP模拟服务端"项目,开发者可以深入理解网络通信的基础,同时...

    基于TCP/IP协议的Socket编程

    Java实现的Socket编程是基于TCP/IP协议的,它提供了一个可靠的数据流服务,可以实现客户端和服务器之间的数据交换。Java中的Socket类和ServerSocket类是两种基本的套接字类,Socket类用于建立客户端和服务器之间的...

    java -> TCP/UDP 连接测试 SocketTest

    下面我们将详细探讨TCP和UDP的特点、Java中的Socket编程以及如何进行连接测试。 TCP是一种面向连接的、可靠的传输协议,它确保了数据的完整性和顺序性。在TCP通信中,数据在发送前会建立连接,并且在接收方会按照...

    Java_TCPIP_Socket编程(中+英两本)

    《TCP-IP Sockets in Java, 2nd Edition》作为外文教材,详细介绍了Java Socket编程的各个方面,包括TCP和UDP协议、套接字选项、异步I/O以及高级主题如NIO(非阻塞I/O)和NLPIJ(网络负载平衡和持久性接口)。...

    实验三socket编程代码.rar_socket编程_tcp/udp_一对多聊天_多人聊天室_计算机网络实验

    学习和理解这段代码,不仅可以帮助你掌握Socket编程的基本技巧,还能让你深入了解TCP和UDP的工作原理,以及如何在实际场景中应用它们。 总的来说,这个实验提供了丰富的实践机会,涵盖了Socket编程的核心概念,包括...

    JAVA TCP和UDP Socket通信框架

    Java中的TCP和UDP Socket通信是网络编程的基础,用于在不同设备之间建立可靠的数据传输通道。TCP(Transmission Control Protocol)提供的是面向连接、有序且无损的服务,而UDP(User Datagram Protocol)则是无连接...

    Java TCPIP Socket编程.pdf

    Java TCPIP Socket编程是Java开发语言在后端服务中实现网络通信的重要技术,它基于Apache等开源库提供了丰富的API来创建高效、可靠的网络连接。本章将深入探讨Socket编程的基本概念和实现方法。 1. 计算机网络、...

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件

    Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言...

    Java socket编程实例.pdf

    本文将通过一个具体的Java Socket编程实例来深入探讨如何使用Java实现客户端与服务端之间的通信。 #### 二、基础知识概述 在开始具体实例之前,我们需要了解一些基本概念: - **Socket**:Socket是一种用于在网络...

Global site tag (gtag.js) - Google Analytics