簡體   English   中英

將輸入從C套接字客戶端讀取到Java套接字服務器

[英]Reading input from C socket client to Java socket server

我有2個套接字客戶端和2個套接字服務器,每個都使用C和Java,並且都作為進程在本地計算機上運行。

除了C套接字和Java服務器之外,他們都可以彼此成功對話。 它們成功連接,但是當我在C客戶端中輸入輸入時,回車鍵不會完成消息並將其發送到Java服務器的方式與與C服務器通信時的方式相同。

任何見識將不勝感激。

Java服務器:

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

public class SimpleServer extends Thread
{
   private ServerSocket serverSocket;
   String clientmsg = "";

   public SimpleServer(int port) throws IOException
   {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

    public void run()
    {
        while(true)
        {
            try
            {
                System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "...");
                Socket server = serverSocket.accept();
                System.out.println("Just connected to " + server.getRemoteSocketAddress());
                DataInputStream in = new DataInputStream(server.getInputStream());
                System.out.println(in.readUTF());
                DataOutputStream out = new DataOutputStream(server.getOutputStream());
                out.writeUTF("Thank you for connecting to "
                + server.getLocalSocketAddress() + "\nGoodbye!");
                server.close();
            }

            catch(SocketTimeoutException s)
            {
                System.out.println("Socket timed out!");
                break;
            }

            catch(IOException e)
            {
                e.printStackTrace();
                break;
            }
        }
    }
    public static void main(String [] args)
    {
        int port = Integer.parseInt(args[0]);
        try
        {
            Thread t = new SimpleServer(port);
            t.start();
        }

        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

C客戶:

#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <netdb.h>

void error(char *msg) 
{
    perror(msg);
    exit(0);
}

int main(int argc, char *argv[])
{
    int sockfd, portno;
    struct sockaddr_in serv_addr;
    struct hostent *server;
    int n;
    char buffer[256];

    if (argc < 3)
    {
        error("ERROR, no port provided");
    }

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0)
    {
        error("ERROR opening socket");
    }

    server = gethostbyname(argv[1]);

    if (server == NULL)
    {
        error("ERROR, host not found\n");
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = atoi(argv[2]);
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(portno);

    bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);

    if (connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        error("ERROR connecting to server");
    }

    printf("Enter a message for the server: ");

    bzero(buffer,256);
    fgets(buffer,sizeof(buffer),stdin);
    n = write(sockfd,buffer,strlen(buffer));

    if (n < 0)
    {/
        error("ERROR writing to socket");
    }

    bzero(buffer,256);
    n = read(sockfd,buffer,255);

    if (n < 0)
    {
        error("ERROR reading from socket");
    }

    printf("%s\n", buffer);
    return 0;
}

我建議如下使用BufferedReaderPrintWriter

BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); // Bufferreader from socket
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // printwriter from socket

您可以簡單地將它們用作,

in.readLine(); // read a line

out.println(); // write a line 

所以更新后的代碼看起來像

Socket server = serverSocket.accept();

System.out.println("Just connected to " + server.getRemoteSocketAddress());

BufferedReader in = new  BufferedReader( new InputStreamReader(socket.getInputStream()));

System.out.println(in.readline());

PrintWriter out = new PrintWriter(server.getOutputStream());

out.println("Thank you for connecting to ");

另外,如果我是對的,那么這種方法將滿足Java和C的行終端條件。

readUTF()文檔中:

首先,讀取兩個字節,並以與readUnsignedShort方法完全相同的方式來構造一個無符號的16位整數。 此整數值稱為UTF長度,它指定要讀取的其他字節數。

在C客戶端中,您沒有發送這兩個字節。 當然,對於writeUTF()也是這樣。

要由readUTF()讀取的數據必須由writeUTF(),發送writeUTF(),或者可以產生相同協議的東西發送:l:請參見Javadoc。 由於您的發送方是C,所以這不切實際,因此您應該使用其他讀取API,例如readLine(),並在發送方進行適當的調整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM