2017-06-30 3 views
0

Hallo allerseits habe ich Probleme mit dem Senden von 2 Strings über Socket in Java. Ich habe UI, die Benutzername und Passwort vom Client erhalten und an den Server senden. mein Problem machen 2 Teil: 1-ich kann nicht die Zeichenfolge Benutzername in meinem Server 2- wenn der Client den Benutzernamen senden die Steckdose ist in der Nähe, bevor das Passwort hier ist mein Code bitte mir helfen. der Hauptzweck ist, 2 Zeichenfolgen Benutzername und Passwort von UI (Client) zu erhalten und sie von Socket an Server zu senden.Probleme mit dem Senden von String über Socket in Java

Server:

package finalproject; 
import java.io.EOFException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server 
{ 
ServerSocket listener; 
Socket socket; 
OutputStream out ; 
InputStream in;; 
InputStreamReader reader; 
OutputStreamWriter writer; 
String massage; 

public void connectserver() throws IOException 
{ 
    listener = new ServerSocket(9097); 
    System.out.println("Server is running on port 9097 ..."); 
} 
public void waitforclient() throws IOException 
{ 
    socket = listener.accept(); 
System.out.println("A new client connected to the server"); 
} 
public void startstreamsserver() throws IOException 
{ 
    in = socket.getInputStream(); 
    out = socket.getOutputStream(); 
writer = new OutputStreamWriter(out); 
    reader = new InputStreamReader(in); 
    System.out.println("Server streams are ready"); 
} 
public void closestreamsserver() throws IOException 
{ 
    writer.close(); 
    reader.close(); 
} 
public void getinfoserver() throws IOException 
{ 
    try 
    { 
     reader.read(); 
     System.out.println(reader); 
     System.out.println("input is : " + reader.toString());  
    } 
    catch(IOException IOE) 
    { 
      IOE.printStackTrace();//if there is an error, print it out 
    }  
} 
} 

Auftraggeber:

package finalproject; 

import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.io.EOFException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class Client 
{ 
Socket socket; 
OutputStream out1; 
InputStream in1; 
OutputStreamWriter writer; 
InputStreamReader reader; 
String massage; 
JFrame frame; 
BorderLayout blayout; 
JButton center; 
JButton south; 
FlowLayout fLoyout; 
JLabel jb1; 
JTextField name; 
JLabel jb2; 
JTextField pass; 
JLabel jb7; 
JPanel cpanel; 
JPanel spanel; 

public void connectclient() throws IOException 
{ 
    socket = new Socket("localhost", 9097); 
    System.out.println("connect to server on port 9097"); 
} 
public void startstreamsclient() throws IOException 
{ 
    in1 = socket.getInputStream(); 
    out1 = socket.getOutputStream(); 
writer = new OutputStreamWriter(out1); 
    reader = new InputStreamReader(in1); 
    System.out.println("Client streams are ready"); 
}  
public void closestreamsclient() throws IOException 
{ 
    writer.close(); 
    reader.close(); 
} 
public void loginformclient() 
{ 
    frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setSize(500, 600); 
    blayout = new BorderLayout(); 
    center = new JButton(); 
    south = new JButton(); 
    frame.setLayout(blayout); 
    fLoyout = new FlowLayout(FlowLayout.CENTER); 
    center.setLayout(fLoyout); 
    south.setLayout(fLoyout); 
    jb1 = new JLabel("Username :"); 
    name = new JTextField(20); 
    center.add(jb1); 
    center.add(name); 
    jb2 = new JLabel("Password :"); 
    pass = new JTextField(30); 
    center.add(jb2); 
    center.add(pass); 

    jb7 = new JLabel("Save"); 
    south.add(jb7); 

    cpanel = new JPanel(); 
    cpanel.add(center); 
    spanel = new JPanel(); 
    south.addActionListener((ActionEvent ae) -> { 
     try 
     { 
      writer.write(name.getText()); 
      writer.flush(); 
      writer.write(pass.getText()); 
      writer.flush(); 
      writer.close(); 
     } 
     catch (IOException ex) 
     { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    }); 
    spanel.add(south); 
    cpanel.setLayout(new BoxLayout(cpanel, BoxLayout.Y_AXIS)); 
    frame.add(cpanel, BorderLayout.CENTER); 
    frame.add(spanel, BorderLayout.SOUTH); 

    frame.pack(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
} 

} 

und meine Hauptklasse:

package finalproject; 

import java.io.IOException; 
import javax.swing.JFrame; 

public class Finalproject 
{ 
public static void main(String[] args) throws IOException 
{ 
    //build Server & Client 
    Server server = new Server(); 
    Client client = new Client(); 

    //Start Server & Client 
    server.connectserver(); 
    client.connectclient(); 

    //Server wait for new connection 
    server.waitforclient(); 

    //start the Streams 
    client.startstreamsclient(); 
    server.startstreamsserver(); 

    //Client send login information to Server 
    client.loginformclient(); 

    //Server get information 
    server.getinfoserver(); 

} 

} 

aber die meine Eingaben in meinem Server sind:

[email protected] 
    input is : [email protected] 
+1

Was Sie, was macht, dass Input. toString() liest aus dem Reader und druckt was gelesen wurde? Lies das Javadoc. Google für Java IO-Tutorial. –

+0

ist meine Methode wahr oder nicht. Ich sende meine Zeichenfolge an meinen Server von einem Socket und lese es in Server von InputStreamReader was ist es Problem könnten Sie es mehr erklären. Ich verstehe nicht. – alish

+4

Sie rufen nie read() auf dem Reader, also nein, Sie lesen nie etwas auf dem Server. Lesen Sie erneut das Javadoc von InputStreamReader und google für Java IO, um zu erfahren, wie man von einem Reader liest. –

Antwort

2

bearbeitet auf EJP korrekte Bemerkung Basierend:

neue Zeilentrennzeichen hinzufügen:

writer.write(name.getText() + System.lineSeparator()); 
writer.write(pass.getText()); 
writer.flush(); 

diese ersetzen:

reader = new InputStreamReader(in); 
System.out.println("Server streams are ready"); 

mit:

BufferedReader in = new BufferedReader(reader); 
String username= in.readLine(); 
String password = in.readLine(); 
+1

danke. aber ich möchte Benutzernamen und Passwort von meinem Client bekommen und wenn ich sie Zeichen für Zeichen lese kann ich nicht verstehen, welche Zeichen für den Benutzernamen und welche Zeichen für das Passwort ich die gesamte Zeichenfolge lesen sollte. – alish

+1

mein Hauptproblem ist ich möchte String in meinem Server bekommen. – alish

+0

Ich änderte den Code, um ein Trennzeichen hinzuzufügen und das Ergebnis zu teilen – user648026