Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > сервер отправил, клиент обработал и вернул.


Автор: argamidon 5.8.2013, 17:54
извините если создал тему не в той ветке.
создаю одну прогу, которая должна была бы брать определённый текст с сервера , делать с ним определённые действия и отправлять назад серверу.
клиент написан на android SDK jdk 1.6, а сервак на обычной настольной java se/1.7....Клиент также использует SocketChannel для того чтобы его можно прервать.

проблема вот в чём: пока сервер пытается читать ответ, на клиент ничего не может придти. Но если цикл, который читает входящие данные на стороне сервера закоментировать, то сообщение к клиенту доходит без проблем. клиент даже прочитать нормально не может.
мне очень важно использовать SocketChannel на стороне клиента. помогите понять в чём проблема.
пытался юзать shutdownInput/shutdownOutput но на андроиде такого метода нету(пока).

эти две программы укорочены насколько я смог чтобы определить неисправность.
их работа примерно по такой схеме должна происходить:
user posted image


server:
Код

package javaapplication4;
 
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.nio.channels.SocketChannel;
import java.util.Scanner;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
 
public class JavaApplication4 {
    public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException, InterruptedException {
        ServerSocket server = new ServerSocket(8000);
        
        
        Socket socket = server.accept();
        
        
 
 
        OutputStream out = socket.getOutputStream();
        Writer ww = new OutputStreamWriter(out, "UTF-8");
        PrintWriter writer = new PrintWriter(ww, true);
        writer.println("hello");
        
        System.out.println(socket.getInetAddress());
 
        Scanner sc = new Scanner(socket.getInputStream());
        String res = "";
        while (sc.hasNextLine()) {
            res += sc.nextLine();
            System.out.println(res);
        }
        
        System.out.println(res);
        socket.close();
    }
}


клиент-андроид
Код

package com.example.app;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.Channels;
import java.nio.channels.SocketChannel;
import java.util.Scanner;
 
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.PendingIntent;
import android.app.PendingIntent.CanceledException;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends Activity implements View.OnClickListener {
    Button button, send;
    TextView text;
    static String PENDING_KEY = "pending_key";
    static int PENDING_CODE = 1001;
    PendingIntent pi;
    Thread th5;
    SocketChannel s;
    Socket socket;
    String res = "";
    private Handler handler = new Handler() {
        public void handleMessage(Message m) {
            if (m.what == 0) {
                String g = (String) m.obj;
                Toast.makeText(MainActivity.this, g, 0).show();
            } else if (m.what == 1) {
                Toast.makeText(MainActivity.this, "hello", 0).show();
            }
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) this.findViewById(R.id.button1);
        text = (TextView) this.findViewById(R.id.textView1);
        button.setOnClickListener(this);
        send = (Button) this.findViewById(R.id.button2);
        send.setOnClickListener(this);
    }
 
    @Override
    public void onClick(View v) {
        if (v == button) {
            th5 = new Thread() {
                public void run() {
                    InetSocketAddress address = new InetSocketAddress(
                            "81.25.39.170", 8000);
 
                    try {
 
                        s = SocketChannel.open();
 
                        s.connect(address);
                        Scanner sc = new Scanner(s);
                        while (sc.hasNextLine()) {
                            res += sc.nextLine();
                        }
                        handler.sendMessage(handler.obtainMessage(0, res));
                        // PrintWriter writer = new PrintWriter(
                        // Channels.newOutputStream(s), true);
                        // writer.println(res);
                        // writer.flush();
 
                    } catch (IOException e) {
                        handler.sendMessage(handler.obtainMessage(0,
                                e.toString()));
                    } finally {
                    }
 
                }
            };
            th5.start();
 
        } else if (v == send) {
            OutputStream out = Channels.newOutputStream(s);
            PrintWriter writer = new PrintWriter(out, true);
            writer.write("hello");
        }
    }
 
}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)