Справка сервера сокетов Java

1

Привет, я очень новый для java-программирования, и я действительно застрял, получая сервер сокетов и клиент, работающий так, как я хочу.

Проблема im, имеющая...

Сервер:

Im, смотрящий на результат от клиента, и как только клиент распечатает "TIME", сервер вернет сообщение, например "время...". Сервер делает это, но не сразу, кажется, отправляет его во второй раз, когда вы отправляете сообщение от клиента.

Это потому, что клиент не подключен все время?

Я уверен, что этот метод неверен, может кто-нибудь дать мне несколько советов.

Любая помощь будет большой.

Лука

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class MyServer {

public static void main(String[] args){
ServerSocket serverSocket = null;
Socket socket = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;

try {
serverSocket = new ServerSocket(8888);
System.out.println("Listening :8888");
} catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }

 while(true){
 try {
socket = serverSocket.accept();
in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));


dataOutputStream = new DataOutputStream(socket.getOutputStream());
System.out.println("ip: " + socket.getInetAddress());
System.out.println("message: " + dataInputStream.readUTF());
dataOutputStream.writeUTF("Hello!");



try{
 String line = in.readLine();


 if (line.contains("TIME")){
  dataOutputStream.writeUTF("TIME IS.....");  // ITS HERE THE PROBLEM MAY BE ?

  {


    } catch (IOException e){
    System.out.println("Read failed");
    System.exit(1);
          }




 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  finally{
  if( socket!= null){
    try {
     socket.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}

if( dataInputStream!= null){
 try {
  dataInputStream.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}

if( dataOutputStream!= null){
 try {
  dataOutputStream.close();
 } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
    }
   }
   }
   }
   }
   }

Клиент Android

UPDATE, я думаю, проблема связана с подключением клиента только при отправке сообщения. Как у меня есть цикл чтения здесь, который не влияет, когда я отправляю данные от клиента.

package com.exercise.AndroidClient;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

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

public class AndroidClient extends Activity {

EditText textOut;
TextView textIn;

/** Called when the activity is first created. */
    @Override
  public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);

 textOut = (EditText)findViewById(R.id.textout);
 Button buttonSend = (Button)findViewById(R.id.send);
 textIn = (TextView)findViewById(R.id.textin);
 buttonSend.setOnClickListener(buttonSendOnClickListener);
 }

 Button.OnClickListener buttonSendOnClickListener
 = new Button.OnClickListener(){

 @Override
 public void onClick(View arg0) {
 // TODO Auto-generated method stub
 Socket socket = null;
 DataOutputStream dataOutputStream = null;
 DataInputStream dataInputStream = null;

 try {
 socket = new Socket("192.168.1.101", 8888);
 dataOutputStream = new DataOutputStream(socket.getOutputStream());
 dataInputStream = new DataInputStream(socket.getInputStream());
 dataOutputStream.writeUTF(textOut.getText().toString());
 textIn.setText(dataInputStream.readUTF());
 }  catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if (socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if (dataOutputStream != null){
try {
dataOutputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if (dataInputStream != null){
try {
dataInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}};
}
Теги:
sockets

2 ответа

3

После строки dataOutputStream.writeUTF() напишите dataOutputStream.flush();. Это отправит все данные.

0

Кажется, вы читаете из потока для вывода сообщения.

    System.out.println("message: " + dataInputStream.readUTF());

Таким образом, команда была удалена из потока при попытке запустить

    String line = in.readLine();

Вы должны попытаться прочитать команду из потока в переменную перед выводом сообщения, а затем проверить, содержит ли эта строка "ВРЕМЯ".

Также зачем использовать два разных метода для чтения из потока? Вы можете просто использовать BufferedReader и отказаться от DataInputStream. Вы могли бы также использовать PrintWriter вместо DataOutputStream.

Что-то вроде этого:

    out = new PrintWriter( socket.getOutputStream(), true );

а затем:

    out.println( "Time is..." );

Надеюсь, что это поможет.

  • 0
    Большое спасибо за то, что нашли время ответить. Это помогает, но это не то, что я после. Кажется, что мой клиент подключен только тогда, когда он хочет отправить данные, следовательно, он не получит данные после того, как клиент отправил «время». Я думаю, что мне нужно, чтобы клиент зацикливался, ожидая поступления данных. Разве это не сработает, так как я чувствую, что сокеты не могут передавать и получать одновременно? ура снова
  • 0
    Да, вы должны также зациклить клиента. Вы отправляете что-то на сервер и сразу читаете из потока. Это будет ждать входящих данных. Удачи ;)
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню