Tags:

ผมต้องทำโปรแจ๊ค ส่งค่าไปมา ระหว่าง server - client

เลยซื้อหนังสือมาลองเขียน ผลปรากฏว่า ส่งไปไม่ได้อะคับ

ฝั่ง server

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

public class SimpleServer implements Runnable{

public void run(){

try{

    ServerSocket serverSocket = new ServerSocket(4449);
    Socket client = null;
    System.out.println("Server Strated");
    String message = "Goodbye";

while(true){
client = serverSocket.accept();

    System.out.println("Client accept:" + client);  

try{

BufferedReader in = new BufferedReader(

                 new InputStreamReader(client.getInputStream()));

String str = in.readLine();

System.out.println("read:" + str);

PrintWriter out = new PrintWriter(new BufferedWriter(

              new OutputStreamWriter(client.getOutputStream())),true);

out.println(message);

out.close();

in.close();

}catch(Exception e){

    client.close();

    System.out.println("close");

    System.out.println(e.getMessage());

    e.printStackTrace();}

}
}catch(Exception e){

    System.out.println(e.getMessage());}

}   
public static void main(String a[]){

    Thread desktopServerThread=new Thread(new SimpleServer());

    desktopServerThread.start();

}

}

ฝั่ง client

package com.kku.cs;

import android.app.Activity;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import android.view.View;

import android.view.View.OnClickListener;

import android.os.Bundle;

import android.util.Log;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class AndriodClient extends Activity {

public final String DEBUG_TAG = "AndroidClient";

private TextView mTextView = null;

private EditText mEditText = null;

private Button mButton = null;

private Socket socket = null;

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);


mButton =(Button)findViewById(R.id.Button01);

mTextView =(TextView)findViewById(R.id.TextView01);

mEditText =(EditText)findViewById(R.id.EditText01);

mButton.setOnClickListener(new OnClickListener(){

public void onClick(View v){

    String message = mEditText.getText().toString()+ "\r\n";

try {
    socket = new Socket("192.168.1.19",4449);

    PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())),true);
    out.println(message);


    BufferedReader br = new BufferedReader(new InputStreamReader(
            socket.getInputStream()));
    String msg = br.readLine();


    if(msg != null){
        mTextView.setText(mTextView.getText()+"\n"+msg);
        }
    else {
        mTextView.setText("Data error!");
    }
        out.close();
        br.close();
        socket.close();
    } catch(Exception e){
    Log.e(DEBUG_TAG, e.toString());
    }
    }
});
}

}

Get latest news from Blognone
By: PaPaSEK
ContributorAndroidWindowsIn Love
on 24 August 2011 - 23:57 #326098
PaPaSEK's picture

ข้อมูลน้อยเกินครับ รบกวนช่วยบอกหน่อยว่าติดปัญหาตรงไหน อะไรยังไง ขอแบบละเอียดหน่อยก็จะดีครับ

อยากให้ลองนึกถึงว่า คุณไม่ได้เป็นคนเขียนโปรแกรมเองแต่ต้องแก้โปรแกรมโดยที่ไม่รู้อะไรเลยดูครับ

By: caznova
AndroidRed HatUbuntuWindows
on 25 August 2011 - 00:16 #326115
caznova's picture

ip นี้ เอามาจาก หนังสือปะคับ 192.168.1.19
ลอง 127.0.0.1

By: Namo
Android
on 25 August 2011 - 01:17 #326150

ตัว client มันไม่ส่ง ข้อมูลไป server อะคับ

By: Namo
Android
on 25 August 2011 - 01:19 #326151

ผมลองรัน ฝั่ง server ก็รอรับปกติ แต่ทางด้าน client ส่งข้อมูลไป ก็จะ ปริ้น data error! ตลอดอะคับ

By: Namo
Android
on 25 August 2011 - 01:37 #326157

ในLogcat มันขึ้นแบบนี้อะคับ

default buffer size used in BufferedWriter/BuferedReader constructor . It would be better to be explicit if an 8k-char bufeer id required

By: Namo
Android
on 25 August 2011 - 01:38 #326158

T^T

By: Namo
Android
on 25 August 2011 - 01:44 #326164

ถ้าสะดวกคุยผ่าน msnได้ไหมคับ

By: PaPaSEK
ContributorAndroidWindowsIn Love
on 25 August 2011 - 13:56 #326418
PaPaSEK's picture

ยาวมาเลยแฮะ ผมพูดตามตรงว่าผมไม่คุ้นเคยกับ Class ต่างๆ ที่คุณเรียกใช้ครับ

สิ่งที่ผมแนะนำได้คือ

  1. คุณต้องรู้จัก Debug เป็น คุณจะได้ตรวจสอบได้ว่า Object แต่ละตัวทำงานได้ครบตามที่คุณต้องการรึเปล่า

  2. คุณต้องรู้จัก Constructor ของแต่ละ Class เห็นได้ว่าคุณยังไม่แม่นเรื่อง Constructor จากตรงนี้

default buffer size used in BufferedWriter/BuferedReader constructor . It would be better to be explicit if an 8k-char bufeer id required

ในตอนทดสอบก็ถือว่ายอมรับได้กับการเขียน Constructor แบบนี้ แต่ในกรณีที่ข้อมูลมันใหญ่มากๆ คุณก็ควรหั่นข้อมูลออกเป็นส่วนๆ ตามที่ Java แนะนำครับ

  1. ผมพบว่าการเขียน Code แบบ one - line แบบที่คุณทำมันยากต่อการ debug มากๆ คุณไม่ควรเขียน Code แบบ functional programming แบบนี้

จริงอยู่ว่ามันทำให้ code สะอาดตา แต่คุณจะ Debug อะไรแทบไม่ได้เลย เพราะมันไม่มีตัวแปรที่เก็บค่าใดๆ ให้คุณเห็น เมื่อคุณ debug

ขออภัยครับ แนะนำได้เท่านี้

ปล.เผื่อจะมีท่านต่อไปมาแนะนำ อยากให้คุณหาสาเหตุให้เจอว่า

  • client ส่งข้อมูลได้ - แต่โดน proxy ดักไว้
  • client ส่งข้อมูลได้ - แต่ server รับข้อมูลไม่ได้
  • client ส่งข้อมูลไม่ได้

3 ข้อนี้มีผลต่อการเขียนโปรแกรมต่อไปของคุณครับ

By: pittaya
WriterAndroidUbuntuIn Love
on 25 August 2011 - 15:17 #326458
pittaya's picture

ลองใช้ telnet เป็น client แทนไปก่อนครับ ดูว่า server ทำงานถูกต้องหรือไม่ ถ้าทำงานได้ถูกค่อยไปไล่ดูโค้ดส่วน client

อ้อ... ใน client อย่าลืมไป allow android.permission.INTERNET ใน Manifest ด้วยนะครับ


pittaya.com

By: Namo
Android
on 25 August 2011 - 16:06 #326492

ขอบคุณสำหรับคำแนะนำคับ ผมเพิ่งศึกษาได้ 2 วันเอง

By: PaPaSEK
ContributorAndroidWindowsIn Love
on 25 August 2011 - 16:22 #326496 Reply to:326492
PaPaSEK's picture

2 วันทำได้ขนาดนี้ต้องขอยกน้ำชาคารวะ 1 จอกครับ

By: Namo
Android
on 25 August 2011 - 17:34 #326550

เดวจะลองแก้ไขดูครับแล้วจะมาขอคำแนะนำอีก