我有一个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)
我怎样才能解决这个问题.我的错误在哪里?是在服务器端还是客户端?请帮助我.
解决方法:
问题分析:
您使用PrintWriter从客户端进行发送,但是在服务器的接收端使用ObjectinputStream.这两个不兼容.
您必须同时使用一对Writer和Reader或一对ObjectOutputStream和ObjectinputStream,但是不能将它们混合使用.
解:
我们将使用成对的Writer和Reader.客户端已经使用了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);
总之,服务器端看起来像这样:
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(); }}
总结 以上是内存溢出为你收集整理的Java-Android应用程序到服务器套接字程序未从应用程序读取字符串全部内容,希望文章能够帮你解决Java-Android应用程序到服务器套接字程序未从应用程序读取字符串所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)