2014-09-24 2 views
0

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 주소로 그 응용 프로그램을 시도하고 그것은 효과.

따라서 포트에 연결하는 데 문제가 아니라 응용 프로그램의 안드로이드 클라이언트 측에 문제가 있다고 생각하기 시작했습니다. 그러나 나는 무엇이 잘못되었는지 알 수 없다.

그런데 메시지를 보내려고하는 동안 클라이언트를 실행하는 휴대 전화와 서버를 실행하는 랩톱이 모두 동일한 네트워크에 연결되었습니다.

+0

동일한 장치의 서버에 연결하는 데 사용하기 때문에 127.0.0.1을 사용할 수 없습니다. 서버 pc의 로컬 IP 주소를 사용해야합니다. 뭔가 종종 192.168.0.23을 좋아합니다. 실행중인 창에서 ipconfig를 사용하여 명령 줄에서 찾으십시오. – greenapps

+0

예, 로컬 및 공용 IP 입력을 시도했습니다. 그러나, 어느 쪽도 일하지 않았다. – SentientShadow

+0

이것을 막는 방화벽이 없었습니까? – greenapps

답변

1

좋아, 나는 마침내 greenapps에서 제안 덕분에 문제를 발견했다. 기본적으로 방화벽은 내 컴퓨터에서 자바 플랫폼으로 들어오는 모든 연결을 차단하고있는 것으로 나타났습니다.

는이 문제를 해결하려면 :

  1. 제어 패널을 열고 왼쪽에 고급 보안 대화 상자 Windows 방화벽에서 Windows 용 방화벽
  2. 검색 "인바운드 규칙"을 통해
  3. 찾아보기를 클릭하고
  4. 인바운드 연결을 허용 할 응용 프로그램을 선택하고 마우스 오른쪽 단추로 클릭하십시오.
  5. 속성 선택 및 "연결 허용"또는 "보안 연결 인 경우 연결 허용"을 누릅니다.
관련 문제