簡體   English   中英

客戶端服務器無法通信

[英]Client server don't communicate

當我運行服務器時,我有客戶端服務器應用程序,我從服務器類中獲取了打印的內容,但是當我運行客戶端類時,即使建立了連接也沒有任何反應,但是客戶端類似乎沒有從服務器接收任何消息

這是我的服務器代碼

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


    }

}

您的read_instream方法將阻塞,直到流關閉。 br.readline()在“到達流的末尾”之前不會返回null(請參閱javadoc )。 您的服務器類發送一條消息,將其刷新,但永不結束流。

編輯:發生了什么仍然是一個阻塞的問題。 您的服務器僅在接收到來自客戶端的消息后,才關閉到客戶端的輸出流。 但是,服務器上的read_instream()方法等待客戶端關閉流。 客戶端永遠不會關閉它,因為它首先仍然在等待服務器關閉。 因此,一種選擇是在sendmsg()方法中關閉輸出流。 但是,這將不允許發送任何其他消息。 您還可以將read_instream()方法更改為在每一行之后返回,而不要等待流的結尾。

閱讀Oracle文檔中的客戶端/服務器教程。 他們使用第二個選項在服務器和客戶端之間進行長時間的對話:不要在read_instream()方法中等待流結束。 在本教程的最后,他們將簡要介紹如何支持多個客戶端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM