TwistedPython服务器和Java聊天
我在raywenderlich.com上找到了这篇精彩的教程: 它创建了一个Twisted Python服务器,并与应用程序iphone聊天,我会让服务器也与Java聊天,现在我编写一些代码,这是Python服务器:TwistedPython服务器和Java聊天,java,python,client-server,twisted,Java,Python,Client Server,Twisted,我在raywenderlich.com上找到了这篇精彩的教程: 它创建了一个Twisted Python服务器,并与应用程序iphone聊天,我会让服务器也与Java聊天,现在我编写一些代码,这是Python服务器: from twisted.internet.protocol import Protocol, Factory from twisted.internet import reactor class IphoneChat(Protocol): def connectionMad
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();
}
}
怎么办?我建议不要使用ObjectInputStream和ObjectOutputStream。无论如何,要让它们与Python服务器进行良好的交互可能是一个挑战,而且它们并没有实现一个非常好的协议。我建议使用更简单的协议,并提供更好的跨语言支持,例如
在任何情况下,
newobjectinputstream
似乎都会被阻塞,直到它可以从连接中读取字节为止。如果您想让它成功,您基于Twisted的服务器将需要将Java对象流的开头写入连接。您如何知道客户机阻塞的那一行?我在那一行的前面和后面放了一些System.out.println,并且只打印第一行……异常情况如何?您确定会报告异常吗?从这听上去,getInputStream不会因为任何原因而被阻塞,所以你观察到它被阻塞是很奇怪的。问题是,我没有异常,停留在那里,不去看,我发现了类似的问题:这似乎是我的问题,在评论回答中,发现问题的用户谈话,但是他有一个java服务器…啊。该问题涉及ObjectInputStream构造函数从输入流读取。但您的服务器在安装时不会向连接写入任何内容。因此,客户端无需读取任何内容,因此读取将永远阻塞。
sInput = new ObjectInputStream(socket.getInputStream());