2011-06-05 4 views
1

Bonjour, je suis très nouveau dans la programmation java et je suis vraiment bloqué pour obtenir un serveur de socket et un client fonctionnant comme je le souhaite.Aide serveur de sockets Java

Le problème est im avoir ...

serveur:

Im regardant la sortie du client et une fois client imprime « TIME » le serveur renvoie un message par exemple « le temps est .. ". Le serveur le fait mais pas tout de suite il semble l'envoyer la deuxième fois que vous envoyez un message du client.

Est-ce parce que le client n'est peut-être pas connecté tout le temps?

Im assez sûr que cette méthode est fausse quelqu'un peut-il me donner un conseil.

Toute aide serait géniale.

Luke

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(); 
    } 
    } 
    } 
    } 
    } 
    } 

Le client Android

UPDATE, je pense que le problème est avec le client que d'être connecté lorsque vous envoyez un message. Comment ai-je une boucle de lecture ici qui n'affectera pas quand j'envoie des données à partir du client.

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(); 
} 
} 
} 
}}; 
} 

Répondre

3

Après la ligne dataOutputStream.writeUTF(), écrivez dataOutputStream.flush();. Cela enverra toutes les données à travers.

0

Il semble que vous lisez le flux pour sortir le message.

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

Ainsi, la commande a été retirée du flux lorsque vous essayez d'exécuter

String line = in.readLine(); 

Vous devriez essayer de lire la commande du flux dans une variable avant la sortie du message, puis vérifier si cette La chaîne contient "TIME".

Pourquoi utiliser deux méthodes différentes pour lire le flux? Vous pouvez simplement utiliser BufferedReader et ignorer DataInputStream. Vous pouvez aussi utiliser PrintWriter au lieu de DataOutputStream.

Quelque chose comme ceci:

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

puis:

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

Hope this helps.

+0

Merci beaucoup d'avoir pris le temps de répondre. Cela aide bien que ce n'est pas ce qui après. Il semble que mon client est connecté seulement quand il veut envoyer des données d'où il ne recevra pas les données après que le client a envoyé "temps". Je pense que j'ai besoin que le client fasse une boucle en attendant les données entrantes. Est-ce que cela ne fonctionnera pas comme je me sens des douilles ne peux pas transmettre et recevoir en même temps? Bravo encore – Luke

+0

Oui, vous devez également boucler le client. Vous envoyez quelque chose au serveur immédiatement lu dans le flux. Cela va attendre les données entrantes.Bonne chance;) – Baldur

+0

J'ai maintenant mis en place mon code client de base, pouvez-vous jeter un coup d'œil et peut-être suggérer comment je peux adapter ce code pour avoir une boucle de lecture et être capable d'écrire des données. Merci encore pour votre temps. – Luke