`

TCP/IP通讯(一)

阅读更多
package cc.leng.tcpip.step1;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;

public class TCPEchoServer {
	private static final int BUFSIZE = 32;
	public static void main(String[] args) throws Exception {
		ServerSocket server = null;
		try{
			if((args.length != 1)){
				throw new IllegalArgumentException("Parameters(s): <Port>");
			}
			int serverPort = Integer.parseInt(args[0]);
			
			server = new ServerSocket(serverPort);
			
			int recvMsgSize;
			byte[] receiveBuf  = new byte[BUFSIZE];
			
			while(true){
				Socket socket = server.accept();
				
				SocketAddress clientAddr = socket.getRemoteSocketAddress();
				System.out.println("Handling client at "+clientAddr+"");
				
				InputStream in = socket.getInputStream();
				OutputStream out = socket.getOutputStream();
				
				while((recvMsgSize = in.read(receiveBuf)) != -1){
					out.write(receiveBuf, 0, recvMsgSize);
				}
				
				socket.close();
			}
			
			
		}finally{
			System.out.println("");
		}
	}

}

 

 

 

package cc.leng.tcpip.step1;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;

public class TCPEchoClient {
	
	public static void main(String[] args) throws Exception, IOException {
		Socket socket = null;
		try{
			if((args.length <2) || (args.length >3)){
				throw new IllegalArgumentException("Parameters(s): <Server> <word> [<Port>]");
			}
			String server = args[0];
			
			byte[] data = args[1].getBytes();
			
			int serverPort = args.length == 3 ? Integer.parseInt(args[2]) : 7777;
			
			socket = new Socket(server,serverPort);
			
			System.out.println("Connected to server ... sending echo string");
			
			InputStream in = socket.getInputStream();
			OutputStream out = socket.getOutputStream();
			
			out.write(data);
			
			int totalBytesRcvd = 0;
			int bytesRcvd;
			while(totalBytesRcvd < data.length){
				if((bytesRcvd = in.read(data, totalBytesRcvd, data.length)) == -1){
					throw new SocketException("Connection closed prematurely");
				}
				totalBytesRcvd += bytesRcvd; 
			}
			System.out.println("Received: "+ new String(data));
		}finally{
			if(null != socket)
				socket.close();
		}
		
	}

}

  

 

重点:in.read(buf) != -1

        问: 什么时候会返回-1

        答:对端socket.close();或者socket.shutdownOutput();

        

       问:在while循环中,in.read()如果完成一轮轮询?

        答:TCP协议中包头带有对端out.write(buf)的长度,接收端可以通过这个长度来判断这次轮询接收是否结束

 上面代码分析

服务端在while循环中反复读取字节数据(数据在可获取时),并立即将同样的字节返回给输出流,这个过程一直持续到客户端关闭连接。INputStream的read()方法每次获取缓存数组所能放下的最多字节(BUFSIZE),并存入该数组(receiveBuf),同时返回实际读取的字节数。read()方法将阻塞带灯,直到有可读数据。如果数据已经读取完成则返回-1,标识客户端关闭了其套接字。在消息反馈时,客户端在接受的字节数与其发送的字节数相等就关闭连接,因此在服务器端最终将从read()方法中收到-1的返回值。(这个地方是已知了数据接收的大小,如果totalBytesRcvd < data.length表示 没有接收完并且通讯就结束了则抛出异常)     

 

下边是引用查找到到TCP连接和数据的原理

 

Java当中的Socket类,其实是使用TCP协议进行传输的.TCP是可靠的一种传输协议. 

如果想用TCP协议,并且,服务端和客户端,在没有信息进行传输的时候,也不断开连接,一般情况下,客户端会在Socket超时之前,想服务端发送一个用于维持连接的信息包,来维持连接.但是TCP协议,并不是指长连接.我们每天上网浏览网页,其实,也是以TCP协议为基本的传输协议的.只是,这个是短连接的形式,每次浏览器向服务器提交一个请求,服务短应答请求,然后断开连接. 

在应用TCP协议,并且是长连接传输信息的情况下.通常会再封装一层协议的.但,观察版主的收发内容,并没有涉及这一层,所以,我这里并不知道是长连接. 

首先,我们要明确一点,发送方如果不将输出流进行关闭,接收方就会认为输入流没有结束,直到超时. 
其次,我们判断一个信息是否已经完全的读取完毕,除了使用输入流结束这种办法,还可以自行封装一层协议,用于信息的交互. 
当然,我们也可以采用Http那样的交互方式进行信息的传递,但是,它是短连接的. 

下面我来说一下,TCP长连接传输数据的一般做法. 
一般情况下,我们会在TCP的基础上再封装一层协议,用户长连接的传输.协议的信息包,也分包头和包体两个部分. 
包体,主要就是我们要传输的信息.(维持连接的信息包,包体可为空) 
包头,一般分为三个部分.第一部分是信息包的长度(长度一般是指整个信息包的长度);第二部分是包体信息的类型(在这里指出是否是维持连接包);第三部分是信息包的序列号,一般情况下,这个序列号要确保在传输过程中唯一标识该信息包. 
如果为了安全起见,还可以在包体后添加包尾,包尾数据用于对包体数据的验证) 

这样,通信双方就可以根据包长来判断一次接收的操作是否结束了. 

 

  

分享到:
评论

相关推荐

    三菱FX5UJ和艾莫迅远程模块实现TCP/IP通讯,程序包含多种功能吗的实现

    首先,我们要理解TCP/IP通讯的基础,然后逐步解析源码软件的实现细节。 TCP/IP(传输控制协议/因特网协议)是一种标准网络通信协议,它定义了数据在网络中的传输方式,包括网络层的IP协议,负责数据包的路由,以及...

    基于mfc智能设备的tcp/ip通讯

    本项目“基于MFC智能设备的TCP/IP通讯”旨在通过MFC库开发一个简单的通讯软件,使PC机能够与使用MFC的智能设备进行高效的数据交换。 首先,我们需要了解MFC如何处理TCP/IP通讯。在MFC中,网络编程通常涉及CSocket类...

    比较完整的TCP/IP通讯实例

    本实例“比较完整的TCP/IP通讯实例”提供了一个全面的参考,涵盖了Server端和Client端的编程实现,适用于开发者根据自身需求进行扩展。 TCP/IP协议栈分为四层(在OSI七层模型中对应为五层):应用层、传输层、网络...

    C#实现串口通讯和TCP/IP通讯的示例程序

    本示例程序聚焦于C#实现串口通讯和TCP/IP通讯,这两大通信方式在工业自动化、物联网(IoT)和嵌入式系统中扮演着核心角色。 **串口通讯**(Serial Communication)是指通过串行接口进行数据传输。在C#中,我们可以...

    KUKA机器人TCIP/IP通讯

    库卡(KUKA)机器人TCP/IP通讯是工业自动化领域中的一个重要知识点,它涉及了现代机器人控制技术、网络通信协议以及编程接口等多个方面。在这个专题中,我们将深入探讨如何利用TCP/IP协议与KUKA机器人进行高效、稳定...

    C# TCP/IP通信小例子

    本示例"**C# TCP/IP通信小例子**"是一个基础教程,旨在帮助新手理解如何在C#中实现TCP/IP通信。 TCP(传输控制协议)和IP(因特网协议)是Internet上最基础的通信协议,TCP负责确保数据的可靠传输,而IP则处理...

    TCP/IP通讯技术

    MFC例子TCP/IP通讯技术

    PB9+TCP/ip通讯服务利用winSocket的例子(简单,测试通过)

    标题 "PB9+TCP/ip通讯服务利用winSocket的例子(简单,测试通过)" 指的是一个使用PowerBuilder 9(PB9)编程语言,并结合Windows Socket API(通常称为winSocket)实现TCP/IP通信的示例项目。这个项目已经过测试并确认...

    STM32 tcp/ip通讯

    TCP/IP通讯是STM32实现网络功能的基础,允许设备通过互联网与其他设备进行数据交换。本文将深入探讨STM32如何实现TCP/IP通信,并基于提供的"STM32 tcp/ip通讯"项目,分析其代码和步骤。 首先,TCP/IP协议栈是STM32...

    串口通讯和TCP/IP通讯程序

    TCP/IP通讯,全称为传输控制协议/因特网协议,是互联网上应用最广泛的一种网络通信协议。TCP/IP通讯主要应用于网络上的设备间通信,具有以下特性: 1. 高速:TCP/IP通讯可以实现高速数据传输,速率可达到Mbps甚至...

    基于socket应用的TCP/Ip通讯

    在IT领域,网络通信是至关重要的组成部分,而TCP/IP通讯协议族则是互联网通信的基础。本文将深入探讨基于Socket应用的TCP/IP通讯,包括其工作原理、实现方式以及如何通过服务端和客户端进行交互。 首先,TCP...

    tcp/ip通讯方式实现聊天源码

    TCP/IP通讯方式是互联网通信的基础,它是一种分层的网络通信模型,由四层组成:应用层、传输层、网络层和数据链路层。在这个模型中,每一层都有其特定的功能,为上层提供服务并向下层传递数据。本项目以"tcp/ip通讯...

    s7-300的tcp/ip协议通讯

    ### S7-300的TCP/IP协议通讯 #### 概述 SIMATIC S7-300系列的CPU集成了PROFINET接口,不仅支持PROFINET总线通信,还可以用于标准的TCP/IP通信。这使得S7-300能够通过组态TCP连接以及使用开放式通信的功能块与其他...

    C#编写的局域网通讯 TCP/IP

    8. **以太网通讯**: 以太网是局域网最常用的通信标准,C#的TCP/IP通信默认就是在以太网上进行的。以太网提供了物理层和数据链路层的规范,确保数据能在局域网中正确传输。 9. **防火墙与端口转发**: 在实际环境中,...

    PLC通过TCP/IP协议通信实例C#源码

    TCP/IP协议作为互联网的基础,具有稳定、可靠的特性,非常适合在工业环境中用于设备间的通讯。 首先,我们需要理解TCP/IP协议栈的四层模型:应用层、传输层、网络层和数据链路层。在PLC通信中,我们主要关注应用层...

    Delphi TCP/IP通信

    TCP/IP通信是网络编程的基础,它允许不同计算机之间的数据交换。在Delphi中,通过使用内置的Internet组件,如ServerSocket和ClientSocket,开发者可以轻松实现TCP/IP通信。 ServerSocket组件代表服务器端,用于监听...

    Tcp/Ip通讯程序

    TCP/IP通信协议是互联网上最基础、最重要的通信协议之一,它定义了数据在网络中传输的规则和格式。本程序示例展示了两台计算机如何利用TCP/IP进行点对点的通信,这对于理解网络编程原理以及实际开发具有重要意义。 ...

    tcp-udp.rar_C语言tcp/ip通讯_TCP IP C语言_TCP/ip c语言_c语言 tcp_tcp/ip c语

    TCP/IP协议栈是一个分层模型,包括应用层、传输层、网络层和数据链路层。应用层负责定义各种网络应用,如HTTP、FTP等;传输层处理端到端的数据传输,TCP和UDP就属于这一层;网络层主要负责数据包的路由选择,如IP...

    用TCP/IP服务器客户端通讯源代码(基于VC++)

    总的来说,TCP/IP服务器客户端通讯源代码的实现涉及网络编程、VC++编程和Winsock API的使用。通过学习和实践这些示例代码,你可以深入理解网络通信的底层机制,并具备开发自己TCP/IP应用的能力。

    TCP/IP通信c#例程

    在IT行业中,网络通信是至关重要的一个领域,TCP/IP(Transmission Control Protocol/Internet Protocol)协议栈则是互联网通信的基础。本文将深入探讨C#语言中实现TCP/IP通信的相关知识点,通过实例来阐述如何创建...

Global site tag (gtag.js) - Google Analytics