0

私はraywenderlich.comでこの素晴らしいチュートリアルを見つけました:

http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server

Twisted Pythonサーバーを作成し、アプリのiphoneチャットと通信します。サーバーに、Javaチャットとも通信させます。次に、コードを記述します。これはpythonサーバーです。

from twisted.internet.protocol import Protocol, Factory
from twisted.internet import reactor


class IphoneChat(Protocol):
def connectionMade(self):
    #self.transport.write("""connected""")
    self.factory.clients.append(self)
    print "clients are ", self.factory.clients

def connectionLost(self, reason):
    self.factory.clients.remove(self)

def dataReceived(self, data):
    #print "data is ", data
    a = data.split(':')
    if len(a) > 1:
        command = a[0]
        content = a[1]

        msg = ""
        if command == "iam":
            self.name = content
            msg = self.name + " has joined"

        elif command == "msg":
            msg = self.name + ": " + content

        print msg

        for c in self.factory.clients:
            c.message(msg)

def message(self, message):
    self.transport.write(message + '\n')


factory = Factory()
factory.protocol = IphoneChat
factory.clients = []

reactor.listenTCP(1025, factory)
print "Chat server started"
reactor.run()

次に、サーバーに接続するための簡単なJavaの例を作成します。

import java.net.*;
import java.io.*;
import java.util.*;

public class MyClassSocket  {

private ObjectInputStream sInput;       // to read from the socket
private ObjectOutputStream sOutput;     // to write on the socket
private Socket socket;

private String server, username;
private int port;

MyClassSocket(String server, int port, String username) {
    this.server = server;
    this.port = port;
    this.username = username;
}

private void display(String msg) {

    System.out.println(msg);      // println in console mode

}

public boolean start() {

    try {
        socket = new Socket(server, port);
    }
    // if it failed not much I can so
    catch(Exception ec) {
        display("Error connectiong to server:" + ec);
        return false;
    }

    String msg = "Connection accepted " + socket.getInetAddress() + ":" + socket.getPort();
    display(msg);

    try
    {

        sInput  = new ObjectInputStream(socket.getInputStream()); //<-------- block here
        sOutput = new ObjectOutputStream(socket.getOutputStream());
    }
    catch (IOException eIO) {
        display("Exception creating new Input/output Streams: " + eIO);
        return false;
    }

    return true;

}

public static void main(String[] args) {

    MyClassSocket client = new MyClassSocket("localhost",1025,"PieroJava");
    client.start();
}

}

上記のコードでコメントした時点でコードがフリーズし、サーバーターミナルで新しい接続があることを確認できます。また、クライアントターミナルで接続していることを確認できますが、ここには行きません。

sInput  = new ObjectInputStream(socket.getInputStream());

どうすればいいですか?

4

1 に答える 1

2

ObjectInputStream と ObjectOutputStream を使用しないことをお勧めします。いずれにせよ、これらを Python サーバーとうまくやり取りさせるのはおそらく難しいでしょう。AMPなど、より優れた言語間サポートを備えた、より単純なプロトコルをお勧めします。

いずれにせよ、new ObjectInputStream接続からバイトを読み取ることができるまでブロックすることが予想されるようです。成功させたい場合は、Twisted ベースのサーバーが Java オブジェクト ストリームの先頭を接続に書き込む必要があります。

于 2012-11-07T14:30:46.207 に答える