Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Swift bluesocket Can't get long data ? #204

Open
ShineYangGod opened this issue Aug 2, 2021 · 18 comments
Open

Swift bluesocket Can't get long data ? #204

ShineYangGod opened this issue Aug 2, 2021 · 18 comments

Comments

@ShineYangGod
Copy link

When I use tcp to connect successfully, I need to get a long data, but nothing is returned

@mbarnach
Copy link
Member

mbarnach commented Aug 3, 2021

Could you provide a minimum example to reproduce it? Thanks.

@ShineYangGod
Copy link
Author

I used the testReadWrite method in dome, normal data can be received, but long data cannot be received

@ShineYangGod
Copy link
Author

我的代码.zip
这是我的代码

@ShineYangGod
Copy link
Author

Hello, what's the matter with my question? Can it be solved?

@mbarnach
Copy link
Member

@ShineYangGod I'm not sure what you mean by "long data".
I've replaced the line in SocketTests.testReadWriteby:

// let hello = "Hello from client..."
let hello = String(repeating: "Hello from client...", count: 1000)

and everything works fine.
If your use case is different, please provide a minimum example that we can look at.

@ShineYangGod
Copy link
Author

Wait a minute, I will give you a long data example

@ShineYangGod
Copy link
Author

MintBlueTCPSocketMangent.swift.zip

This is what I use now, and finally there is an example of the data returned by our gateway

@mbarnach
Copy link
Member

If I'm using the data (end of your doc) directly in the sample, it works fine. I think the issue should be somewhere else, either in the setup or in the delay induced by your gateway maybe?

@ShineYangGod
Copy link
Author

If i directly use SocketTests.testReadWrite Is it possible to connect to TCP and send data and receive data?

@ShineYangGod
Copy link
Author

截屏2021-08-10 16 31 53

The first line is the data I sent to the gateway, and the last line is the received data. Normally, there is a string of data similar to the example I sent to you.

@ShineYangGod
Copy link
Author

I tested it several times, and it seems that the client stopped receiving after receiving a few pieces of data. How do I set the client to continue to receive data?

@ShineYangGod
Copy link
Author

After testing, our gateway is no problem. I tried other third-party sockets, and there is no problem. Now, when we use our socket to receive messages, we can’t achieve continuous reception.
Our gateway will generally return two messages in a row, and will actively push the message. When I send a message, the gateway is pushing at the same time, and the message will not be received at this time.

@dannys42
Copy link
Contributor

@ShineYangGod This sounds similar to this issue. TCP sockets can operate in a blocking or non-blocking fashion. When using non-blocking (which I think is the default), you are not guaranteed to get any specific number of bytes upon read. So when you run things locally you might see that you get all your data instantaneously, but when you go through any router, your data may be "chunked" in an arbitrary way. You can read more details in this Stack Overflow discussion as well.

@ShineYangGod
Copy link
Author

Can you give a specific example?

@ShineYangGod
Copy link
Author

Why is the tcp connection so slow? And the message sent to the server is very slow. I have no problem with other sockets, and I looked at the log and did not receive the message sent.

@dannys42
Copy link
Contributor

Hi @ShineYangGod can you provide a working example? I'm looking at the MintBlueTCPSocketMangent.swift.zip you gave and it looks like your server in mintServerHelper() is accepting new connections but not reading or writing any data. Meanwhile your client in mintTestReadWrite() is attempting to read data as soon as it's connected... I'm not sure if the socket is a blocking or non-blocking socket...

If the client socket is blocking, then the first mintReadAndPrint() on line 125 will just block until timeout before you write.

If the client socket is non-blocking, then socket.write() on line 127 may potentially be incomplete.

So either way I think there are issues with your socket handling.

1 similar comment
@dannys42
Copy link
Contributor

Hi @ShineYangGod can you provide a working example? I'm looking at the MintBlueTCPSocketMangent.swift.zip you gave and it looks like your server in mintServerHelper() is accepting new connections but not reading or writing any data. Meanwhile your client in mintTestReadWrite() is attempting to read data as soon as it's connected... I'm not sure if the socket is a blocking or non-blocking socket...

If the client socket is blocking, then the first mintReadAndPrint() on line 125 will just block until timeout before you write.

If the client socket is non-blocking, then socket.write() on line 127 may potentially be incomplete.

So either way I think there are issues with your socket handling.

@ShineYangGod
Copy link
Author

MintBlueTCPSocketMangent.swift.zip
I'm not sure what this method is for? acceptClientConnection, whenever you get to this step, it will jump out, attach my code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants