Tcp - bytes to read
Hi,
I have a TCP connection between 2 computers. Is there any way to read the data without specify the number of bytes to read? Because I don't know the number of bytes before.
Hi,
I you go to "help" > "find examples" you'll find a couple of example VIs called "TCP - Communicator ..." I think you can get inspiration from these.
For instance in the TCP - Communicator - active" you can see that a constant "512" is linked to "bytes to read" and apparently if there is less dat at the specified port, only available data will be read, so you can just count the characters you received.
Hope this will help you
When my feet touch the ground each morning the devil thinks "bloody hell... He's up again!"
Similar Messages
-
TCP/IP DataInputStream reads not all data send in one time?
I have a C program that sends 4104 bytes of data to a java client.
In my java client I have a buffer of 4104 bytes that reads the data using a DataInputStream. Now my problem is that the read function returns with only 1460 bytes instead of 4104 bytes.
I only have this problem on a new type of PC we are using.
Now I was wondering when you have a TCP/IP session doesn't every send results in 1 recv (read)?
Does this differ for various platforms? (is that buffer size adjustable)
Thanks!Alright then I do have a problem.
If your application level doesn't define a blockthen
you have problems.So I have to keep reading on the socket untill I get a
timeout? I saw that DataInputStream has a function
available(), this should return the available number
of bytes that can be read without blocking. This
hardly seems to work?
I just want to read 1 TCP packet without knowing the
size or the protocol of the packet without having to
wait for some timeout. I don't want to reassemble -
defragmentate all my packets. This question seems very
reasonable to me, but perhaps I'm missing something?
There's no guarantee in TCP that a block size N
written in one application will be delivered as a
single block to the receiver.Is there a place I can read that specification?Usually people need to understand an API in order to be able to use it. TCP sockets present a continuous stream paradigm: the data stream starts when the connection is established and ends when the connection is closed. Now reread your own question: you want to read a block of data from such a stream without knowing the size of the block. That just makes no sense. It is like trying to read first X bytes from a file stream without actually knowing what X is. The number of bytes available immediately on a socket read is subject to all kinds of random factors on the network and has nothing to do with the amount of data the server is actually trying to send as a "block". That is, a single write() on the server does not necessarily correspond to a single read() on the client.
A common solution to this problem is to have an implicit block size (that is, it is fixed and known apriory) or prefix your payload with the block size. An example of the latter would be to send the block size as the block header (say, an int in network byte order) so that the receiving end could read the size first and then perform a loop that continuously reads from the socket until it reads exactly the required amount.
In other words, TCP sockets just provide you with a continuous stream paradigm. You need to impose some kind of an application protocol on top of it to build client-server dialogs. This is what's done behind the scenes by CORBA, RMI, HTTP etc.
If you need to read up on Berkely socket API specifically, Richard Stevens has written some excellent books. -
Bytes not read from DataInputStream
I want to read a binary file and translate the data to ascii. In order to do so, I've decided to let one method take care of the opening and reading the data and this is where the problem is; no data is read from the binary file. When the for-loop is executed, the index is printed on the screen and since the number is increasing, it cannot be the for-loop that is malfunctioning. However, the data that should be read, should also be displayed, but that does not happen. Can someone tell me what is wrong with my code?
Thanks
Simon
public void readFromBinary() throws FileNotFoundException,IOException
//open stream
FileInputStream fInputStream = new FileInputStream(inFile);
int lengthInFile = fInputStream.available();
inStream = new DataInputStream(fInputStream);
byte[] values = new byte[lengthInFile];
//read data
for(int i=0;i<lengthInFile;i++)
System.out.println("i = "+i);
values[i] = inStream.readByte();
String str = new String(values);
System.out.println(str);
System.out.println("readFromBinary: Data read, length is "+values.length);
//close stream
fInputStream.close();values[ i ] = inStream.readByte();You've only read one (more) of the bytes, the other
values in the array are still zeros
String str = new String(values);
System.out.println(str);This doesn't make sense creating a string out of the
array which just keeps adding one more byte every time
thru the loop.
Why not just read the thing as one operation?
inStream.read(values);Actually meant:
fInputStream.read(values);
You shouldn't be using DataInputStream on a stream that wasn't created by a DataOutputStream. But then I don't know what this file is you're messing with. -
ASM: determine total bytes written/read & IOPS
Hello
My Environment:
Oracle 11.2.0.3 EE
SuSE Enterprise Linux 11 SP1, 64 Bit
ASM Diskgroups on RAW Luns (2 per group) in Hitachi Disk Storage
DB-Server: HP DL380 G7
I like to switch ASM disks from disk to ssd's, direct attach to via HP DS2700 enclosure:
Diskgroup +DATA
5x400GB Enterprise SSD, RAID 5, 1.6TB raw capacity
used for Redo, Datafiles
Diskgroup +ARCH
4x400GB Enterprise SSD, RAID0+1, 800GBraw capacity
used for Redo, Archives, Flash Recovery Area
As I could understand SSD technology so far, SSDs have a livetime, meaning there is a guaranteed amount of data which can be read/written on it. My aim is to engineer a system that does not have the point of failure of two broken ssd's in the same RAID group.
How can I determine the total bytes written/read to the ASM diskgroups so far?
My idea was to dermine ASM block size (select block_size from v$asm_diskgroup) and then look at total reads and writes columns via iostat command in asmcmd. I assume these values are since last ASM startup.
Is there a way to determine IOPS per diskgroup?
Thanks
scsiDoing the calculation for 1. gives me a strange result:
sys@+ASM> select block_size from v$asm_diskgroup;
BLOCK_SIZE
4096
4096
sys@+ASM> select STARTUP_TIME from v$instance;
STARTUP_T
23-MAR-13
ASMCMD> iostat
Group_Name Dsk_Name Reads Writes
ARCH ARCH_0000 56794017285632 39811971420672
ARCH ARCH_0001 50857383503360 38789309743616
DATA DATA_0000 80190065973760 42021664440320
DATA DATA_0001 80085260539392 42192811246080
Total Reads x Block Size = Total amount of data read
(56794017285632 + 50857383503360) x 4096 Bytes = 4.409401376317112e+17 Bytes = 401032.72 Pebibytes -
Hi
I receive with a DataInputStream with:
Byte b = new Byte((byte)in.read());
If i send bytes < 0x79 or > 0xa0 all works, otherwise I obtain, i.e:
0x80 = -84 (right)
0x81 = -3
0x82 = 26
Why???In sender side seems ok, in dump file the bytes are ok; this is sender side (dataSend is a LinkedList):
for (Iterator iter = dataSend.iterator(); iter.hasNext();) {
Byte b = (Byte)iter.next();
bytePark = b.byteValue();
dataOut.write(bytePark);
// then I dump bytePark on file
receiver side:
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
Byte e = new Byte((byte)in.read());
if (e.byteValue() == (byte)0xf3) { // I need analize when receive 0xf3
// here e.byteValue() has wrong behavior -
Hex 00 in every other byte while reading a unix file
Hi, I am having trouble reading certain files on the unix server. When I read one of them, I am finding that hex 00 have been inserted in between the characters (e.g. if # represents 00 then "byte" appears as "b#y#t#e#")
I do not have this problem with other files in the same directory.
When I login to unix and look at these files, they all look fine.
Can anyone tell me what might be causing this and what I need to do to fix this?
Thanks,
Jim HoffmanOPEN DATASET i_dsn IN LEGACY TEXT MODE FOR INPUT
for this statement add ENCODING DEFAULT
Reward if useful
Naveen -
JDBC to Lotus Notes, only 255 bytes be read for each field. Any clue?
Hi,
I am programming with JDBC to Lotus Notes. I can extract data from .nsf files but for each field, only 255 bytes can be read, all the rest got truncated. I ran the ResultSetMetaData.DisplayColumnSize(), it returns 255.
What is the problem? How can I extract larger strings (such as 700 bytes)? I tried bloc data type, it doesn't help.
In the API docs, there is a RowSetMetaData that has a SetColumnSize() method, but I can not find an implemented package of it, also not sure it will work. Any suggestion will be deeply appreciated!
Thanks!
WilliamYou must declare the filed Rich Text, not Only Text, because the Method GetString only get 255... although your filed have more caracters...
If you declare rich Text you must use tgetAsciiStream Method...
suppose the filed 2 is Rich Text...
byte[] buffer = new byte[4096];
int size;
InputStream strin = rs.getAsciiStream(2);
if(strin == null){
System.out.println("notas es null\n");
else {
for(;;){
try {
size = strin.read(buffer);
if(size <= 0){
break;
System.out.print(new String(buffer,0,size));
} catch (java.io.IOException e){
e.printStackTrace(); -
Why is there only read(byte[]) & not read(int[])
I'm trying to read large raw images using the RandomAccessFile. Different images are of different types, some are uInt8, some are int8, some are int16, uInt16, float, etc. The only way I know to read them fast enough is by reading an array of bytes, and then putting the bits together into a new array of the desired type, e.g. shifting and adding to the bytes.
I'm sure there's a clever way to read different types really fast... How?Well... Is there any possabilities to create a new
int[] array that is "pointing" at the same memory
allocation as the byte[], just as you can do in C or
other languages with pointers?
Nope, Java is type safe.
It would be easy if I could make the compiler
interpret the byte[] as an int[]... Suggestions?
Create a java.io.DataInputStream to read from a java.io.ByteArrayInputStream that reads from your byte[] is one option:ByteArrayInputStream byteStream = ByteArrayInputStream(anArrayOfBytes);
DataInputStream integerStream = new DataInputStream(byteStream);
int firstInt = integerStream.readInt();
...If you need random access to an int array maybe you need to create the array first and the read ints to it... -
If I am doing a serial read for a specific instrument, how do I know how many bytes are coming in.
The instrument is transfering data once every second.
The data is 20 lines total, each line ending with "\r\n".
Is there a way I can read in each line by successively reading a certain number of bytes?
Cory KI'm here with Ravens fan. Use a byte termination character.
After reading the port you will have exactly 1 (one) message. Then look how much more bytes are available at the port. If the number is big enough, do another read.
Make sure you keep fire reading events otherwise your buffer will burst (by default at 4k).
Ton
Free Code Capture Tool! Version 2.1.3 with comments, web-upload, back-save and snippets!
Nederlandse LabVIEW user groep www.lvug.nl
My LabVIEW Ideas
LabVIEW, programming like it should be! -
Byte Code Reader!!!!
What is the way of reading the java class file(byte code).
i want to display the structure of the java class file
thanxDescription of the class file format:
http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html -
Problem rendering certain bytes when reading binary file
I have a two part problem. I am trying to read files of any type from a client and transfer them over a pipe to a UNIX host running a C API. I have this process working for text data just fine however when I try and submit binary data there appears to be some data loss. Most of the file appears to end up on the host but it just isn't as long as the source, nor will it render correctly.
In investigating this problem I tried to simply output a temporary copy of the transferred file on the client as I was reading the file just to see if my "thinking/process" was correct. The copy of the file ends up the same length but some bytes seem to have been misread. Upon doing a windiff on the source and copy it appears that several characters that are rendered as blocks in the original show up as '?' in the destination file.
I believe this is an entirely different problem than why I am losing data on the host side but I want to first figure out why this problem is occuring. The below code is how I am reading and writing the binary file. I realize it has some problems with it, it is more of a POC at this point.
final int BUF_SIZE = 1000; // 1K
char[] cBuffer = new char[BUF_SIZE];
byte[] bBuffer = new byte[BUF_SIZE];
int read = BUF_SIZE;
long length = fLocalFile.length();
FileInputStream fis = new FileInputStream(fLocalFile);
DataInputStream dis = new DataInputStream(fis);
FileOutputStream fos = new FileOutputStream("C:\\temp.file", false);
DataOutputStream dos = new DataOutputStream(fos);
for (int start = 0; start < length && reply.getSuccess(); start += read)
System.out.println("length: " + length + " start: " + start);
read = dis.read(bBuffer, 0, BUF_SIZE);
// Send the file data
String sTemp = sDestName + ":" + new String(bBuffer,0,read);
dos.write(bBuffer,0,read);
reply = axBridge.execute (Commands.CMD_FILE_TRANSFER_SEND, sTemp);
dos.close();
}It seems as if when reading or writing on the data streams some of the characters aren't getting converted correctly. Can anyone help? I've been testing with a PDF if that sheds any light.Yes but you ARE converting to a String first which you then send to the axBridge (sTemp!). Try just sending the bytes. You can easily pre-pend the "<filename>:" by sending those first.
I know that some conversions occur when converting to a String, what they are exactly and what the exact effects are escapes me. Past experience though has taught me to ALWAYS send bytes, with no conversions, what you read is what you send.
You may need to modify the send/receive protocol so that you send the command first with the filename then the bytes are sent after...
As for why the file is not being written correctly to: c:\\temp.file, don't know... try the following code, it tends to be one of the "standard" ways of "streaming" data...
byte buf[] = new byte[bufSize];
int bRead = -1;
while ((bRead = in.read (buf)) != -1)
out.write (buf,
0,
bRead);
} And try just using a FileOutputStream or wrapping in a BufferedOutputStream. -
Bonuses of EJB creating server that uses TCP/IP to read/write to hosts
I have created just Java application(not EJB) that uses Socket classes to communicate(read/write) via TCP/IP with connected clients.
I'm new in EJB technology. I have read about 150 pages of different EJB and AppServer manuals but haven't yet found any bonus of EJB for my task. What bonuses could I get if I will remake application as EJB? Please describe advantages in good explained examples.You can make an empty server only with tpsvrinit that starts your client
listeners and a tpsrvdone that stops them. Be carefull with sharing ipcs
between processes, or your clients may get puzzled!!!
Another choice can be builting a custom WSL/WSH but I haven't done
this yet and I don't know exactly the troubles related with making them.
R.G.
Travis Ward wrote:
How would you interface a tuxedo app with another application that
uses tcp/ip socket messaging? I have a vendor product that offers
a tcp/ip message interface, and would like to know how best to
integrate it into a tuxedo application. I could write a C application
that listens and accepts incoming request from the vendors application,
and then make a tuxedo client call to a service. But this doesn't
allow me to control the listen thread through tuxedo. The C application
would have to be started seperately and would not take advantage
of the tuxedo restart facilities etc of a tuxedo service. -
TCP Read undifined number of bytes
Hello LabVIEW RT users
I'm trying to convert a java application to my LabVIEW RT Smart Camera
In my camera I have a working TCP server which reads and writes some data to/from a robot. My problem is that in LabVIEW i have to specify who many bytes I'm reciving to get it to work. But in my Java application the BufferedReader took care of this. I can't control what the robot is sending but it could be things like these strings
GET X
SET R 1
SET X 443
SET X 11
GET START
Somone who knows how I best handle this problem? I have tried to change the mode of the TCP read to CRLF but without succesIf you have 1MB if random binary data, is highly likely that there will be a CRLF embedded somewhere by chance, so that won't work. None of your vague comments and suggestions make any sense so far. This is most likely a very simple problem that you are way overthinking and trying to overengineer. Billions of bytes of variable lenght data are transmitted every second across the world and nobody else seems to have these problems.
Please be more specific about your application:
Where is the data coming from?
Is it also LabVIEW and do you have control over the sending program?
How easy is it to tell if it is binary or formatted?
Can you tell from the data pattern once an entire set is received?
how long are the pauses between datasets?
What happens to the data after it is received? (stream to disk, scan, parse, etc.)
LabVIEW Champion . Do more with less code and in less time . -
TCP/IP Read - How do I find the number of bytes available
It appears that this is not directly possible. I am trying to get around
this by doing a tcp/ip buffered read with a very short timeout (0 or 1ms).
In theory it seems like I should be able to keep making the read call until
the exact number of bytes (4 in this case) pops out. It mostly works but
every so often hangs for some period of time and then resumes getting the 4
byte packets. Anybody have any idea what is going on?The first thing I'm thinking of is that your delay is too short. Also, try to increase the packet length or use Immediate Mode (even CRLF MODE if you're transmitting text).
Another idea (if your application really needs that and you have LV / Windows) is to use MS Winsock Control (wait for DataArrival event and read BytesReceived).
Anyway, tune in your communication (packets and delays) taking in account details about your network or modem.
Good luck! -
How to get the number of bytes at TCP port
Hi all,
How to get the number of bytes to read at the TCp port...as someone had suggested in some forum we do read the number of bytes first and then pass this...
but we get a problem when we have FF data in this...because then it sends 2 FF data...and cause of this we skip the last data...is there any solution for the same?Hi
In LabVIEW you don't have the same property as in serail port.
You havn't "Byte at TCPIP port".
if you developp a protocol, one soltion, is to send the size to read.
Ingénieur d'Application / Développeur LabVIEW Certifié (CLD)
Application Engineer / LabVIEW Certified Developer (CLD)
Maybe you are looking for
-
How do I get all my ID3 ratings into iTunes?
Hi Have recently moved to Mac from Windows. I have over the years rated thousands of my songs on Windows on various software like Windows Media Player and Media Monkey. Now I have moved to Mac iTunes does not show any of the ID3 tag stored ratings. H
-
IMac doesn't recognize HP 4635 Scanner
The Scan program that comes with the 4635 doesn't recognize the scanner. I can scan using Photoshop or Image Capture. The printer works fine.
-
Hi All, There is specific requirement wherein we are required to do a two step-login to a VAN and get the Inbound EDI files - The transport type is FTP. first login - we get into the system second login - we get into our inbox. Both the logins are di
-
I need to establish admin user on my imac it was changed to standard
how do i establish a admin acct on imac if none exists
-
This.thediv has no properties
Hi, I get this error message on some of my pages, don't know y only some but anyway - Error - Object required Line 21 Char 2 I know it refers to this line - this.thediv.style.visibility = startstate; but dont know how to fix it, my homepage looks sam