Связь между клиентом Python и сервером Java - PullRequest
4 голосов
/ 15 ноября 2010

Моя цель - отправить сообщение из python socket в java socket.Я посмотрел на ресурс, упомянутый выше.Однако я изо всех сил пытаюсь заставить клиента Python общаться с сервером Java.В основном потому, что (конец строки) в python отличается от java.

скажем, я пишу из клиента Python: сообщение 1: сообщение abcd 2: сообщение efgh 3: q (выйти)

На сервере Java: я получаю сообщение 1: abcdefghq, за которым следует исключение, потому что клиент python закрыл сокет с конца.

Может кто-нибудь предложить решение для согласованного разговора между Java и Python.

Ссылка, которую я использовал: http://www.prasannatech.net/2008/07/socket-programming-tutorial.html

Обновление : я забыл добавить, я работаю над TCP.

Мой код JAVA выглядит следующим образом: (серверсокет)

String fromclient;

ServerSocket Server = new ServerSocket (5000);

System.out.println ("TCPServer Waiting for client on port 5000");

while(true) 
{
    Socket connected = Server.accept();
    System.out.println( " THE CLIENT"+" "+ connected.getInetAddress() +":"+connected.getPort()+" IS CONNECTED ");

    BufferedReader inFromClient = new BufferedReader(new InputStreamReader (connected.getInputStream()));

    while ( true )
    {
        fromclient = inFromClient.readLine();

        if ( fromclient.equals("q") || fromclient.equals("Q") )
        {
            connected.close();
            break;
        }
        else
        {
            System.out.println( "RECIEVED:" + fromclient );
        } 
    }
}

Мой код PYTHON: (Клиентский сокет)

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("localhost", 5000))

while 1:

    data = raw_input ( "SEND( TYPE q or Q to Quit):" )
    if (data <> 'Q' and data <> 'q'):
        client_socket.send(data)
    else:
        client_socket.send(data)
        client_socket.close()
        break;

ВЫХОД ::

НА ПИТОННОЙ КОНСОЛЕ (Клиент):

ОТПРАВИТЬ (ТИП q или Q для выхода): abcd (нажатие ENTER)

ОТПРАВИТЬ (ТИП q или Q для выхода): efgh (нажатие ENTER)

ОТПРАВИТЬ (TYPE q или Q для выхода)): q (нажатие ENTER)

НА JAVA-КОНСОЛЕ (Сервер):

TCPServer Ожидание клиента на порту 5000

КЛИЕНТ /127.0.0.1: 1335 ПОДКЛЮЧЕНО

ПОЛУЧЕНО: abcdefghq

Ответы [ 4 ]

7 голосов
/ 19 января 2011

Вам нужно добавить \n в конец данных ...

т.е. :

client_socket.send(data + '\n')
1 голос
/ 23 апреля 2016

вот рабочий код для того же: Jserver.java

import java.io.*;
import java.net.*;
import java.util.*;
public class Jserver{
public static void main(String args[]) throws IOException{
    ServerSocket s=new ServerSocket(5000);

    try{
        Socket ss=s.accept();
        PrintWriter pw = new PrintWriter(ss.getOutputStream(),true);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader br1 = new BufferedReader(new InputStreamReader(ss.getInputStream()));
        //String str[20];
        //String msg[20];
        System.out.println("Client connected..");
        while(true)
        {
            System.out.println("Enter command:");
            pw.println(br.readLine());
            //System.out.println(br1.readLine());
        }
    }
    finally{}
    }
}

Client.py

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 5000                # Reserve a port for your service.

s.connect((host, port))
while 1:
    print s.recv(5000)
    s.send("message processed.."+'\n')

s.close 
1 голос
/ 21 апреля 2013

да ... вам нужно добавить '\ n' в конце строки в клиенте Python ..... вот пример ... PythonTCPCLient.py

`

#!/usr/bin/env python

import socket

HOST = "localhost"
PORT = 8080

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))

sock.sendall("Hello\n")
data = sock.recv(1024)
print "1)", data

if ( data == "olleH\n" ):
    sock.sendall("Bye\n")
    data = sock.recv(1024)
    print "2)", data

    if (data == "eyB}\n"):
        sock.close()
        print "Socket closed"

`

Теперь вот код Java: JavaServer.java `

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

class JavaServer {
    public static void main(String args[]) throws Exception {
        String fromClient;
        String toClient;

        ServerSocket server = new ServerSocket(8080);
        System.out.println("wait for connection on port 8080");

        boolean run = true;
        while(run) {
            Socket client = server.accept();
            System.out.println("got connection on port 8080");
            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(client.getOutputStream(),true);

            fromClient = in.readLine();
            System.out.println("received: " + fromClient);

            if(fromClient.equals("Hello")) {
                toClient = "olleH";
                System.out.println("send olleH");
                out.println(toClient);
                fromClient = in.readLine();
                System.out.println("received: " + fromClient);

                if(fromClient.equals("Bye")) {
                    toClient = "eyB";
                    System.out.println("send eyB");
                    out.println(toClient);
                    client.close();
                    run = false;
                    System.out.println("socket closed");
                }
            }
        }
        System.exit(0);
    }
}

` Справка: Python TCP-клиент и Java TCP-сервер

0 голосов
/ 23 января 2017

Я знаю, что уже поздно, но специально для вашего случая я бы рекомендовал RPC-вызовы RabbitMQ. У них есть много примеров в сети на Python, Java и других языках:

enter image description here

https://www.rabbitmq.com/tutorials/tutorial-six-java.html

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