3

これはアーランの問題だと思われます。Actionscript 3で記述された、データを送信するクライアントをテストするためのこのコードがあります。

var socket:Socket=new Socket("localhost", 2345);
socket.addEventListener(Event.CONNECT, connected);

private function connected(event:Event):void {
    socket.writeInt(12); //packet length, should be correct? 4 bytes each?
    socket.writeInt(3);
    socket.writeInt(6);
    socket.writeInt(9);
    socket.flush();
}

それから私はErlangで書かれたこの小さなサーバーを持っています:

start_nano_server() ->
    {ok, Listen} = gen_tcp:listen(2345, [binary, {packet, 0},
                     {reuseaddr, true},
                     {active, true},
                    {packet_size, 128}]),
    {ok, Socket} = gen_tcp:accept(Listen),
    gen_tcp:close(Listen), 
    receive_data(Socket, []).

receive_data(Socket, SoFar) ->
    receive
    {tcp,Socket,Bin} ->   
        receive_data(Socket, [Bin|SoFar]);
    {tcp_closed,Socket} ->
        Bytes=list_to_binary(reverse(SoFar)),
        io:format("~p~n",[Bytes])
    end.

今、私がクライアントから何を送っても、私は常に[<<0,0,0,4,0,0,0,32>>]応答として受け取ります。intsの代わりに直接ソケットにバイトを書き込んでみることができますが、同じことがわかります。私は多かれ少なかれデータを書くことができます、同じ結果。UTF文字列は同じ結果になります。パケットヘッダーの長さとして「4」を指定した場合でも、代わりに同じ一貫した結果が得られ[<<0,0,0,32>>]ます。ここで何が間違っているのかわかりません。

4

4 に答える 4

4

これは、Flashソケットに接続する動作中のErlangサーバーからの抜粋です...

これは、Klackeのchargenサーバーの例に基づいています:http: //erlang.org/examples/klacke_examples/chargen.erl

-module(remoting_soc).

-export([accept/1]).

accept(Listen) ->

    {ok, Soc} = gen_tcp:accept(Listen),
    Pid = spawn(fun() -> loop(Soc) end),
    gen_tcp:controlling_process(Soc,Pid),
    %% Start Listening for another connection
    remoting_soc:accept(Listen).

loop(Socket)->

    receive

        {tcp, Socket,"register"++Rest} ->
            ...do stuff...
            loop(Socket);

    end.
于 2009-01-05T16:00:00.987 に答える
3

Listenデータを受信する前に閉じないようにしてください。

于 2009-01-05T14:11:44.450 に答える
1

Flash の問題である可能性が高いと考えてください。あなたの Erlang サーバー コードは、Java ソケット クライアントと完全に連携します。

于 2009-01-05T15:02:13.507 に答える
0

誰かが答えを知りたがっている場合に備えて、私は自分の質問に答えようとしています。

パケットスニファを使用して、Flashが実際に間違ったパケットを送信していることを確認できました。パケットデータが実際に何であったかはわかりませんが、何が問題だったのかはわかります。同じマシンでFlashソケットとErlangソケットを開いたからだと思いますが、通常は問題ありませんが、Flashにはリスニングソケットと送信ソケットの違いがないので、どういうわけかErlangプログラムの開いているソケットと衝突しました。

フラッシュソケットでSocket(host、port)を指定すると、そのソケットでデータを送信できるだけでなく、受信もできるので、それが問題の原因のようです。

ラップトップとPCのサーバーでFlashプログラムを実行してテストしましたが、正常に動作しました。

于 2009-01-05T20:50:32.523 に答える