【发布时间】:2017-08-24 00:28:39
【问题描述】:
我正在尝试使用 python(我的电脑)中的套接字创建一个简单的聊天服务器程序,以与我的 Android 客户端代码(我的 Android 手机)进行通信。
我有一个简单的服务器代码,可以接收消息,但是当我尝试从服务器向客户端发送消息时,它会阻止客户端应用程序并崩溃。
客户端代码基于本教程:Simple Android Chat Application, client side.
客户端代码:
private class ChatClientThread extends Thread {
String name;
String dstAddress;
int dstPort;
String msgToSend = "";
boolean goOut = false;
ChatClientThread(String name, String address, int port) {
this.name = name;
dstAddress = address;
dstPort = port;
}
@Override
public void run() {
Socket socket = null;
DataOutputStream dataOutputStream = null;
DataInputStream dataInputStream = null;
try {
socket = new Socket(dstAddress, dstPort);
dataOutputStream = new DataOutputStream(
socket.getOutputStream());
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream.writeUTF(name);
dataOutputStream.flush();
while (!goOut) {
if (dataInputStream.available() > 0) {
msgLog += dataInputStream.readUTF();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
chatMsg.setText(msgLog);
}
});
}
if(!msgToSend.equals("")){
dataOutputStream.writeUTF(msgToSend);
dataOutputStream.flush();
msgToSend = "";
}
}
} catch (UnknownHostException e) {
e.printStackTrace();
final String eString = e.toString();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, eString, Toast.LENGTH_LONG).show();
}
});
} catch (IOException e) {
e.printStackTrace();
final String eString = e.toString();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, eString, Toast.LENGTH_LONG).show();
}
});
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataOutputStream != null) {
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (dataInputStream != null) {
try {
dataInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
loginPanel.setVisibility(View.VISIBLE);
chatPanel.setVisibility(View.GONE);
}
});
}
}
private void sendMsg(String msg){
msgToSend = msg;
}
private void disconnect(){
goOut = true;
}
}
服务器代码:
import socket
s = socket.socket()
host = "192.168.1.82"
port = 8080
s.bind((host, port))
print host
s.listen(5)
c = None
while True:
if c is None:
# Halts
print '[Waiting for connection...]'
c, addr = s.accept()
print 'Got connection from', addr
else:
# Halts
print '[Waiting for response...]'
print c.recv(1024)
当添加以下两行发送消息时,它不起作用。
# Halts
print '[Waiting for response...]'
print c.recv(1024)
q = raw_input() c.send(q)
关于如何解决它的任何想法?
【问题讨论】:
-
“它崩溃了……”。如何?崩溃的堆栈跟踪是什么?它在哪条线崩溃?你有没有努力确保你从一侧写的东西在另一侧被合理地读入?例如,Java 的 DataInput/DataOutput readUTF()/writeUTF() 与普通 python socket.send() 和 socket.recv() 不兼容。
-
当我添加以下两行时,服务器代码变得无响应: q = raw_input() c.send(q) 我必须断开连接并重新连接。
-
@JamesKPolk 我做了一个 log.d,实际上我得到了最多 5 个字符的字节。字节是数字,所以我需要解码接收到的数据。
标签: android python sockets chat