2013-10-11 60 views
1

我一直堅持這一段時間了。我正嘗試使用PHP將數據發送到Java服務器。當我加載Bukkit插件,它停止加載時,我調用這個函數:Java Socket偵聽器問題?

public void SocketListen() 
{  

    String clientSentence; 
    String capitalizedSentence; 

    try 
    { 

     ServerSocket welcomeSocket = new ServerSocket(25566); 

     while(true) 
     { 
      Socket connectionSocket = welcomeSocket.accept(); 
      BufferedReader inFromClient = 
       new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
      DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); 
      clientSentence = inFromClient.readLine(); 
      System.out.println("Received: " + clientSentence); 
      capitalizedSentence = clientSentence.toUpperCase() + '\n'; 
      outToClient.writeBytes(capitalizedSentence); 
     } 
    } 
    catch(IOException e) 
    { 
     getLogger().severe(e.toString()); 
    } 

} 

它告訴我,我做錯了什麼。我的PHP是:

<?php 
$host = "localhost"; 
$port = 25566; 
$data = 'test\n'; 

if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE) 
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()); 
else 
{ 
    echo "Attempting to connect to '$host' on port '$port'...<br>"; 
    if (($result = socket_connect($socket, $host, $port)) === FALSE) 
     echo "socket_connect() failed. Reason: ($result) " . socket_strerror(socket_last_error($socket)); 
    else { 
     echo "Sending data...<br>"; 
     socket_write($socket, $data, strlen($data)); 
     echo "OK<br>"; 

     echo "Reading response:<br>"; 
     while ($out = socket_read($socket, 2048)) { 
      echo $out; 
     } 
    } 
    socket_close($socket);  
} 
?> 

我在做什麼錯?基本上,我只需要PHP服務器發送「Hello」,然後Java客戶端使用getLogger()。info(data)將其吐出。

此外,我需要端口轉發25566在客戶端或服務器與PHP?它們都使用相同的外部IP在本地網絡上託管。

+0

我的世界沒有使用端口:25565嗎? @ user2310289 –

+0

你在一行寫東西? – Dru

+0

抱歉需要戴上眼鏡。 –

回答

0

這可能是由於一個事實,即循環永遠不會停止:

while(true) 
    { 
     //code 

你可以使用我的Java服務器和客戶端所做的類:

ChatCleint

package com.weebly.foxgenesis.src; 
import java.net.*; 
import java.io.*; 

public final class ChatClient 
{ 
    private Socket socket = null; 
    private DataOutputStream streamOut = null; 
    private ChatClientThread client = null; 
    private String serverName = "localhost"; 
    private int serverPort = -1; 
    private final ChatReciever output; 

/** 
* Create a new ChatClient that connects to a given server and receives UTF-8 encoded messages 
* @param a Client class 
*/ 
public ChatClient(ChatReciever chatReciever) 
{ 
    output = chatReciever; 
    serverPort = chatReciever.getPort(); 
    serverName = chatReciever.getHost(); 
    connect(serverName, serverPort); 
} 

private void connect(String serverName, int serverPort) 
{ 
    output.handleLog("Establishing connection. Please wait ..."); 
    try 
    { 
     socket = new Socket(serverName, serverPort); 
     output.handle("Connected to chat server"); 
     open(); 
    } 
    catch(UnknownHostException uhe) 
    { 
     output.handleError("Host unknown: " + uhe.getMessage()); 
    } 
    catch(IOException ioe) 
    { 
     output.handleError("Unexpected exception: " + ioe.getMessage()); 
    } 
} 

/** 
* Sends a message to the server through bytes in UTF-8 encoding 
* @param msg message to send to the server 
*/ 
public void send(String msg) throws IOException 
{ 
    streamOut.writeUTF(msg); 
    streamOut.flush(); 
} 

/** 
* forces the ChatReciever to listen to a message (NOTE: this does not send anything to the server) 
* @param msg message to send 
*/ 
public void handle(String msg) 
{ 
    output.handle(msg); 
} 

private void open() throws IOException 
{ 
    streamOut = new DataOutputStream(socket.getOutputStream()); 
    client = new ChatClientThread(this, socket); 
} 

/** 
* tries to close 
*/ 
public void close() throws IOException 
{ 
    if (streamOut != null) 
     streamOut.close(); 
    if (socket != null) 
     socket.close(); 
} 

/** 
* closes the client connection 
*/ 
@SuppressWarnings("deprecation") 
public void stop() 
{ 
    if(client != null) 
     client.stop(); 
    client = null; 
} 

/** 
* checks if the ChatClient is currently connected to the server 
* @return Boolean is connected 
*/ 
public boolean isConnected() 
{ 
    return client == null ?(false) : (true); 
} 
} 

ChatServerThread

package com.weebly.foxgenesis.src; 



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

public final class ChatClientThread extends Thread 
{ 
    private Socket   socket = null; 
    private ChatClient  client = null; 
    private DataInputStream streamIn = null; 

    public ChatClientThread(ChatClient _client, Socket _socket) 
    { 
     client = _client; 
     socket = _socket; 
     open(); 
     start(); 
    } 
    public void open() 
    { 
     try 
     { 
      streamIn = new DataInputStream(socket.getInputStream()); 
     } 
     catch(IOException ioe) 
     { 
      System.out.println("Error getting input stream: " + ioe); 
      client.stop(); 
     } 
    } 
    public void close() 
    { 
     try 
     { 
      if (streamIn != null) streamIn.close(); 
     } 
     catch(IOException ioe) 
     { 
      System.out.println("Error closing input stream: " + ioe); 
     } 
    } 
    public void run() 
    { 
     while (true) 
     { 
      try 
      { 
       client.handle(streamIn.readUTF()); 
      } 
      catch(IOException ioe) 
      { 
       System.out.println("Listening error: " + ioe.getMessage()); 
       client.stop(); 
      } 
     } 
    } 
} 

ChatReciever

package com.weebly.foxgenesis.src; 

public interface ChatReciever 
{ 
    /** 
    * gets the IP address of the host 
    * @return String IP address 
    */ 
    public String getHost(); 

    /** 
    * gets the port of the host 
    * @return Integer port of host 
    */ 
    public int getPort(); 

    /** 
    * sends a message from the server to the implementing class 
    * @param msg message from the server 
    */ 
    public void handle(String msg); 

    /** 
    * sends an error to the implementing class 
    * @param errorMsg error message 
    */ 
    public void handleError(String errorMsg); 

    /** 
    * Sends a message to the log 
    * @param msg message to send 
    */ 
    public void handleLog(Object msg); 
}