客户端未从服务器接收字符串

我试图在java中使用套接字编写TCP客户端,但我似乎无法读取从服务器发送到客户端的数据。 有一段时间我会从服务器收到但不是所有时间..

public class TCPClient { private String serverMessage; public static final String SERVERIP = "103.13.97.87"; //your computer IP address public static final int SERVERPORT = 8101; private OnMessageReceived mMessageListener = null; private boolean mRun = false; PrintWriter out; BufferedReader in; /** * Constructor of the class. OnMessagedReceived listens for the messages received from server */ public TCPClient(OnMessageReceived listener) { mMessageListener = listener; } /** * Sends the message entered by client to the server * @param message text entered by client */ public void sendMessage(String message){ if (out != null && !out.checkError()) { out.println(message); out.flush(); } } public void stopClient(){ mRun = false; } public void run() { mRun = true; try { //here you must put your computer's IP address. InetAddress serverAddr = InetAddress.getByName(SERVERIP); Log.e("TCP Client", "C: Connecting..."); //create a socket to make the connection with the server Socket socket = new Socket(serverAddr, SERVERPORT); try { //send the message to the server out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); Log.e("TCP Client", "C: Sent."); Log.e("TCP Client", "C: Done."); //receive the message which the server sends back in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //in this while the client listens for the messages sent by the server while (mRun) { serverMessage = in.readLine(); if (serverMessage != null && mMessageListener != null) { //call the method messageReceived from MyActivity class mMessageListener.messageReceived(serverMessage); } serverMessage = null; } Log.e("RESPONSE FROM SERVER", "S: Received Message: '" + serverMessage + "'"); } catch (Exception e) { Log.e("TCP", "S: Error", e); } finally { //the socket must be closed. It is not possible to reconnect to this socket // after it is closed, which means a new socket instance has to be created. socket.close(); } } catch (Exception e) { Log.e("TCP", "C: Error", e); } } //Declare the interface. The method messageReceived(String message) will must be implemented in the MyActivity //class at on asynckTask doInBackground public interface OnMessageReceived { public void messageReceived(String message); } } 

我的CustomAdpter.java

 public class MyCustomAdapter extends BaseAdapter { private ArrayList mListItems; private LayoutInflater mLayoutInflater; public MyCustomAdapter(Context context, ArrayList arrayList){ mListItems = arrayList; //get the layout inflater mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { //getCount() represents how many items are in the list return mListItems.size(); } @Override //get the data of an item from a specific position //i represents the position of the item in the list public Object getItem(int i) { return null; } @Override //get the position id of the item from the list public long getItemId(int i) { return 0; } @Override public View getView(int position, View view, ViewGroup viewGroup) { //check to see if the reused view is null or not, if is not null then reuse it if (view == null) { view = mLayoutInflater.inflate(R.layout.list_item, null); } //get the string item from the position "position" from array list to put it on the TextView String stringItem = mListItems.get(position); if (stringItem != null) { TextView itemName = (TextView) view.findViewById(R.id.list_item_text_view); if (itemName != null) { //set the item name on the TextView itemName.setText(stringItem); } } //this method must return the view corresponding to the data at the specified position. return view; } } 

MainActivity.java

 public class MainActivity extends Activity { private ListView mList; private ArrayList arrayList; private MyCustomAdapter mAdapter; private TCPClient mTcpClient; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); arrayList = new ArrayList(); final EditText editText = (EditText) findViewById(R.id.editText); Button send = (Button)findViewById(R.id.send_button); //relate the listView from java to the one created in xml mList = (ListView)findViewById(R.id.list); mAdapter = new MyCustomAdapter(this, arrayList); mList.setAdapter(mAdapter); // connect to the server new connectTask().execute(""); send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //String message = editText.getText().toString(); String message = "mall: ABC Mall date: 08/08/2013 time: 13:45 md5 f6151b2cdc256be4971bcc30629bbc7\r\n"; /* String str =md5Digest(message); String s=message+str;*/ //add the text in the arrayList arrayList.add("c: " + message); //sends the message to the server if (mTcpClient != null) { mTcpClient.sendMessage(message); /*mTcpClient.sendMessage(s);*/ } //refresh the list mAdapter.notifyDataSetChanged(); editText.setText(""); } }); } public class connectTask extends AsyncTask { @Override protected TCPClient doInBackground(String... message) { //we create a TCPClient object and mTcpClient = new TCPClient(new TCPClient.OnMessageReceived() { @Override //here the messageReceived method is implemented public void messageReceived(String message) { //this method calls the onProgressUpdate publishProgress(message); } }); mTcpClient.run(); return null; } @Override protected void onProgressUpdate(String... values) { super.onProgressUpdate(values); //in the arrayList we add the messaged received from server arrayList.add(values[0]); // notify the adapter that the data set has changed. This means that new message received // from server was added to the list mAdapter.notifyDataSetChanged(); } } public static final String md5Digest(final String text) { try { // Create MD5 Hash MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(text.getBytes()); byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); int messageDigestLenght = messageDigest.length; for (int i = 0; i < messageDigestLenght; i++) { String hashedData = Integer.toHexString(0xFF & messageDigest[i]); while (hashedData.length() < 2) hashedData = "0" + hashedData; hexString.append(hashedData); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; // if text is null then return nothing } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }