2010-11-15 132 views
4

我的目標是從python socket向java socket發送消息。我確實看到了上面提到的資源。不過,我正在努力使Python客戶端與Java服務器交談。主要是因爲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; 

OUTPUT ::

Python的控制檯(客戶端) :

發送(類型q或Q退出):abcd(按ENTER)

SEND(TYPE q或Q表示退出):EFGH(按壓ENTER)

SEND(TYPE q或Q表示退出):Q(按ENTER鍵)

ON Java控制檯(服務器):

TCPSERVER等待客戶端的5000端口

客戶/127.0.0.1:1335 IS連

收到:abcdefghq

+0

EOL是EOL( '\ n') - 我認爲你需要發佈裸造成你的錯誤的最小代碼 – KevinDTimm 2010-11-15 14:27:33

+0

我忘了添加,我正在處理TCP。 – 2010-11-16 05:18:30

+0

只是一個建議的話:String fromclient;在那裏分配的效率較低。在這裏分配它:String fromclient = inFromClient.readLine();除此之外,代碼非常好。 – 2011-04-20 18:08:31

回答

6

您需要添加\n結束數據...

即:

client_socket.send(data + '\n') 
+0

你救了我的一天! – 2018-01-02 13:13:44

1

ya..you需要在Python客戶端的字符串末尾添加 '\ n' ... .. 這裏是一個例子... 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 Client & Java TCP Server

1

這裏是同一個工作代碼: 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 
相關問題