【问题标题】:Client server don't communicate客户端服务器不通信
【发布时间】:2013-11-23 17:27:33
【问题描述】:

我有客户端服务器应用程序,当我运行服务器时,我从服务器类中得到我打印的内容,但是当我运行客户端类时,即使建立连接也没有任何反应 但似乎 Client 类没有收到来自服务器的任何消息

这是我的服务器代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {
ServerSocket provider;
Socket clientsocket;
OutputStream out;
InputStream in;
InetAddress clientAddress;
StringBuilder sb;
BufferedReader br;
String msg="";
Server(){
}
public void Communicate()
{
    try {

        provider=new ServerSocket(2013);
        System.out.println("Server Waiting for connections");
        clientsocket=provider.accept();
        System.out.println("incoming connection from ");
        clientAddress=clientsocket.getInetAddress();
        //System.out.println("Client Name"+clientAddress.getHostName());
        System.out.println("Client Address "+clientAddress.getHostAddress());
        out=clientsocket.getOutputStream();
        in=clientsocket.getInputStream();
        sendmsg("connection success");
        do
        {
            msg=read_instream(in);
            System.out.println("client say"+msg);
            if(msg.equals("bye"))
            {
                sendmsg(msg);
                clientsocket.close();
                in.close();
                out.close();
            }
        }
        while(!msg.equals("bye"));


    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
private void sendmsg(String msg) throws IOException
{

    out.write(msg.getBytes());
    out.flush();
}
private String read_instream(InputStream in) throws IOException
{
    br=new BufferedReader(new InputStreamReader(in));
    sb=new StringBuilder();
    while (br.readLine()!=null) 
        sb.append(br.readLine());   

    return sb.toString();
}

public static void main(String[] args){
    Server provider=new Server();
    while(true)
        provider.Communicate();
}

}

和客户端代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {
    Socket client;
    String msg="give me the last degree";
    OutputStream out;
    InputStream in;
    StringBuilder sb;
    BufferedReader br;
    public void Communicate()
    {
        try {
            client=new Socket("localhost",2013);
            out=client.getOutputStream();
            in=client.getInputStream();
            System.out.println("Messege from server:"+read_instream(in));
            while (!msg.equals("bye"))
            {
                msg=read_instream(in);
                System.out.println("server say"+msg);
                sendmsg("hey from client");
                msg="bye";
                sendmsg(msg);
            }
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private String read_instream(InputStream in) throws IOException
    {
        br=new BufferedReader(new InputStreamReader(in));
        sb=new StringBuilder();
        while (br.readLine()!=null) 
            sb.append(br.readLine());   

        return sb.toString();
    }
    private void sendmsg(String msg) throws IOException
    {

        out.write(msg.getBytes());
        out.flush();
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Client requester=new Client();
        requester.Communicate();


    }

}

【问题讨论】:

    标签: java sockets client-server


    【解决方案1】:

    您的 read_instream 方法将阻塞,直到流关闭。 br.readline() 在“到达流的末尾”之前不会返回 null(请参阅javadoc)。您的服务器类发送一条消息,刷新它,但永远不会结束流。

    编辑:发生的事情仍然是一个阻塞问题。您的服务器仅在收到来自客户端的消息后才关闭到客户端的输出流。但是,服务器上的 read_instream() 方法等待客户端关闭流。客户端永远不会关闭它,因为它仍在等待服务器首先关闭。所以一种选择是在 sendmsg() 方法中关闭输出流。但是,这将不允许发送任何其他消息。您还可以将 read_instream() 方法更改为在每行之后返回,而不是让它等待流结束。

    阅读Oracle docs 的客户端/服务器教程。他们使用第二个选项在服务器和客户端之间进行长时间运行的对话:不要等待 read_instream() 方法中的流结束。在本教程的最后,他们将简要介绍如何支持多个客户端。

    【讨论】:

    • sry 我没有得到你的答案你能告诉我应该在代码上做什么吗?
    • 每次使用后我都关闭了,但没有任何变化
    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 2011-09-05
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多