【发布时间】:2015-09-23 18:45:07
【问题描述】:
我正在开发一个 android wifi -chat 应用程序。
关于我的应用的一些信息: ->一台设备调用startserver()作为服务器,另一台设备调用startclient()作为客户端
什么有效: ->一个客户端可以成功的第一次发送数据给客户端,但不能一次又一次
->我需要在第一台设备上再次调用 startserver(),以便客户端可以再次发送数据。
startserver()调用这个Async任务,下面是它的DoinBackgroundMethod
protected String doInBackground(Void... params) {
ServerSocket serverSocket = null;
try {
while(true) {
serverSocket = new ServerSocket(PORT);
Socket client = serverSocket.accept();
StartMSG(client);
}
} catch (IOException e) {
return null;
} finally {
try {
chatclient.changeserverrunning(false);
if (serverSocket == null) {
} else {
serverSocket.close();
}
return null;
} catch (Exception e) {
}
}
//return null;
}
protected void StartMSG(Socket client){
try {
InputStream inputstream = client.getInputStream();
ObjectInputStream ois = new ObjectInputStream(inputstream);
Message m = null;
try {
m = (Message) ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (m != null) {
if (m.gettype() == 1) {
final String my_msg = m.getMessage();//Toast msg afterwards
}
}catch (Exception e){
}
}
客户端代码: 它在客户端点击发送按钮并调用启动客户端方法时启动。在该方法中它设置之前的 Ip 值并捆绑它们并将消息发送部分称为 Intent Service,称为 FileTransferService
它的代码是(抽象的):
protected void onHandleIntent(Intent intent) {
Context context = getApplicationContext();
if(socket==null){
socket = new Socket();
}
if (intent.getAction().equals(ACTION_SEND_FILE)) {
final String msg_type=intent.getExtras().getString(MESSAGE_TYPE);
String host = intent.getExtras().getString(EXTRAS_ADDRESS);
int port = intent.getExtras().getInt(EXTRAS_PORT);
try {
socket.bind(null);
socket.connect((new InetSocketAddress(host, port)), SOCKET_TIMEOUT);
Message m = (Message) intent.getExtras().getSerializable(MESSAGE_INTENT_STR);
final String my_message=m.getMessage();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(m);
oos.flush();
oos.close();
InputStream is = new ByteArrayInputStream(baos.toByteArray());
OutputStream stream = socket.getOutputStream();
ChatClient.copyFile(is, stream);
} catch (IOException e) {
} finally {
if (socket != null) {
if (socket.isConnected()) {
try {
//socket.close();
} catch (Exception e) {
// Give up
e.printStackTrace();
}
}
}
}
}
}
【问题讨论】:
-
什么
IOException被抓到了? -
当我在异步任务上运行服务器任务时,我不能吐司异常,我可以使用 handler.post 吐司,但这只会吐司静态文本,我需要将异常对象传递给它祝酒,我觉得如何做到这一点令人困惑
标签: android sockets networking android-asynctask wifip2p