ผมต้องทำโปรแจ๊ค ส่งค่าไปมา ระหว่าง 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());
}
}
});
}
}
ข้อมูลน้อยเกินครับ รบกวนช่วยบอกหน่อยว่าติดปัญหาตรงไหน อะไรยังไง ขอแบบละเอียดหน่อยก็จะดีครับ
อยากให้ลองนึกถึงว่า คุณไม่ได้เป็นคนเขียนโปรแกรมเองแต่ต้องแก้โปรแกรมโดยที่ไม่รู้อะไรเลยดูครับ
ip นี้ เอามาจาก หนังสือปะคับ 192.168.1.19
ลอง 127.0.0.1
ตัว client มันไม่ส่ง ข้อมูลไป server อะคับ
ผมลองรัน ฝั่ง server ก็รอรับปกติ แต่ทางด้าน client ส่งข้อมูลไป ก็จะ ปริ้น data error! ตลอดอะคับ
ในLogcat มันขึ้นแบบนี้อะคับ
default buffer size used in BufferedWriter/BuferedReader constructor . It would be better to be explicit if an 8k-char bufeer id required
T^T
ถ้าสะดวกคุยผ่าน msnได้ไหมคับ
ยาวมาเลยแฮะ ผมพูดตามตรงว่าผมไม่คุ้นเคยกับ Class ต่างๆ ที่คุณเรียกใช้ครับ
สิ่งที่ผมแนะนำได้คือ
คุณต้องรู้จัก Debug เป็น คุณจะได้ตรวจสอบได้ว่า Object แต่ละตัวทำงานได้ครบตามที่คุณต้องการรึเปล่า
คุณต้องรู้จัก Constructor ของแต่ละ Class เห็นได้ว่าคุณยังไม่แม่นเรื่อง Constructor จากตรงนี้
ในตอนทดสอบก็ถือว่ายอมรับได้กับการเขียน Constructor แบบนี้ แต่ในกรณีที่ข้อมูลมันใหญ่มากๆ คุณก็ควรหั่นข้อมูลออกเป็นส่วนๆ ตามที่ Java แนะนำครับ
จริงอยู่ว่ามันทำให้ code สะอาดตา แต่คุณจะ Debug อะไรแทบไม่ได้เลย เพราะมันไม่มีตัวแปรที่เก็บค่าใดๆ ให้คุณเห็น เมื่อคุณ debug
ขออภัยครับ แนะนำได้เท่านี้
ปล.เผื่อจะมีท่านต่อไปมาแนะนำ อยากให้คุณหาสาเหตุให้เจอว่า
3 ข้อนี้มีผลต่อการเขียนโปรแกรมต่อไปของคุณครับ
ลองใช้ telnet เป็น client แทนไปก่อนครับ ดูว่า server ทำงานถูกต้องหรือไม่ ถ้าทำงานได้ถูกค่อยไปไล่ดูโค้ดส่วน client
อ้อ... ใน client อย่าลืมไป allow android.permission.INTERNET ใน Manifest ด้วยนะครับ
pittaya.com
ขอบคุณสำหรับคำแนะนำคับ ผมเพิ่งศึกษาได้ 2 วันเอง
2 วันทำได้ขนาดนี้ต้องขอยกน้ำชาคารวะ 1 จอกครับ
เดวจะลองแก้ไขดูครับแล้วจะมาขอคำแนะนำอีก