我创建了Flutter应用。我需要将我的应用程序连接到本地网络套接字服务。如下所示,我可以使用telnet Connect,发送数据和从服务器接收数据。我使用Flutter web_socket插件和示例。我可以连接到服务器并发送数据,但是我无法捕获(或获取数据,它什么也没显示。)数据。在Flutter的Google网上论坛中,有人建议我使用流而不是StreamBuilder。
To send data I use; Q101:_:49785:_:ABCDE And receive data I get; 1:_:2:_:119351:_:NİYAZİ TOROS
当我使用此示例(https://flutter.io/cookbook/networking/web- sockets/)时,我的套接字服务出现错误:
Q: 28.06.2018 08:53:57->GET / HTTP/1.1 A: 28.06.2018 08:53:57 ->:1:_:1:_:FAIL1
例:
Last login: Tue Jun 26 15:01:44 on ttys000 Niyazis-MBP:~ niyazitoros$ telnet telnet> telnet 192.168.1.22 1024 Trying 192.168.1.22... Connected to 192.168.1.22. Escape character is '^]'. Q101:_:49785:_:************* 1:_:2:_:119351:_:NİYAZİ TOROS
基于@Richard Heap的建议:
import 'dart:async'; import 'dart:convert'; import 'dart:io'; void connect(InternetAddress clientAddress, int port) { Future.wait([RawDatagramSocket.bind(InternetAddress.anyIPv4, 0)]).then( (values) { RawDatagramSocket _socket = values[0]; _socket.listen((RawSocketEvent e) { print(e); switch (e) { case RawSocketEvent.read: Datagram dg = _socket.receive(); if (dg != null) { dg.data.forEach((x) => print(x)); } _socket.writeEventsEnabled = true; break; case RawSocketEvent.write: _socket.send( new Utf8Codec().encode('Hello from client'), clientAddress, port); break; case RawSocketEvent.closed: print('Client disconnected.'); } }); }); } main(List<String> arguments) { print("Connecting to server.."); var address = new InternetAddress('192.168.1.22'); int port = 1024; connect(address, port); }
我得到这个:
/Users/niyazitoros/flutter/bin/cache/dart-sdk/bin/dart --enable-asserts --enable-vm-service:59683 /Users/niyazitoros/IdeaProjects/github/untitled/bin/main.dart Observatory listening on http://127.0.0.1:59683/ Connecting to the server. RawSocketEvent.write
正如attdona所说,
您的服务器不会使用websocket协议,但是会公开一个纯TCP套接字。
所以你需要一个TCP套接字,并有一个伟大的教程Sockets和ServerSockets,你可以找到这里。
Sockets
ServerSockets
这是一个片段:
import 'dart:io'; import 'dart:async'; Socket socket; void main() { Socket.connect("localhost", 4567).then((Socket sock) { socket = sock; socket.listen(dataHandler, onError: errorHandler, onDone: doneHandler, cancelOnError: false); }).catchError((AsyncError e) { print("Unable to connect: $e"); }); //Connect standard in to the socket stdin.listen((data) => socket.write(new String.fromCharCodes(data).trim() + '\n')); } void dataHandler(data){ print(new String.fromCharCodes(data).trim()); } void errorHandler(error, StackTrace trace){ print(error); } void doneHandler(){ socket.destroy(); }