Socket通信,Java客户端C服务器

2023-12-31

我正在尝试通过套接字与 Java 客户端和 C 服务器进行通信 如果我尝试在命令行上使用 nc 来连接服务器,或者如果我使用 nc 作为服务器并与我的 Java 客户端连接,那么一切似乎都工作正常,但是当我尝试连接 Java 客户端和 C 服务器时,它不起作用。

客户端开始连接,并发送消息,服务器接收到消息,但服务器的响应永远不会到达客户端。

服务器代码:

#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <strings.h>
#include <unistd.h>

int main( int argc, char *argv[] )
{
    int sockfd, clisockfd, portno;
    char * start = "hello";
    char * end = "bye";
    socklen_t clilen;
    char buffer[256];
    char contentBuffer[255];
    struct sockaddr_in serv_addr, cli_addr;
    int  n;
    //int optval;

    /* First call to socket() function */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
    {
        perror("ERROR opening socket");
        return(1);
    }

    /* Initialize socket structure */
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = 5000;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(portno);


    if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
    {
        perror("ERROR on binding");
        return(1);
    }

    listen(sockfd,5);
    clilen = (socklen_t) sizeof(cli_addr);

    clisockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);

    if (clisockfd < 0) 
    {
        perror("ERROR on accept");
        return(1);
    }

    while (strcmp(end, contentBuffer) !=0)
    {
        bzero(buffer,256);
        bzero(contentBuffer,255);
        /* If connection is established then start communicating */
        n = read( clisockfd,buffer,255 );
        if (n < 0)
        {
            perror("ERROR reading from socket");
            return(1);
        }

        strncpy(contentBuffer,buffer,strlen(buffer) - 1);  
        if (strcmp(start, contentBuffer) ==0)
        {
            printf("command: %s\n",buffer);
            n = write(clisockfd,"Roger that",11);
            if (n < 0)
            {
                perror("ERROR writing to socket");
                return(1);
            }
        }
        else 
        {
            printf("Unknown command: %s\n",buffer);
            n = write(clisockfd,"ERRCmd",7);
            if (n < 0)
            {
                perror("ERROR writing to socket");
                return(1);
            }           
        }
    }
    close(sockfd);
    return 0;


}

客户端代码:

import java.io.*;
import java.net.*;

public class Cliente {
    public static void main(String[] args) throws IOException {

        if (args.length != 2) {
            System.err.println(
                "Usage: java EchoClient <host name> <port number>");
            System.exit(1);
        }

        String hostName = args[0];
        int portNumber = Integer.parseInt(args[1]);
        Socket firstSocket = new Socket(hostName, portNumber);
        PrintWriter out = new PrintWriter(firstSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(firstSocket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) 
        {
            out.println(userInput);
            System.out.println("received: " + in.readLine());
        }
        in.close();
        stdIn.close();
        firstSocket.close();

    }
}

readLine()阻塞直到连接被建立shutdown() or close()d 或者它收到了换行符\n,服务器永远不会发送它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Socket通信,Java客户端C服务器 的相关文章

随机推荐

  • 将用户身份验证详细信息存储在单独的表中的优点

    我在 mysql 中有一个用户表 其中包含所有用户数据 名字 姓氏 地址等 但是我是否应该将身份验证详细信息存储在另一个表 用户名 密码 中并通过用户 ID 链接这两个表 这其中有什么道理吗 是不是更安全 或者它只是添加额外的编码 这其中有
  • 将 Typescript 2.3 模块发布到 NPM 以供 Angular 4 使用

    里面有相关说明在 Typescript 中编写 NPM 模块 https stackoverflow com questions 30928253 writing npm modules in typescript 但是它已经过时了 现在有
  • 在 Swift 中创建像这样的普通框窗口吗?

    下面是 App Store 上 Squish 应用程序的屏幕截图 我怎样才能制作一个这样的窗口 带有圆角并且标题栏和内容之间没有分隔符 唯一的区别是我想在标题栏上有一个标题 简而言之 如何制作一个如图所示但带有标题的窗口 在Xcode中创建
  • 在 BS 3 中对齐标签和文本框

    我正在尝试使用 Bootstrap 3 对齐标签和文本框 这不起作用 因为 开始日期 被包装了 我也尝试过 form horizo ntal 但对我没有帮助 div class row div class col xs 3 input gr
  • 为什么我的 Swift 包获取了错误的主体类?

    我做了一个捆绑目标 它的Info plist文件指定一个非常具体的类 我们称之为PrincipalClass 应该是它的主要类 这个类是用 Swift 编写的 并且具有 objc属性 这Info plist文件已正确复制到捆绑包中 并且我已
  • 是否存在使用代数数据类型或多态性的 OOP 抽象类的 Haskell 等效项?

    在Haskell中 是否可以编写一个带有签名的函数 该函数可以接受两种不同 尽管相似 的数据类型 并根据传入的类型进行不同的操作 一个例子可能会让我的问题更清楚 如果我有一个名为myFunction 以及两种名为MyTypeA and My
  • 如何使用 Expect 为 Perl 脚本输入密码?

    我希望在运行安装脚本时自动输入密码 我在 Perl 中使用反引号调用了安装脚本 现在我的问题是如何使用输入密码expect或者是其他东西 my op install sh f my conf p my ip s my server 执行上述
  • 在 android studio 中以编程方式删除按钮单击上的布局

    我在单击按钮时添加布 局 private void addLayout layout2 LayoutInflater from mContext inflate R layout product layout mLinearLayout f
  • Android AsyncTask 在 ActivityGroup 中给出 BadTokenException

    我想在后台下载表的数据 所以我使用 AsyncTask 问题是当按钮单击时 它应该开始下载 我认为按钮单击功能存在一些问题 因为我调用了另一个活动 iniseonNextAction 其他 Activity 的 onCreate 称为 As
  • Font Awesome instagram 图标 - 彩色

    任何人都知道如何显示 Instagram 的 FontAwesome 图标并将其设置为以新的 Instagram 图标多颜色显示 新的 Instagram 图标 https www instagram brand com 我也在尝试做同样的
  • NSKeyedArchiver 返回意外的类?

    我有一个扩展的自定义类NSString 我正在尝试使用序列化它 用于拖 放 NSKeyedArchiver 该类覆盖了 Coder方法 id initWithCoder NSCoder aDecoder if self super init
  • 我无法从市场安装 Eclipse 的 Glance 插件。

    我无法从市场安装 Eclipse 的 Glance 插件 它正在抛出错误 这是由于谷歌代码关闭所致 参考号https github com ystrot glance issues 34 https github com ystrot gl
  • 我可以重复使用 Azure 主机名吗?

    我有一个托管为 somehostname azurewebsites net 的 Azure 应用服务 如果我先删除现有资源 我可以重复使用相同的主机名吗 如果是 在释放该主机名的先前使用之前是否存在延迟 名称仅保留到资源被删除为止 如果您
  • C# DropDownList 样式的 ComboBox,如何设置文本?

    我想使用具有 DropDownList 样式的 ComboBox 使其看起来像一个按钮 因此您无法输入值 将值插入到文本框中 我希望组合框有一个名为 通配符 的文本标签 当我从列表中选择通配符时 所选值将插入到文本框中 并且组合框文本仍为
  • 使用 GNU Readline;如何在同一程序中添加 ncurses?

    标题比我的实际目标更具体一些 我有一个使用 GNU Readline 的命令行程序 主要用于命令历史记录 即使用向上箭头检索以前的命令 和其他一些细节 现在 程序的输出似乎散布在用户的输入中 有时是可以的 但输出是异步的 它通过网络连接响应
  • ListView CellFactory - 如何正确删除单元格?

    我有一个ListView我正在努力添加一个ContextMenu到 我有ContextMenu工作发现但有另一个问题 My setCellFactory代码 用于设置上下文菜单 lvAppetites setCellFactory lv g
  • 托管DLL和非托管DLL有什么区别

    我是新手 我真的很想知道两者之间的详细区别 以及何时使用它们 术语 托管代码 通常指用托管语言 例如 Java 或 C 编写的代码 术语 非托管代码 通常指用非托管语言 例如 C 或 C 编写的代码 如果您来自 NET 世界 托管 可能意味
  • Python客户端/服务器问题

    我正在用 python 做一个项目 我有一个客户端和一个服务器 服务器监听连接 一旦收到连接 它就会等待来自客户端的输入 这个想法是客户端可以连接到服务器并执行 ls 和 cat 等系统命令 这是我的服务器代码 import sys os
  • 如何从 .Net Core Web API 返回 Json?

    这是一个基本问题 我是 ASP Net Core 新手 因此我使用 Visual Studio 2017 中的模板创建了一个 Net Core Web API 项目 我想知道如何从 Get 函数返回 Json 字符串 提供的 Get 函数
  • Socket通信,Java客户端C服务器

    我正在尝试通过套接字与 Java 客户端和 C 服务器进行通信 如果我尝试在命令行上使用 nc 来连接服务器 或者如果我使用 nc 作为服务器并与我的 Java 客户端连接 那么一切似乎都工作正常 但是当我尝试连接 Java 客户端和 C