得到的错误&在socket java中发送Data(String,Int)

时间:2017-07-02 15:13:11

标签: java sockets io

在每一个我有一个项目,从客户端获得一些Stringint,我想将它们发送到我的服务器。但我有问题得到这个。我什么也没做错。请帮帮我。

客户端:

//build a socket.
public void connectclient() throws IOException
{
    socket = new Socket("localhost", 9097);
    System.out.println("connect to server on port 9097");
}
public void startstreams() throws IOException , ClassNotFoundException      
{
in = socket.getInputStream();
out = socket.getOutputStream();
dos = new DataOutputStream(out);
dis = new DataInputStream(in);   
writer = new OutputStreamWriter(out);
reader = new InputStreamReader(in);
breader = new BufferedReader(reader);
bwriter = new BufferedWriter (writer);
w = new PrintWriter(out, true);
}
public void writeSocketMyJson(String n) throws IOException
{
   w = new PrintWriter(out, true);
   w.println(n);
   w.flush();
   w.close();
}

massage1 = "username";
//send username that get from login form to server.
public void sendusername() throws IOException
{
  writeSocketMyJson(massage1);
}

massage2 ="admin";
//send password that get from login form to server.
public void sendpassword() throws IOException
{
  writeSocketMyJson(massage2);
}

//send access level to server.
public void sendaccess(int l) throws IOException 
{
    dos.writeInt(l);
    dos.flush();
}
sendaccess(21);

服务器:

//build server.
public void connectserver() throws IOException
{
    listener = new ServerSocket(9097);
    System.out.println("Server is running on port 9097 ...");
}
//wait for new connection.
public void waitforclient() throws IOException
{
    socket = listener.accept();
System.out.println("A new client connected to the server");
}
public void startstreams() throws IOException
{
in = socket.getInputStream();
out = socket.getOutputStream(); 
dos = new DataOutputStream(out);
dis = new DataInputStream(in);    
writer = new OutputStreamWriter(out);
reader = new InputStreamReader(in);
bwriter = new BufferedWriter (writer);
breader = new BufferedReader (reader);
}
public String readSocket() throws IOException
{
        breader = new BufferedReader(reader);
        while (true)
        {   
            massage = new String();
            massage = breader.readLine();
            if (massage.equals(null) == false) 
            {
                break;
            }
        }
        return(massage);
}

//get username that client send it.
public String getusername() throws IOException, ClassNotFoundException
{ 
    try  
    {
       username = new String();
       username = readSocket();
       System.out.println("the username is : " + username);
    }
    catch(IOException IOE)
    {
            IOE.printStackTrace();//if there is an error, print it out
    } 
    return(username);
}

//get password that client send it.
public String getpassword() throws IOException, ClassNotFoundException
{ 
    try  
    {
        password = new String();
        password = readSocket();
        System.out.println("the password is : " + password);
    }
    catch(IOException IOE)
    {
            IOE.printStackTrace();//if there is an error, print it out
    }  
    return(password);
}

//get commend from client.
//admin or user send which commend 21-add new information 22-show information    
public int getaccess() throws IOException
{   
    System.out.println("server get access : " + dis.readInt());
    return(dis.readInt());
}

但是当我打电话给getpassword()时,我什么都没得到。 当我打电话给getaccess()时我什么都没得到。 为什么?请帮我。 我也有主要类来控制订单

主:

    //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
    server.startstreams();
    client.startstreams();

    client.sendusername();
    String msg1 =server.readSocket();

    client.sendpassword();
    String msg2 =server.readSocket();

    client.sendaccess();
    int n = getaccess();

1 个答案:

答案 0 :(得分:0)

你的代码充满了废话。你做的事情是

breader = new BufferedReader (reader);

public String readSocket() throws IOException
{
    breader = new BufferedReader(reader);

并且喜欢

w = new PrintWriter(out, true);

public void writeSocketMyJson(String n) throws IOException
{
   w = new PrintWriter(out, true);

并且喜欢

    password = new String();
    password = readSocket();

我建议你把它扔掉,从头开始,用java套接字的一些示例代码,其中有很多在interwebz上。

要记住的是,您不能只是假装套接字是常规流,并且您不能只在它上面创建BufferedReader。在任何给定时刻,您都需要确切地知道发送了多少字节,因此确切地知道要接收多少字节。

所以一般情况下,在发送端你不能写一个字符串,并期望在接收端使用行尾检测字符串的结尾。在发送端,您需要首先写入字符串的长度,作为32位int,所以在接收端,您知道您期望恰好4个字节包含随后的字符串的长度。然后,您可以读取构成字符串的确切正确的字节数。当然,不要忘记在java中,一个字符长2个字节。