2017-06-30 164 views
0

嗨,大家好,我在通過java中的套接字發送2個字符串時遇到問題。 我有從客戶端獲取用戶名和密碼並將其發送到服務器的用戶界面。我的問題使2部分:1 - 我無法獲得我的服務器中的字符串用戶名2-當客戶端發送用戶名時,套接字在發送密碼之前關閉這裏是我的代碼請幫助我。 主要目的是從UI(客戶端)獲取2個字符串的用戶名和密碼,並通過套接字將它們發送到服務器。在java中通過套接字發送字符串的問題

服務器:

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 
    }  
} 
} 

客戶:

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

} 

和我的主類:

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

} 

} 

但我在我的服務器輸入是:

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

是什麼讓你東西的InputStreamReader。 toString()從閱讀器讀取並打印已讀取的內容?閱讀javadoc。 Google for Java IO教程。 –

+0

是我的方法是否正確。我通過套接字將我的字符串發送到我的服務器,並通過InputStreamReader在服務器中讀取它,那麼它是什麼問題,你能解釋一下嗎?我不明白。 – alish

+4

你永遠不會在閱讀器上調用read(),所以不,你永遠不會讀取服務器上的任何東西。再次,閱讀InputStreamReader的javadoc和google for Java IO教程,以瞭解如何從Reader讀取數據。 –

回答

2

編輯基於EJP正確備註:

添加新的行分隔符:

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

替換此:

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

有:

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

謝謝。但我想從我的客戶端獲取用戶名和密碼,如果我按字符讀取它們的字符,我無法理解哪些字符用於用戶名和哪些字符的密碼我應該讀取整個字符串。 – alish

+1

我的主要問題是我想在我的服務器中獲取字符串。 – alish

+0

我修改了代碼以添加分隔符並拆分結果 – user648026