Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android应用程序到服务器套接字程序未从应用程序读取字符串_Java_Android - Fatal编程技术网

Java Android应用程序到服务器套接字程序未从应用程序读取字符串

Java Android应用程序到服务器套接字程序未从应用程序读取字符串,java,android,Java,Android,我有一个android应用程序,它将使用以下代码向服务器发送字符串: package com.example.testapp; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWrite

我有一个android应用程序,它将使用以下代码向服务器发送字符串:

package com.example.testapp;


import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {

    private Socket socket;

    private static final int SERVERPORT = 5000;
    private static final String SERVER_IP = "192.168.1.125";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);     

        new Thread(new ClientThread()).start();
    }

    public void onClick(View view) {
        try {
            EditText et = (EditText) findViewById(R.id.EditText01);
            String str = et.getText().toString();
            PrintWriter out = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(socket.getOutputStream())),
                    true);
            out.println(str);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    class ClientThread implements Runnable {

        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                socket = new Socket(serverAddr, SERVERPORT);

            } catch (UnknownHostException e1) {
                e1.printStackTrace();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

        }

    }
}
在服务器端,我运行的java程序如下所示:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServerExample {

    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 5000;

    public static void main(String args[]) throws IOException, ClassNotFoundException{
        //create the socket server object
        server = new ServerSocket(port);
        //keep listens indefinitely until receives 'exit' call or program terminates
        while(true){
            System.out.println("Waiting for client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();
            //read from socket to ObjectInputStream object
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            //convert ObjectInputStream object to String
            String message = (String) ois.readObject();
            System.out.println("Message Received: " + message);
            //create ObjectOutputStream object
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            //write object to Socket
            oos.writeObject("Hi Client "+message);
            //close resources
            ois.close();
            oos.close();
            socket.close();
            //terminate the server if client sends exit request
            if(message.equalsIgnoreCase("exit")) break;
        }
        System.out.println("Shutting down Socket server!!");
        //close the ServerSocket object
        server.close();
    }

}
但它并没有读取我从android应用程序发送的字符串。相反,当我从应用程序提交时,java程序显示以下错误:

Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 54657374
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:803)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
    at SocketServerExample.main(SocketServerExample.java:29)
线程“main”java.io.StreamCorruptedException中的异常:无效流头:54657374 位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:803) 位于java.io.ObjectInputStream。(ObjectInputStream.java:298) 位于SocketServerExample.main(SocketServerExample.java:29)
我怎样才能解决这个问题。我的错误在哪里??它是在服务器端还是客户端??请帮帮我。问题分析:

您使用
PrintWriter
从客户端发送,但在服务器的接收端使用
ObjectInputStream
。这两者不兼容

您必须同时使用一对
Writer
Reader
或一对
ObjectOutputStream
ObjectInputStream
,但不能将它们混合使用

解决方案

我们将使用成对的
Writer
Reader
。客户端已经使用了
编写器
读取器
,因此我们只需要更改服务器端

在服务器端,不要使用
ObjectInputStream
,而是使用
BufferedReader

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
reader.readLine();
此外,在服务器端使用
PrintWriter
而不是
ObjectOutputStream
发送回客户端:

PrintWriter writer = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream())),
                true);
writer.println(str);
 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
总而言之,服务器端如下所示:

import java.io.IOException;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.ClassNotFoundException;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServerExample {

    //static ServerSocket variable
    private static ServerSocket server;
    //socket server port on which it will listen
    private static int port = 5000;

    public static void main(String args[]) throws IOException, ClassNotFoundException{
        //create the socket server object
        server = new ServerSocket(port);
        //keep listens indefinitely until receives 'exit' call or program terminates
        while(true){
            System.out.println("Waiting for client request");
            //creating socket and waiting for client connection
            Socket socket = server.accept();

            // //read from socket to ObjectInputStream object
            // ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            // //convert ObjectInputStream object to String
            // String message = (String) ois.readObject();
            // System.out.println("Message Received: " + message);

            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = reader.readLine();
            System.out.println("Message Received: " + message);

            // //create ObjectOutputStream object
            // ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            // //write object to Socket
            // oos.writeObject("Hi Client "+message);

            PrintWriter writer = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream())),
                true);
            writer.println("Hi Client "+message);

            //close resources
            reader.close();
            writer.close();
            socket.close();
            //terminate the server if client sends exit request
            if(message.equalsIgnoreCase("exit")) break;
        }
        System.out.println("Shutting down Socket server!!");
        //close the ServerSocket object
        server.close();
    }

}
发送任何内容后使用
flush()

out.println(str);
out.flush();

在客户端上使用此选项:

PrintWriter writer = new PrintWriter(new BufferedWriter(
                new OutputStreamWriter(socket.getOutputStream())),
                true);
writer.println(str);
 PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
在服务器上使用此选项:

BufferedReader is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String message = is.readLine();

你能telnet/ping/curl服务器吗?它正在发送一个字符串str。你可以在android活动中看到,但在Socket中它没有收到。您可以建议需要做哪些更改吗?您可以建议我如何更正此问题,我对此不熟悉I put而不是BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream());reader.readLine();ObjectOutputStream oos=新的ObjectOutputStream(socket.getOutputStream())//将对象写入套接字oos.writeObject(“Hi Client”+消息);仍然是相同的错误BufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream());reader.readLine();非常感谢你的帮助,伙计,效果很好,你真了不起\他在
true
上有自动刷新功能,因此不需要手动刷新。