Java 我发现我的代码不在“之后”;socket=serverSocket.accept()&引用;,程序在这里卡住了
图片: 我正在尝试在android模拟器中进行套接字编程,在两个不同的模拟器上运行客户端和服务器。我看到我的代码在“socket socket=serverSocket.accept();”之后没有出现,程序被卡住了。 我使用ip:10.0.2.2作为另一个ip的give i/O异常。 另外,我知道serverSocket.accept()的作用,我的问题是我无法解决这个问题。为什么它总是在等待客户,即使我的客户正在尝试连接到它。请查看我的服务器和客户端代码,让我知道是否有人可以解决这个问题 服务器:Java 我发现我的代码不在“之后”;socket=serverSocket.accept()&引用;,程序在这里卡住了,java,android,sockets,serversocket,Java,Android,Sockets,Serversocket,图片: 我正在尝试在android模拟器中进行套接字编程,在两个不同的模拟器上运行客户端和服务器。我看到我的代码在“socket socket=serverSocket.accept();”之后没有出现,程序被卡住了。 我使用ip:10.0.2.2作为另一个ip的give i/O异常。 另外,我知道serverSocket.accept()的作用,我的问题是我无法解决这个问题。为什么它总是在等待客户,即使我的客户正在尝试连接到它。请查看我的服务器和客户端代码,让我知道是否有人可以解决这个问题
package com.example.serverside;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView info, infoip, msg;
String message = "";
ServerSocket serverSocket;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
info = (TextView) findViewById(R.id.info);
infoip = (TextView) findViewById(R.id.infoip);
msg = (TextView) findViewById(R.id.msg);
infoip.setText(getIpAddress());
Thread socketServerThread = new Thread(new SocketServerThread());
socketServerThread.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private class SocketServerThread extends Thread {
static final int SocketServerPORT = 8080;
int count = 0;
@Override
public void run() {
try {
serverSocket = new ServerSocket(SocketServerPORT);
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
info.setText("I'm waiting here: "
+ serverSocket.getLocalPort());
}
});
while (true) {
Socket socket = serverSocket.accept();
count++;
message += "#" + count + " from " + socket.getInetAddress()
+ ":" + socket.getPort() + "\n";
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
msg.setText(message);
}
});
SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
socket, count);
socketServerReplyThread.run();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private class SocketServerReplyThread extends Thread {
private Socket hostThreadSocket;
int cnt;
SocketServerReplyThread(Socket socket, int c) {
hostThreadSocket = socket;
cnt = c;
}
@Override
public void run() {
OutputStream outputStream;
String msgReply = "Hello from Android, you are #" + cnt;
try {
outputStream = hostThreadSocket.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.print(msgReply);
printStream.close();
message += "replayed: " + msgReply + "\n";
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
msg.setText(message);
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
message += "Something wrong! " + e.toString() + "\n";
}
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
msg.setText(message);
}
});
}
}
private String getIpAddress() {
String ip = "";
try {
Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (enumNetworkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = enumNetworkInterfaces
.nextElement();
Enumeration<InetAddress> enumInetAddress = networkInterface
.getInetAddresses();
while (enumInetAddress.hasMoreElements()) {
InetAddress inetAddress = enumInetAddress.nextElement();
if (inetAddress.isSiteLocalAddress()) {
ip += "SiteLocalAddress: "
+ inetAddress.getHostAddress() + "\n";
}
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ip += "Something Wrong! " + e.toString() + "\n";
}
return ip;
}
}
package com.example.serverside;
导入androidx.appcompat.app.appcompat活动;
导入android.os.Bundle;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintStream;
导入java.net.InetAddress;
导入java.net.NetworkInterface;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.net.SocketException;
导入java.util.Enumeration;
导入android.widget.TextView;
公共类MainActivity扩展了AppCompatActivity{
TextView信息、infoip、msg;
字符串消息=”;
服务器套接字服务器套接字;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
info=(TextView)findViewById(R.id.info);
infoip=(TextView)findViewById(R.id.infoip);
msg=(TextView)findViewById(R.id.msg);
infoip.setText(getIpAddress());
Thread socketServerThread=新线程(新的socketServerThread());
socketServerThread.start();
}
@凌驾
受保护的空onDestroy(){
super.ondestory();
if(serverSocket!=null){
试一试{
serverSocket.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
私有类SocketServerThread扩展线程{
静态最终int SocketServerPORT=8080;
整数计数=0;
@凌驾
公开募捐{
试一试{
serverSocket=新的serverSocket(SocketServerPORT);
MainActivity.this.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
info.setText(“我在这里等待:”
+serverSocket.getLocalPort());
}
});
while(true){
Socket=serverSocket.accept();
计数++;
来自“+socket.getInetAddress()的消息+=”#“+count+”)
+“:”+socket.getPort()+“\n”;
MainActivity.this.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
msg.setText(消息);
}
});
SocketServerReplyThread SocketServerReplyThread=新的SocketServerReplyThread(
插座,计数);
socketServerReplyThread.run();
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
私有类SocketServerReplyThread扩展线程{
私有套接字hostThreadSocket;
int-cnt;
SocketServerReplyThread(Socket-Socket,int-c){
hostThreadSocket=套接字;
cnt=c;
}
@凌驾
公开募捐{
输出流输出流;
String msgReply=“来自Android的您好,您是#”+cnt;
试一试{
outputStream=hostThreadSocket.getOutputStream();
PrintStream PrintStream=新的PrintStream(outputStream);
printStream.print(msgReply);
printStream.close();
消息+=“重播:”+msgReply+“\n”;
MainActivity.this.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
msg.setText(消息);
}
});
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
消息+=“有问题!”+e.toString()+“\n”;
}
MainActivity.this.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
msg.setText(消息);
}
});
}
}
私有字符串getIpAddress(){
字符串ip=“”;
试一试{
枚举enumNetworkInterfaces=网络接口
.getNetworkInterfaces();
while(enumNetworkInterfaces.hasMoreElements()){
NetworkInterface NetworkInterface=EnumNetworkInterface
.nextElement();
枚举enumInetAddress=网络接口
.getInetAddresses();
while(enumInetAddress.hasMoreElements()){
InetAddress InetAddress=enumInetAddress.nextElement();
if(inetAddress.isSiteLocalAddress()){
ip+=“站点本地地址:”
+inetAddress.getHostAddress()+“\n”;
}
}
}
}捕获(SocketException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
ip++=“有问题!”+e.toString()+“\n”;
}
返回ip;
}
}
客户:
package com.example.clientside;
import android.os.Bundle;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import android.os.AsyncTask;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedInputStream;
public class MainActivity extends Activity {
TextView textResponse;
EditText editTextAddress, editTextPort;
Button buttonConnect, buttonClear;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTextAddress = (EditText)findViewById(R.id.address);
editTextPort = (EditText)findViewById(R.id.port);
buttonConnect = (Button)findViewById(R.id.connect);
buttonClear = (Button)findViewById(R.id.clear);
textResponse = (TextView)findViewById(R.id.response);
buttonConnect.setOnClickListener(buttonConnectOnClickListener);
buttonClear.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
textResponse.setText("");
}});
}
OnClickListener buttonConnectOnClickListener =
new OnClickListener(){
@Override
public void onClick(View arg0) {
MyClientTask myClientTask = new MyClientTask(
editTextAddress.getText().toString(),
Integer.parseInt(editTextPort.getText().toString()));
myClientTask.execute();
}};
public class MyClientTask extends AsyncTask<Void, Void, Void> {
String dstAddress;
int dstPort;
String response = "";
MyClientTask(String addr, int port){
dstAddress = addr;
dstPort = port;
}
@Override
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
ByteArrayOutputStream byteArrayOutputStream =
new ByteArrayOutputStream(1024);
byte[] buffer = new byte[1024];
int bytesRead;
InputStream inputStream = socket.getInputStream();
/*
* notice:
* inputStream.read() will block if no data return
*/
while ((bytesRead = inputStream.read(buffer)) != -1){
byteArrayOutputStream.write(buffer, 0, bytesRead);
response += byteArrayOutputStream.toString("UTF-8");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "UnknownHostException: " + e.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
response = "IOException: " + e.toString();
}finally{
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(Void result) {
textResponse.setText(response);
super.onPostExecute(result);
}
}
}
package com.example.clientside;
导入android.os.Bundle;
进口j
public static String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (Exception ex) {
Log.e("IP Address", ex.toString());
}
return null;
}