Java实现TCP_ECHO服务器原理与代码解析

版权申诉
0 下载量 47 浏览量 更新于2024-11-10 收藏 1KB RAR 举报
资源摘要信息:"TCP_ECHO.rar_ECHO JAVA_echo server_java tcp server" 知识点详细说明: 1. Echo Server概念: Echo Server是一个网络服务程序,它的主要功能是接收客户端发送过来的数据,然后将接收到的数据原封不动地回传给客户端,相当于回声。这种服务器常用于网络编程中的测试,比如检查网络连接是否正常,以及了解网络数据传输的基本原理。Echo Server可以基于不同的协议实现,如TCP/IP或UDP。 2. Java实现Echo Server: 使用Java实现一个Echo Server涉及到Java网络编程的相关知识,这通常包括使用Java的Socket编程接口。在TCP/IP协议中,一个TCP Echo Server会创建一个ServerSocket监听特定的端口,当接收到客户端的连接请求后,服务器会与客户端建立连接并创建一个新的Socket用于数据传输。服务器通过输入流(InputStream)读取客户端发送的数据,通过输出流(OutputStream)将相同的数据发送回客户端。这种方式可以持续进行,直到客户端关闭连接或服务器决定关闭连接。 3. TCP协议: TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP/IP模型中,TCP位于传输层,它为应用程序提供可靠的通信连接。为了实现这一目的,TCP提供了数据包排序、流量控制、拥塞控制和错误检测等功能。Echo Server的TCP实现会利用这些特性来确保数据准确无误地传输。 4. 基础概念: 在Java实现的TCP Echo Server中,涉及到几个基础概念,包括: - ServerSocket:Java中用于实现TCP服务器的类,它在指定端口上监听连接请求。 - Socket:表示一个到远程机器的连接的端点,可以用于发送和接收数据。 - InputStream:代表字节流输入,用于读取数据。 - OutputStream:代表字节流输出,用于发送数据。 - 端口号:用于区分不同的服务或进程,端口号是一个16位的无符号整数,范围从0到65535。 5. JAVA_TCP_SERVER标签: JAVA_TCP_SERVER标签指的是使用Java语言编写的基于TCP协议的服务器端程序。这类程序需要掌握Java网络编程的知识,熟悉Java的Socket API以及如何处理网络IO操作。 6. 文件名称"TCP_ECHO.java": 该文件名表明源代码文件包含了实现TCP Echo Server的Java代码。通过分析和阅读这份Java文件,可以了解如何通过Java语言来创建一个简单的服务器端应用程序,处理网络连接,并进行数据的接收与发送操作。 以上知识点详细地解释了标题、描述、标签和文件名称列表中所提及的各个概念,旨在提供对Java版TCP Echo Server实现的深入理解。了解这些知识点将有助于开发者在进行网络编程以及服务器端应用程序的开发时,能够设计和实现更为稳定和高效的系统。

static char *TCPCommand; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int SetUpTCPtoSendInformation(char option[], char **command) { static int isFirstCall = 1; pthread_mutex_lock(&mutex); // 加锁 if (isFirstCall && strstr(option, "set")) { CON_LOG("33\n"); if (TCPCommand != NULL) { free(TCPCommand); CON_LOG("33\n"); } CON_LOG("33\n"); TCPCommand = malloc(strlen(*command) + 1); CON_LOG("33\n"); if (TCPCommand == NULL) { printf("Failed to set and obtain TCP command variable memory allocation\n"); goto fail; } CON_LOG("33\n"); strcpy(TCPCommand, *command); CON_LOG("set:%s\n", TCPCommand); isFirstCall = 0; goto succeed; } else if (!isFirstCall && strstr(option, "get") && TCPCommand != NULL && strlen(TCPCommand)) { free(*command); *command = malloc(strlen(TCPCommand) + 1); strcpy(*command, TCPCommand); CON_LOG("get:%s\n", *command); memset(TCPCommand, '\0', strlen(TCPCommand)); free(TCPCommand); TCPCommand = NULL; isFirstCall = 1; goto succeed; }else { *command = malloc(1); if (*command == NULL) { CON_LOG("Failed to allocate memory for command\n"); goto fail; } **command = '\0'; CON_LOG("Invalid option\n"); goto fail; } fail: pthread_mutex_unlock(&mutex); // 解锁 return 0; succeed: pthread_mutex_unlock(&mutex); // 解锁 return 1; } SetUpTCPtoSendInformation("set","echo `uci get m_system.usesiminfo.operator;uci get m_system.usesiminfo.card_slot; \ uci get m_system.usesiminfo.iccid;uci get m_system.usesiminfo.lock;uci get m_system.system.simnum`");调用报错, 到这一行代码TCPCommand = malloc(strlen(*command) + 1);程序退出

134 浏览量

static char *TCPCommand; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int SetUpTCPtoSendInformation(char option[], char **command) { static int isFirstCall = 1; pthread_mutex_lock(&mutex); // 加锁 if (isFirstCall && strstr(option, "set")) { CON_LOG("33\n"); if (TCPCommand != NULL) { free(TCPCommand); CON_LOG("33\n"); } CON_LOG("33\n"); TCPCommand = malloc(strlen(*command) + 1); CON_LOG("33\n"); if (TCPCommand == NULL) { printf("Failed to set and obtain TCP command variable memory allocation\n"); goto fail; } CON_LOG("33\n"); strcpy(TCPCommand, *command); CON_LOG("set:%s\n", TCPCommand); isFirstCall = 0; goto succeed; } else if (!isFirstCall && strstr(option, "get") && TCPCommand != NULL && strlen(TCPCommand)) { free(*command); *command = malloc(strlen(TCPCommand) + 1); strcpy(*command, TCPCommand); CON_LOG("get:%s\n", *command); memset(TCPCommand, '\0', strlen(TCPCommand)); free(TCPCommand); TCPCommand = NULL; isFirstCall = 1; goto succeed; }else { *command = malloc(1); if (*command == NULL) { CON_LOG("Failed to allocate memory for command\n"); goto fail; } **command = '\0'; CON_LOG("Invalid option\n"); goto fail; } fail: pthread_mutex_unlock(&mutex); // 解锁 return 0; succeed: pthread_mutex_unlock(&mutex); // 解锁 return 1; }char* command = "echo `uci get m_system.usesiminfo.operator;uci get m_system.usesiminfo.card_slot; \ uci get m_system.usesiminfo.iccid;uci get m_system.usesiminfo.lock;uci get m_system.system.simnum`"; SetUpTCPtoSendInformation("set", &command);char* command = "echo `uci get m_system.usesiminfo.operator;uci get m_system.usesiminfo.card_slot; \ uci get m_system.usesiminfo.iccid;uci get m_system.usesiminfo.lock;uci get m_system.system.simnum`"; SetUpTCPtoSendInformation("set", &command);程序对么,指针可以第二次赋值么

132 浏览量

static char *TCPCommand; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int SetUpTCPtoSendInformation(char option[], char **command) { static int isFirstCall = 1; pthread_mutex_lock(&mutex); // 加锁 if (isFirstCall && strstr(option, "set")) { if (TCPCommand != NULL) { free(TCPCommand); } TCPCommand = malloc(strlen(*command) + 1); if (TCPCommand == NULL) { printf("Failed to set and obtain TCP command variable memory allocation\n"); goto fail; } strcpy(TCPCommand, *command); printf("set:%s\n", TCPCommand); isFirstCall = 0; goto succeed; } else if (!isFirstCall && strstr(option, "get") && TCPCommand != NULL && strlen(TCPCommand)) { free(*command); *command = malloc(strlen(TCPCommand) + 1); strcpy(*command, TCPCommand); printf("get:%s\n", *command); memset(TCPCommand, '\0', strlen(TCPCommand)); free(TCPCommand); TCPCommand = NULL; isFirstCall = 1; goto succeed; }else { *command = malloc(1); if (*command == NULL) { CON_LOG("Failed to allocate memory for command\n"); goto fail; } **command = '\0'; CON_LOG("Invalid option\n"); goto fail; } fail: pthread_mutex_unlock(&mutex); // 解锁 return 0; succeed: pthread_mutex_unlock(&mutex); // 解锁 return 1; }两个进程一个进程是 char* command1 = "echo `uci get m_system.usesiminfo.operator;uci get m_system.usesiminfo.card_slot; \ uci get m_system.usesiminfo.iccid;uci get m_system.usesiminfo.lock;uci get m_system.system.simnum`"; char* command2 = "echo `uci get m_system.sim1.operator;uci get m_system.sim1.card_slot;uci get m_system.sim1.iccid; \ uci get m_system.sim2.operator;uci get m_system.sim2.card_slot;uci get m_system.sim2.iccid; \ uci get m_system.sim3.operator;uci get m_system.sim3.card_slot;uci get m_system.sim3.iccid; \ uci get m_system.sim4.operator;uci get m_system.sim4.card_slot;uci get m_system.sim4.iccid`"; SetUpTCPtoSendInformation(setExeCmd,&command1);SetUpTCPtoSendInformation(setExeCmd,&command2);另一个是whlie(1){SetUpTCPtoSendInformation("get", &SendString);}请问同时运行这两个进程get能获取到这两个set的值,如果娶不到请帮我优化程序

145 浏览量