java中通过套接字发送字符串的问题

java中通过套接字发送字符串的问题,java,sockets,Java,Sockets,大家好,我在java中通过套接字发送2个字符串时遇到问题。 我有一个用户界面,可以从客户端获取用户名和密码并将其发送到服务器。我的问题分为2部分:1-我无法在我的服务器中获取字符串用户名2-当客户端发送用户名时,套接字在发送密码之前关闭这里是我的代码,请帮助我。 主要目的是从用户界面(客户端)获取两个字符串的用户名和密码,并通过套接字将它们发送到服务器 服务器: package finalproject; import java.io.EOFException; import java.io.I

大家好,我在java中通过套接字发送2个字符串时遇到问题。 我有一个用户界面,可以从客户端获取用户名和密码并将其发送到服务器。我的问题分为2部分:1-我无法在我的服务器中获取字符串用户名2-当客户端发送用户名时,套接字在发送密码之前关闭这里是我的代码,请帮助我。 主要目的是从用户界面(客户端)获取两个字符串的用户名和密码,并通过套接字将它们发送到服务器

服务器:

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

}

}
但我在我的服务器中的输入是:

  java.io.InputStreamReader@171fc7e
  input is : java.io.InputStreamReader@171fc7e   

根据EJP编辑正确备注:

添加新行分隔符:

writer.write(name.getText() + System.lineSeparator());
writer.write(pass.getText());
writer.flush();
替换此项:

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


根据EJP编辑正确备注:

添加新行分隔符:

writer.write(name.getText() + System.lineSeparator());
writer.write(pass.getText());
writer.flush();
替换此项:

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


InputStreamReader.toString()从读取器读取并打印已读取内容的原因是什么?阅读javadoc。Google for Java IO教程。我的方法正确与否。我通过套接字将字符串发送到服务器,并通过InputStreamReader在服务器中读取它。有什么问题?请您进一步解释。我不明白。你从来没有在读卡器上调用read(),所以你从来没有在服务器上读过任何东西。再次阅读InputStreamReader的javadoc,以及GoogleforJavaIO教程,学习如何从阅读器中读取。StringReader读取字符串。不是从套接字输入流。那毫无意义。StringWriter允许写入字符串,而不是套接字输出流。所以再次说明,这是没有意义的。您读取(),但完全忽略了该方法返回的内容。同样,请阅读google for Java IO教程,并了解如何从读取器中读取内容。是什么让InputStreamReader.toString()能够从读取器中读取内容并打印已读取的内容?阅读javadoc。Google for Java IO教程。我的方法正确与否。我通过套接字将字符串发送到服务器,并通过InputStreamReader在服务器中读取它。有什么问题?请您进一步解释。我不明白。你从来没有在读卡器上调用read(),所以你从来没有在服务器上读过任何东西。再次阅读InputStreamReader的javadoc,以及GoogleforJavaIO教程,学习如何从阅读器中读取。StringReader读取字符串。不是从套接字输入流。那毫无意义。StringWriter允许写入字符串,而不是套接字输出流。所以再次说明,这是没有意义的。您读取(),但完全忽略了该方法返回的内容。再一次,谷歌Java IO教程,并阅读如何从读者那里阅读。谢谢。但是我想从我的客户端获取用户名和密码,如果我逐字读取它们,我无法理解应该读取整个字符串的用户名字符和密码字符。我的主要问题是我想在服务器中获取字符串。我修改了代码以添加分隔符并拆分结果。这样使用起来会更简单行终止符作为分隔符,只需在接收器处读取行即可。谢谢。但是我想从我的客户端获取用户名和密码,如果我逐字读取它们,我无法理解应该读取整个字符串的用户名字符和密码字符。我的主要问题是我想在服务器中获取字符串。我修改了代码以添加分隔符并拆分结果。这样使用起来会更简单行终止符作为分隔符,只需在接收器处读取行。