`
Mr.Ben
  • 浏览: 21853 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

TCP自定义数据包的Socket编程(一)

阅读更多
java在网络方面的出色表现相信大家有目共睹,用java做Socket编程是件有趣的事情,下面是实际项目中的代码,初学者可能觉得不是那么浅显易懂,所以加入了详细注释,废话不多说了服务端代码如下:
package com.tcp;

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

public class TcpServer {
	public static void main(String[] args) throws IOException {
		// 声明用来计数的int局部变量
		int count = 0;
		byte[] head = new byte[29];
		byte[] body;
		try {
			// 使用ServerSocket
			ServerSocket server = new ServerSocket(9999);
			// 打印提示信息
			System.out.println("服务器端正在对端口9999进行监听");
			// 等待客户端连接
			while (true) {
				// 若有连接返回对应的Socket对象。
				Socket sc = server.accept();
				// 获取当前链接对象的输入流
				InputStream din = sc.getInputStream();
				// 获取当前连接对象的输出流
				OutputStream dout = sc.getOutputStream();
				// 读取包头并打印包头所包含的信息
				din.read(head);
				System.out.println("==========================" + (++count)
						+ "========================");
				System.out.println("客户端IP地址:" + sc.getInetAddress());
				System.out.println("客户端端口号:" + sc.getPort());
				System.out.println("本地端口号:" + sc.getLocalPort());
				System.out
						.println("接收到的数据包16进制表示为:" + byteToHexStr(head, true));

				// 判断,如果是请求包则返回一个响应
				if (head[0] == 1) {
					//临时代码,接收请求包并原样返回消息包头
					head[0] = 2;
					dout.write(head);
					System.out.println("******收到请求包,已返回响应......******");
				} else if (head[0] == 2) {
					System.out.println("************收到响应包****************");
				} else {
					System.out.println("*******数据包已损坏,接收失败************");
				}
				// 关闭流
				din.close();
				dout.close();
				// 关闭Socket连接
				sc.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//该方法将数据转为16进制显示
	public static String byteToHexStr(byte[] bArray, boolean format) {
		StringBuffer strb = new StringBuffer(bArray.length);
		String str;
		for (int i = 0; i < bArray.length; i++) {
			str = Integer.toHexString(0xFF & bArray[i]).trim();
			if (str.length() < 2){
				str = "0" + str;
			}
			if (format){
				str += " ";
			}
			strb.append(str);
		}
		str = strb.toString().toUpperCase().trim();
		return str;
	}
}

不知你有没有注意到,服务器端在读流时用的是读字节流的方式,而没有用到处理流,处理流经常会带来高效率,不过我们在处理二进制流的时候,尽量还是用最原始的方法,因为字符流在处理数据的时候,会将占两个字节的“00”转换后还剩下一个字节长度。
接下来是FTP请求端的代码:
package com.tcp;

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

public class TcpSend {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		byte[] bt = new byte[29];
		try {
			// 创建连接到服务端的Socket对象
			Socket cs = new Socket("10.168.69.177", 9999);
			// 获取当前连接的输入流/输出流
			InputStream din = cs.getInputStream();
			OutputStream dout = cs.getOutputStream();
			// 模拟一个请求消息包.
			byte[] pack = new EncodePackage().gepPackage();
			//发送请求消息包.
			dout.write(pack); 
			// 从服务器中读取数据并打印
			din.read(bt, 0, 29);
			if (bt[0] == 2) {
				System.out.println("=======收到响应包=======");
				System.out.println("包类型:" + bt[0]);
				System.out.println("包标识:" + new String(bt, 1, 4));
				System.out.println("包长度:" + new Integer(new String(bt, 5, 4)));
				System.out.println("MD5校验和:" + new String(bt, 9, 16));
				System.out.println("版本号:" + bt[25]);
				System.out.println("协议类型:" + (byte) (bt[26]));
				System.out.println("命令类型" + new String(bt, 27, 2));
			}
			// 关闭流,关闭Socket连接
			din.close();
			dout.close();
			cs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

有了服务端和请求端代码Socket的基本通信已经完成了,对,就是这么简单。接下来就是对自定义数据包的打包和解包工作了,首先包头定义如下:

待续//////

欢迎快来加入Java无极限团队哟!团队地址为:http://wenwen.soso.com/t/TeamHome.e?sp=83190
1
0
分享到:
评论
1 楼 Javac_bean 2017-12-06  
请问下这个EncodePackage 在哪里哈

相关推荐

    基于tcp的socket编程

    Socket编程是实现TCP通信的一种方式,它为应用程序提供了访问网络层服务的接口。本篇文章将深入探讨基于TCP的Socket编程,包括基本概念、服务器端和客户端的实现,以及常见问题。 首先,TCP套接字(Socket)是应用...

    C实现基于Socket实现自定义协议通信

    在IT行业中,网络通信是至关重要的一个领域,而Socket编程是构建网络应用程序的基础。本教程主要聚焦于如何使用C语言实现基于Socket的自定义协议通信,涵盖了客户端和服务端的实现。我们将深入理解Socket编程的基本...

    TCP和UDP socket调试工具V2.2

    总的来说,TCP和UDP Socket调试工具V2.2是一款实用的开发辅助软件,它简化了网络编程中复杂的数据传输和连接管理,帮助开发者快速定位问题,优化网络应用的性能。无论你是初学者还是经验丰富的程序员,都能从中受益...

    在C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架

    总结来说,使用C#的异步Socket编程实现TCP网络服务的C/S通讯构架,需要设计和实现一系列辅助类,通过事件驱动模型增强网络通信的灵活性和可靠性。通过这样的方式,可以构建出稳定且可扩展的网络应用程序。同时,良好...

    MFC:Socket编程—TCP服务端和多个客户端通信 示例代码

    在本文中,我们将深入探讨MFC(Microsoft Foundation Classes)中的Socket编程,特别是如何实现一个TCP服务端与多个客户端之间的通信。MFC是微软提供的一套C++类库,用于简化Windows应用程序开发,其中包括对网络...

    基于 TCP 协议的自定义数据帧的形式来进行长数据(图片)的传输的源码

    本主题将深入讲解如何利用TCP Socket编程实现自定义数据帧进行长数据传输,特别是图片的发送与接收。 TCP协议保证了数据的顺序和可靠性,通过三次握手建立连接,并使用滑动窗口机制来控制流量和确认数据包的接收。...

    sendtcp java发送TCP数据包的程序,基于winpcap,Jpcap.zip

    通过Jpcap,开发者可以编写程序来捕获网络流量、过滤数据包、发送自定义数据包以及分析网络活动。 5. **TCP数据包发送**:在Java中,利用Jpcap发送TCP数据包可能涉及到以下步骤: - 加载本地网络接口:Jpcap提供...

    TCP/UDP Socket 调试工具

    在使用时,我们需要了解基本的Socket编程概念,熟悉TCP和UDP的工作原理,以便更好地利用此类工具定位和解决问题。同时,对于网络协议的理解也是必不可少的,因为报文的构造和解析往往基于特定的协议规范。通过熟练...

    网络编程课件 Socket编程

    Socket编程是实现网络通信的基础,它提供了一组API(应用程序编程接口),使得程序员可以构建跨越网络的通信应用。本篇主要讨论Socket编程的核心概念,包括套接字的类型、数据封装以及相关的数据结构。 1. 套接字...

    Python伪造TCP数据包1

    在Python中,可以使用内置的`socket`模块来创建和操作TCP套接字,进而构造和发送自定义的TCP数据包。具体操作包括: 1. 创建套接字:使用`socket.socket()`函数创建一个套接字对象,指定协议族(AF_INET代表IPv4)...

    TCP RAW_SOCKET源码

    在IT行业中,TCP RAW_SOCKET是一种低级别的网络编程接口,它允许程序员直接操作网络协议栈,而不依赖于操作系统提供的较高层次的TCP/IP套接字API。本文将深入探讨TCP RAW_SOCKET的相关知识点,包括其原理、使用场景...

    socket编程基础实例

    Socket编程是计算机网络通信的核心技术之一,主要用于实现进程间的网络通信。在Linux系统中,它是一种标准的API,被广泛应用于服务器端和客户端程序的开发。本知识点将深入讲解socket编程的基本概念、步骤以及相关...

    TCP-UDP-SOCK-TOOL[TCP-UDP Socket调试工具集合].7z

    Socket编程是通过编程接口(API)实现TCP和UDP通信的过程。在Windows系统中,这通常是Winsock API;在Unix/Linux系统中,它是Berkeley Sockets。开发者使用Socket API创建服务器端和客户端,服务器端监听特定端口,...

    socket 编程

    Socket编程主要涉及TCP(传输控制协议)和UDP(用户数据报协议)两种协议,其中TCP保证了数据的可靠传输,而UDP则更注重速度,但不保证数据包的顺序和完整性。 在Objective-C中,我们通常使用CFSocket框架来创建和...

    Socket编程详细解析

    Socket编程是计算机网络通信的核心技术之一,主要用于实现进程间的网络通信。它允许两台或多台计算机通过网络交换数据,提供了在网络层之上建立可靠连接的机制。在这个“Socket编程详细解析”系列中,我们将深入探讨...

    socket编程实现通信

    以上是对"socket编程实现通信"这一主题的详细阐述,涵盖了Socket的基本概念、TCP协议、服务器与客户端的编程步骤、数据传输、异常处理以及实际应用等多个方面。通过这些知识点,开发者能够构建起基本的网络通信系统...

    发送TCP数据包

    在编程实现发送TCP数据包时,可以使用原始套接字(raw socket),它允许直接操作网络层的数据包,包括填充TCP头部和数据字段。 5. **程序设计要求**: - 程序名为SendTCP,通过命令行参数指定源IP、源端口、目的...

Global site tag (gtag.js) - Google Analytics