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.
Annonceindlæg fra Conscia
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.
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
12. januar 2003 - 23:52
#3
Hmm... Sender du også NameGenerator-objectet med ??? (det kunne være dine "underlige" bogstaver...)
12. januar 2003 - 23:54
#4
evt. send mere kode...
12. januar 2003 - 23:55
#5
næ, gør jeg ik, aner ikke hvor det NameGenerator kommer fra.
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); } } }
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); } }
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);
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.
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.
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.
Kurser inden for grundlæggende programmering