开发者

Sending an int from Java to C using sockets

I was just wondering how to send an int from a Java application to a C application using sockets. I have got different C programs communicating with each other and have got the Java application retrieving data from the C application, but I can't work out sending.

The C application is acting as database, the Java application then sends a user id (a 4 digit number) to the C application, if it exists it returns that record's details.

In Java I have tried using a printWriter and DataOutputStream to send the data, printWriter produces weird symbols and DataOutputStream produces "prof_agent.so".

Any help would be appreciated as I don't hav开发者_开发技巧e a good grasp of sockets at the moment.


You can use DataOutputStream.writeInt. It writes an int already in network byte order by contract.

On a C side you can call recv, or read to fill in the 4-byte buffer, and then you can use ntohl ( Network-TO-Host-Long ) to convert the value you've just read to your platform int representation.


You can send the textual representation. So the number 123 would be sent as 3 bytes '1' '2' '3'.


It's a bit too late but let this answer be here. Using UDP sockets:

Java code:

public void runJavaSocket() {
            System.out.println("Java Sockets Program has started."); int i=0;    
    try {
            DatagramSocket socket = new DatagramSocket();
            System.out.println("Sending the udp socket...");
            // Send the Message "HI"
            socket.send(toDatagram("HI",InetAddress.getByName("127.0.0.1"),3800));
            while (true)
            {
              System.out.println("Sending hi " + i);
              Thread.currentThread();
              Thread.sleep(1000);
              socket.send(toDatagram("HI " +             String.valueOf(i),InetAddress.getByName("127.0.0.1"),3800));
                    i++;
            }
        } 
    catch (Exception e) 
    {
         e.printStackTrace();
    }
}

public DatagramPacket toDatagram(
          String s, InetAddress destIA, int destPort) {
    // Deprecated in Java 1.1, but it works:
    byte[] buf = new byte[s.length() + 1];
    s.getBytes(0, s.length(), buf, 0);
    // The correct Java 1.1 approach, but it's
    // Broken (it truncates the String):
    // byte[] buf = s.getBytes();
    return new DatagramPacket(buf, buf.length, 
    destIA, destPort);
    }

C# code:

        string returnData;
        byte[] receiveBytes;
        //ConsoleKeyInfo cki = new ConsoleKeyInfo();

        using (UdpClient udpClient = new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3800)))
        {
            IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3800);
            while (true)
            {
                receiveBytes = udpClient.Receive(ref remoteIpEndPoint);
                returnData = Encoding.ASCII.GetString(receiveBytes);
                Console.WriteLine(returnData);
            }
        }


Try this:

Socket s = ...;
DataOutputStream out = null;
try {
    out = new DataOutputStream( s.getOutputStream() );
    out.writeInt( 123456 );
} catch ( IOException e ) {
    // TODO Handle exception
} finally {
    if ( out != null ) {
        try {
            out.close();
        } catch ( IOException e ) {
            // TODO Handle exception
        }
    }
}

It whould help if you could explain a little more what your problem is.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜