Avatar billede gulbaek Nybegynder
12. januar 2003 - 23:15 Der er 10 kommentarer og
2 løsninger

Socket imellem C++ og Java, modtager besked med ekstra tegn.

Jeg har lavet en C++ Socket server som sender en Tekst streng afsted som en char[]

jeg har så følgende kode i min Java Klient

try
{
    in = new BufferedReader(new InputStreamReader 
                        (socket.getInputStream()));
       
    while (true)
    {
    String modtagetBesked = in.readLine();
    System.out.println(modtagetBesked);
    }
}
catch(Exception e)
{
    System.out.println(e);
}

Den modtager godt nok den besked jeg har sendt afsted, i mit tilfælde "Davs med dig, Jeg hedder Server"

men på en eller anden mærkelig måde bliver der tilføjet en masse ekstra tegn lige bagefter beskeden.

Det står bl.a. javax/print/attribute/standard/NumberUp.class

der er altid en henvisning til en tilføldig java klasse, og det er ikke nogen jeg benytter i programmet.

Håber nogen kan forklare mig hvorfor de ekstra ting kommer med i min besked, og hvordan jeg kan komme af med dem igen.
Avatar billede disky Nybegynder
12. januar 2003 - 23:26 #1
Det er en meget grim måde du finder ud af om der ikke er flere tegn, man bruger IKKE exceptions til den slags, en exception er netop KUN til exceptions :)

Prøv at fjern din System.out.println(e); fra din catch() og se om det extra så ikke forsvinder.

En anden ting catch altid KUN de exceptions der reelt kan komme, at catche alle exceptions som du gør er ikke pænt design.

Men kort fortal, lav en bedre metode til at finde ud af om der kommer flere data.
Avatar billede gulbaek Nybegynder
12. januar 2003 - 23:39 #2
prøvede lige at fjerne den System.out.println(e);

det hjalp ikke.

Nogle gange kommer der også en masse underlige tegn f.eks. smilies sammen med følgende.

java/beans/Namegenerator.class

Når den skriver den besked så giver min computer også en bip lyd.

har lige uploadet et screenshot af det

http://www.gulbaek.net/socket.jpg
Avatar billede bearhugx Nybegynder
12. januar 2003 - 23:52 #3
Hmm... Sender du også NameGenerator-objectet med ??? (det kunne være dine "underlige" bogstaver...)
Avatar billede bearhugx Nybegynder
12. januar 2003 - 23:54 #4
evt. send mere kode...
Avatar billede gulbaek Nybegynder
12. januar 2003 - 23:55 #5
næ, gør jeg ik, aner ikke hvor det NameGenerator kommer fra.
Avatar billede gulbaek Nybegynder
12. januar 2003 - 23:55 #6
min Java Kode

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

public class Klient
{
    private BufferedReader in;
    private Socket socket;
    private int port = 4711;
    private String ip = "localhost";
   
    public Klient()
    {
        try
        {
        socket = new Socket(ip,port);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
   
    public void ForbindTilServer()
    {
        try
        {
       
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
       
        while (true)
        {
        String modtagetBesked = in.readLine();
        System.out.println(modtagetBesked);
        }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
   
}
Avatar billede gulbaek Nybegynder
12. januar 2003 - 23:57 #7
min C++ kode 

Det er den sidste For lykke som sender data'en

#include <string>
#include <sstream>
#include <stdio.h>
#include <winsock.h>
#include <windows.h>
#include "Socket.h"

       
#define PORT 4711

Socket::Socket()
{
}

Socket::~Socket()
{
}

DWORD WINAPI startThread(SOCKET &remoteSocket);

void Socket::SendBesked(string besked)
{
}

void Socket::StartServer()
{
   
    WORD wVersionRequested = MAKEWORD(1,1);
    WSADATA wsaData;
    int nRet;

    nRet = WSAStartup(wVersionRequested, &wsaData);
    if (wsaData.wVersion != wVersionRequested)
    {   
        cout << "Wrong winsock version!";
        exit(1);
    }

    StreamServer();

    WSACleanup();
}

void Socket::StreamServer()
{
   
    SOCKET listenSocket;

    listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (listenSocket == INVALID_SOCKET)
    {
        cout << "socket filedescriptor error @ listenSocket!" << endl;
        exit(1);
    }

    SOCKADDR_IN saServer;       

    saServer.sin_family = AF_INET;
    saServer.sin_addr.s_addr = INADDR_ANY;
    saServer.sin_port = htons(PORT);

    int nRet;

    nRet = bind(listenSocket, (LPSOCKADDR)&saServer, sizeof(struct sockaddr));
    if (nRet == SOCKET_ERROR)
    {
        cout << "Bind error!" << endl;
        closesocket(listenSocket);
        return;
    }

    cout << "Server venter paa: " << "localhost:" << PORT << endl;

    nRet = listen(listenSocket,    SOMAXCONN);
    if (nRet == SOCKET_ERROR)
    {
        cout << "Listen error!" << endl;
        closesocket(listenSocket);
        return;
    }

    SOCKET remoteSocket;
    HANDLE hServerThread;

    while( true )
    {
        cout << "Venter på ny Klient..." << endl;
        remoteSocket = accept(listenSocket,    NULL, NULL);
        if (remoteSocket == INVALID_SOCKET)   
        {
          cout << "Der opstod en Fejl!" << endl;
          closesocket(listenSocket);
          return;
        }
        cout << "Klient Ankommet!" << endl;
        hServerThread = CreateThread(NULL, 0 , (LPTHREAD_START_ROUTINE)startThread, (LPVOID)&remoteSocket, 0, 0);
    }
}

DWORD WINAPI startThread(SOCKET &remoteSocket)
{
 
  int nRet;
 
 
  char data[256];
 
 
/*  nRet = recv(remoteSocket, data, sizeof(data), 0);   
  if (nRet == INVALID_SOCKET)   
  {
      cout << "Receive error!" << endl;
      closesocket(remoteSocket);
  }

*/  std::cout<<"Sender til Klient:"<<std::endl;
     
  for(;;)
  {       
        char output[256];
        string besked;
        besked = "Davs med dig, Jeg hedder Server";
        std::cout<<"Sender til Klient:"<<besked<<std::endl;   
       
        for(int i=0;i<besked.length();i++)
        {
          output[i] = besked[i];
        }
        strcpy(data,output);
        nRet = send(remoteSocket, data, sizeof(data), 0);
        //nRet = send(remoteSocket,data,besked.size(),0);
       
        Sleep(3000);
    }
}
Avatar billede gulbaek Nybegynder
13. januar 2003 - 00:04 #8
Har lige uploadet nogle flere screenshot, har ikke lavet nogen ændringer i koden, kørte bare programmet igen.

Et eller andet med Corba
http://www.gulbaek.net/socket2.jpg

Et eller andet med RMI
http://www.gulbaek.net/socket3.jpg
Avatar billede larssz Nybegynder
13. januar 2003 - 00:08 #9
Du sender 256 tegn til klienten - meget mere end din tekststreng. Det vil være tilfældigt hvad det øvrige data er. I din server prøv:

nRet = send(remoteSocket,data,strlen(data),0);
Avatar billede gulbaek Nybegynder
13. januar 2003 - 00:12 #10
Har lige prøvet din kode Larssz men når jeg gør det modtager min Java klient intet, C++ serveren reagere dog fint på at en klient logger på, den begynder også at sende data afsted, men Klienten modtager det bare aldrig.
Avatar billede larssz Nybegynder
13. januar 2003 - 00:14 #11
Du skal have et "newline" tegn tilsidst (vil jeg tro) "bla bla bla\n" - du læser jo netop en linje i din java-klient.
Avatar billede gulbaek Nybegynder
13. januar 2003 - 00:17 #12
Takker Larssz det var det der skulle til, de efterfølgende beskeder jeg modtager starter godt nok med # men det kan jeg godt leve med.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester