извините если создал тему не в той ветке. создаю одну прогу, которая должна была бы брать определённый текст с сервера , делать с ним определённые действия и отправлять назад серверу. клиент написан на android SDK jdk 1.6, а сервак на обычной настольной java se/1.7....Клиент также использует SocketChannel для того чтобы его можно прервать. проблема вот в чём: пока сервер пытается читать ответ, на клиент ничего не может придти. Но если цикл, который читает входящие данные на стороне сервера закоментировать, то сообщение к клиенту доходит без проблем. клиент даже прочитать нормально не может. мне очень важно использовать SocketChannel на стороне клиента. помогите понять в чём проблема. пытался юзать shutdownInput/shutdownOutput но на андроиде такого метода нету(пока). эти две программы укорочены насколько я смог чтобы определить неисправность. их работа примерно по такой схеме должна происходить:  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"); } } }
|
|