Ошибка в программе Simple Socket - PullRequest
1 голос
/ 16 февраля 2012

Я не могу отправить данные во второй экземпляр.Сервер просто бесконечно ждет данных клиента Вот мой пример кода сервера:

ServerSocket serv = new ServerSocket(6789);
    Socket soc = serv.accept();
    System.out.println("waiting for client's input");       
    BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream()));
    DataOutputStream out = new DataOutputStream(soc.getOutputStream());
    String indata=in.readLine();
    System.out.println("The client says: "+indata+"\n Send them some data: ");
    String datum="demodata";        
    out.writeBytes(datum);
    System.out.println("Data sent");

Пример клиента:

ocket soc = new Socket("localhost",6789);

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedReader in = new BufferedReader(new InputStreamReader(soc.getInputStream()));
    DataOutputStream out = new DataOutputStream(soc.getOutputStream());     
    System.out.println("Connected to: "+soc.getLocalAddress() +"\nEnter data to be sent: ");        
    String outdata = br.readLine(); //take input    
    out.writeBytes(outdata); // send 
    String indata=in.readLine(); //read
    System.out.println("Data Sent! Now reading data from server "+indata)

Пожалуйста, сообщите мне мою проблему!Заранее спасибо

Ответы [ 4 ]

1 голос
/ 16 февраля 2012

Вот пример кода. Посмотрите, работает ли это для вас. Вы можете остановить код сервера с помощью Ctrl-C, и клиент будет ожидать повторного появления сервера.

Кроме того, вы можете остановить сервер, и он будет ждать, пока клиент не появится снова. Основной метод имеет синтаксис

package test;

import java.io.*;
import java.net.*;

public class SocketIPC{
    public PrintWriter out;
    BufferedReader in;
    Socket socket = null;
    ServerSocket serverSocket = null;
    StringBuffer sb;
    int port;

    public SocketIPC(int port) throws Exception{
        this.port = port;
    }

    public void send(String msg){
        sb.append(msg+"\n");
    }

    public void flush(){
        out.write(sb.toString());
        sb = new StringBuffer();
        out.flush();
    }

    public String recv() throws Exception{
            return in.readLine();
    }

    public void setIO() throws Exception{
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        sb = new StringBuffer();
    }

    public void serverLoop() throws Exception{
        serverSocket = new ServerSocket(port);
        while(true){
            socket = serverSocket.accept();
            setIO();

            int count = 0;
            System.out.println("Connected.");
            while(true){
                count += 1;
                for(int j=0; j<100; j++)
                    send("+");
                send(String.format(".%d", count));
                flush();
                Thread.sleep(1000L);
                String msg = recv();
                if (msg!=null)
                    System.out.println(msg);
                else
                    break;// socket connection is broken
            }
            }
    }

    public void clientLoop() throws Exception{
        while(true){
            while(socket==null){
                try{
                    socket = new Socket("localhost", port);
                }catch(Exception e){
                    System.out.println("Waiting for server.");
                    Thread.sleep(1000L);
                }
                }
            setIO();

            System.out.println("Connected.");
            while(true){
                String msg = recv();
                if (msg==null){
                    socket.close();
                    socket = null;
                    break;
                }
                if (msg.charAt(0)=='.'){
                    int idx = Integer.parseInt(msg.substring(1));
                        System.out.println(idx);
                    send(Integer.toString(idx));
                    Thread.sleep(2000);
                    flush();
                }
            }
        }
    }

    public static void main(String[] args){
        if (args.length != 1){
            System.out.println("Server invocation: java test.SocketIPC s");
            System.out.println("Client invocation: java test.SocketIPC c");
        }

        int port = 32000;
        try{
            SocketIPC fip = new SocketIPC(port);
            if (args[0].equals("s")){
                System.out.println("Server started");
                fip.serverLoop();
            }else{
                System.out.println("Client started");
                fip.clientLoop();
            }
            System.out.println("Done");
        }catch(Exception e){
            System.out.println(e.getMessage());
            e.printStackTrace();
            System.exit(1);
        }
    }
}
1 голос
/ 16 февраля 2012

Ваш клиент не отправляет символ новой строки в выводе, который он пишет. И ваш сервер ожидает эту новую строку, неявно, вызывая readLine в BufferedReader (который ожидает завершающий символ новой строки в данных, которые он читает с помощью этого метода). После вызова out.writeBytes() добавьте следующее в код клиента и сервера:

out.newLine();
out.flush();

Кроме того, вместо этого вы можете использовать PrintWriter и просто использовать его метод println.

1 голос
/ 16 февраля 2012

Ответ довольно прост.Вы хотите обмениваться строками текста между сервером и клиентом.

Правильная часть на стороне сервера:

String indata=in.readLine();

Неправильная часть на стороне клиента:

out.writeBytes(outdata); // send 

Я не тестировал код, но, похоже, вы просто отправляете некоторые данные, и ваша серверная сторона ожидает появления \n (escape-последовательности новой строки).

Вариант 1:
Создайте PrintWriter и вызовите соответствующий метод println.

Вариант 2:
Добавить новую строку (\n) вручную.

После этого readLine на стороне сервера распознает строку, оканчивающуюся на \n, и продолжит работу.

1 голос
/ 16 февраля 2012

Я думаю, что вы забыли сбросить поток вывода.

Добавьте строку: out.flush() сразу после out.writeBytes() на стороне сервера и клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...