我是新的Java套接字,我見過這麼多的例子,但我不明白如何將參數從服務器傳遞到客戶端,反之亦然。我的目標是傳遞一個對象,這就是爲什麼我使用對象I/O流。如何在Java服務器客戶端通過套接字傳遞對象
我必須分類服務器和播放器。
public class Server extends Thread{
public static final int TEST = 165;
ServerSocket serverSocket;
InetAddress address;
Player playerWhite;
public Server() {
start();
}
@Override
public void run() {
try
{
address = InetAddress.getLocalHost();
serverSocket = new ServerSocket(6000);
playerWhite = new Player();
System.out.println("server waits for players");
playerWhite.socket = serverSocket.accept();
playerWhite.start();
sendTestMessage(playerWhite);
}
catch (IOException ex)
{
Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void sendTestMessage(Player player) throws IOException
{
ObjectOutputStream testToClient = new ObjectOutputStream(player.socket.getOutputStream());
testToClient.write(TEST);
testToClient.flush();
}
和玩家等級:
public class Player extends Thread {
Socket socket;
Player() throws IOException
{
socket = new Socket(InetAddress.getLocalHost(), 6000);
}
@Override
public void run() {
try {
listenTestStream();
}
catch (IOException | ClassNotFoundException ex)
{
Logger.getLogger(CheckerPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void listenTestStream() throws IOException, ClassNotFoundException
{
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
int message = ois.readInt();
//To test
System.out.println("Server listened: " + message);
}
我執行它作爲其他類中創建一個服務器對象。
當我測試這個應用程序時,我看到有時客戶端比服務器更快。是否有可能讓他「等待」服務器響應? 感謝您的回覆。
編輯1:題解:
從外面,我們應該創建:
Player player = new Player(); // (class player extends from Thread) player.start();
,並刪除播放器變量 - 是沒有必要的,我們只需要插座這樣: 服務器:
Socket playerWhiteSocket
public void run() {
try
{
serverSocket = new ServerSocket(PORT);
playerWhiteSocket = serverSocket.accept();
sendMessage(playerWhiteSocket, "Hello");
}
catch(IOException | ClassNotFoundException ex)
{}
public void sendMessage(Socket socket, String message) throws IOException
{
ObjectOutputStream testToClient = new ObjectOutputStream(socket.getOutputStream());
testToClient.writeObject(message);
testToClient.flush();
}
在播放器類,則需要獲得方法:
public String receiveMessage() throws IOException, ClassNotFoundException
{
//socket is a variable get from Player class socket = new Socket("severHost", PORT);
ObjectInputStream messageFromServer = new ObjectInputStream(socket.getInputStream());
String message = (String) messageFromServer.readObject();
return message;
}
您使用'write'寫入一個字節,並且應該通過'read()'接收。但是你'readInt()'。嘗試'writeInt'而不是'write'。另外,你爲什麼要發送對象?似乎是浪費帶寬。只需發送所需的數據。在從輸入流讀取數據時等待數據是自動的。 –
我想發送一個「移動」類對象,我試圖先用int來完成,但是你的迴應沒有解決問題。 – rudald
一般來說,你應該避免在java多線程中擴展Thread類:http://stackoverflow.com/questions/541487/implements-runnable-vs-extends-thread – avgvstvs