gpt4 book ai didi

java - 我在这里做错了什么 : Android Socket Connection?

转载 作者:行者123 更新时间:2023-11-30 03:58:03 26 4
gpt4 key购买 nike

我正在将我从 theneboston.com 学到的客户端-服务器应用程序转换为 Android 应用程序,它是一个使用套接字(TCP 连接)进行通信的即时消息应用程序,在我的 Android 应用程序中,一个设备是服务器,另一个是客户。现在在模拟器上运行服务器端应用程序时出现问题,应用程序卡住大约 40 秒,然后弹出一条错误消息说:

Activity ServerIM (in application Android Server Instant Messaging ) is not responding

我认为问题在于创建 ServerSocket。我真的需要这个,所以我很感激任何人都可以帮助我度过难关。

这是我的 ServeIM Android 类:

package com.example.android.server.instant.messenger;

import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class ServerIM extends Activity {

private ScrollView scrollView;
private EditText userText;
private Button connectButton;
private Button sendButton;
private TextView chatLog;

private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket server;
private Socket connection;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_server_im);

scrollView = (ScrollView) findViewById(R.id.ScrollView);
userText = (EditText) findViewById(R.id.user_Text);
connectButton = (Button) findViewById(R.id.button_connect);
sendButton = (Button) findViewById(R.id.button_send);
chatLog = (TextView) findViewById(R.id.chat_Log);

ableToType(false);

connectButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showMessage("1"); // this message doesn't appends to the
// TextView
startRunning();
}
});

}

public void startRunning() {
try {
(new Thread(new Runnable() {
public void run() {
try {
server = new ServerSocket(5678, 100);
} catch (IOException e) {
e.printStackTrace();
}
}
})).start();
while (true) {
try {
waitForConnection();
setupStreams();
whileChatting();
} catch (EOFException eofException) {
showMessage("\n Server ended the connection!");
} finally {
closeCrap();
}
}
} catch (IOException ioException) {
ioException.printStackTrace();
}

}

// wait for connection, then display connection information
private void waitForConnection() throws IOException {
showMessage("Waiting for someone to connect... \n");
connection = server.accept();
showMessage("Now connected to "
+ connection.getInetAddress().getHostName());
}

// get stream to send and recieve data
private void setupStreams() throws IOException {
output = new ObjectOutputStream(connection.getOutputStream());
output.flush();
input = new ObjectInputStream(connection.getInputStream());
showMessage("\n Streams are now setup! \n");
}

// during the chat conversation
private void whileChatting() throws IOException {
String message = " You are now connected! ";
sendMessage(message);
ableToType(true);
do {
// have a conversation
try {
message = (String) input.readObject();
showMessage("\n" + message);
} catch (ClassNotFoundException classNotFoundException) {
showMessage("\n idk wtf that user sent! ");
}
} while (!message.equals("CLIENT - END"));
}

// close streams ans sockets after you are done chatting
private void closeCrap() {
showMessage("\n Closing Connections... \n");
ableToType(false);
try {
output.close();
input.close();
connection.close();
} catch (IOException ioException) {
ioException.printStackTrace();
}
}

// send message to client
private void sendMessage(String message) {
try {
output.writeObject("SERVER - " + message);
output.flush();
showMessage("\n Server - " + message);
} catch (IOException ioException) {
chatLog.append("\n ERROR: I can't send this message");
}
}

// update chatWindow
private void showMessage(final String text) {
final Handler myHandler = new Handler();

(new Thread(new Runnable() {
public void run() {
myHandler.post(new Runnable() {
public void run() {
chatLog.append(text + "\n");
}
});
}
})).start();
}

// let the user type stuff into their box
private void ableToType(final boolean tof) {

final Handler myHandler = new Handler();

(new Thread(new Runnable() {
public void run() {
myHandler.post(new Runnable() {
public void run() {
userText.setEnabled(tof);
}
});
}
})).start();

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_server_im, menu);
return true;
}
}

这是 XML 文件:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ScrollView
android:id="@+id/ScrollView"
android:layout_width="fill_parent"
android:layout_height="150dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >

<TextView
android:id="@+id/chat_Log"
android:layout_width="wrap_content"
android:layout_height="339dp"
android:text="" />
</ScrollView>

<EditText
android:inputType="text"
android:id="@+id/user_Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/ScrollView"
android:layout_marginTop="39dp"
android:ems="10" />

<Button
android:id="@+id/button_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/user_Text"
android:layout_toRightOf="@+id/user_Text"
android:minWidth="100dip"
android:text="Send" />

<Button
android:id="@+id/button_connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button_send"
android:layout_alignRight="@+id/button_send"
android:layout_below="@+id/button_send"
android:text="Connect" />

</RelativeLayout>

和 list :

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.server.instant.messenger"
android:versionCode="1"
android:versionName="1.0" >

<uses-permission android:name="android.permission.INTERNET" />

<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".ServerIM"
android:label="@string/title_activity_server_im" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

最佳答案

ServerSocket.accept() 函数在 UI 线程中运行,并将阻塞直到它获得连接。

您的想法是正确的,在不同的线程中创建 ServerSocket,但是您必须在后台运行 accept() 函数。

关于java - 我在这里做错了什么 : Android Socket Connection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13031548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com