java 및 android에서 매우 간단한 클라이언트/서버 응용 프로그램을 구현하려고합니다. 서버를 실행할 때 서버가 정상적으로 실행되는 것처럼 보입니다. 안드로이드 클라이언트가 내 전화기에서 열립니다. 그러나 서버에 WiFi 연결을 통해 메시지를 보내려고해도 작동하지 않습니다.안드로이드 클라이언트가 Java 서버에 연결하지 않습니다.
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.SentientShadow.Client" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enter message:" />
<EditText
android:id="@+id/etMessage"
android:layout_width="wrap_content"
android:layout_height="100dp"
android:layout_alignLeft="@+id/textView1"
android:layout_below="@+id/textView1"
android:layout_marginTop="14dp"
android:ems="10" />
<Button
android:id="@+id/bSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editText1"
android:layout_below="@+id/editText1"
android:text="Send" />
</RelativeLayout>
: 여기
package com.SentientShadow;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.os.Bundle;
public class Client extends ActionBarActivity implements OnClickListener {
private EditText etMessage;
private Button bSend;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_client);
etMessage = (EditText)findViewById(R.id.etMessage);
bSend = (Button)findViewById(R.id.bSend);
bSend.setOnClickListener(this);
}
public void onClick(View view) {
Thread thread = new Thread(){
public void run() {
try {
Socket connection = new Socket("127.0.0.1", 6789);
DataOutputStream output = new DataOutputStream(connection.getOutputStream());
output.writeUTF(etMessage.getText().toString());
output.flush();
output.close();
connection.close();
} catch (UnknownHostException e) {
System.out.println("problem connecting to specified address");
} catch (IOException e) {
System.out.println("problem connecting to port");
}
}
};
thread.start();
Toast.makeText(this, "Message has been sent!", Toast.LENGTH_SHORT).show();
}
}
은 클라이언트 활동에 대한 XML 레이아웃 파일입니다 : 여기
package com.SentientShadow;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
Thread thread = new Thread(){
public void run() {
System.out.println("Server has started and is listening...");
try{
ServerSocket socket = new ServerSocket(6879);
while (true){
Socket connection = socket.accept();
DataInputStream input = new DataInputStream(connection.getInputStream());
System.out.println("Received from client: " + input.readUTF());
input.close();
connection.close();
}
}catch(IOException e){
System.out.println("problem accepting connection");
}
}
};
thread.start();
}
}
클라이언트 활동에 대한 내 코드입니다 : 여기
서버에 대한 내 코드입니다
다음은 XML 매니페스트 파일에 대한 코드입니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.SentientShadow"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="Client"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
필자는 IOException과 UnknownHostException printstacktrace를 System.out.println 메시지로 대체하여 문제가 이러한 오류 중 하나에서 발생하는지 확인할 수 있도록했습니다. 그러나 아무 것도 콘솔에 인쇄되지 않았습니다.
또한 포트 스캐너를 사용하여 여러 포트를 스캔했는데 폐쇄 된 상태로 돌아 오기 때문에 학교 네트워크에서 모든 포트를 차단 한 것으로 보입니다. 그러나 이전에 다른 클라이언트/서버 응용 프로그램을 만들었습니다. 클라이언트와 서버 모두 Java에서 순수하게 데스크톱 응용 프로그램으로 코딩되었습니다. 이 경우, 필자는 localhost (127.0.0.1)를 IP 주소로 사용하고 여러 포트로 응용 프로그램을 시험해 보았습니다. 나는 또한 내 연결의 공용 IP 주소로 그 응용 프로그램을 시도하고 그것은 효과.
따라서 포트에 연결하는 데 문제가 아니라 응용 프로그램의 안드로이드 클라이언트 측에 문제가 있다고 생각하기 시작했습니다. 그러나 나는 무엇이 잘못되었는지 알 수 없다.
그런데 메시지를 보내려고하는 동안 클라이언트를 실행하는 휴대 전화와 서버를 실행하는 랩톱이 모두 동일한 네트워크에 연결되었습니다.
동일한 장치의 서버에 연결하는 데 사용하기 때문에 127.0.0.1을 사용할 수 없습니다. 서버 pc의 로컬 IP 주소를 사용해야합니다. 뭔가 종종 192.168.0.23을 좋아합니다. 실행중인 창에서 ipconfig를 사용하여 명령 줄에서 찾으십시오. – greenapps
예, 로컬 및 공용 IP 입력을 시도했습니다. 그러나, 어느 쪽도 일하지 않았다. – SentientShadow
이것을 막는 방화벽이 없었습니까? – greenapps