【发布时间】:2015-12-12 18:40:59
【问题描述】:
在服务器上,当我获得新连接时 (serverSocket.accept()),
我将该连接套接字传递给一个名为 ServerPlayer.java 的类的实例,
它从一个线程延伸出来。
我还创建了一个 OutputObjectStream 和一个 InputObjectStream 并将它们传递给新的 ServerPlayer 实例,然后将 ServerPlayer 实例添加到 ArrayList 以跟踪它们。
当我在新的 ServerPlayer 上调用 start() 时,我让它写入一个字节 (1)。
然后我让我的客户端运行一个侦听线程来侦听来自 TCP 服务器的传入数据。但是,我没有收到从服务器发送的 (1)。我不确定是服务器没有正确发送它还是客户端没有正确接收它......
ServerPlayer.java:
/**
* ServerPlayer.java
* Creates a new instance of a player on the server, gives it
* an output and input stream, as well as the socket it came in on
*/
package server;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ServerPlayer extends Thread {
UIServer ui;
Socket socket;
ObjectOutputStream os;
ObjectInputStream is;
int id = -1;
ServerPlayer(Socket socket, ObjectOutputStream os, ObjectInputStream is, UIServer ui){
this.socket = socket;
this.os = os;
this.is = is;
this.ui = ui;
}
public void setID(int id){
this.id = id;
}
public int getID(){
return this.id;
}
public void run(){
boolean keepGoing = true;
System.out.println("SERVERPLAYER THREAD START");
try {
os.writeByte(1);
System.out.println("sent byte 1 from server");
} catch (IOException ex) {
Logger.getLogger(ServerPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
while(keepGoing){
try{
Byte msg = is.readByte();
int mes_id = msg.intValue();
ui.console.println("SERV MESSAGE#: " + mes_id);
} catch (IOException ex) {
Logger.getLogger(ServerPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
ListenFromServer.Java:
/*
* ListenFromServer.java
* Listens for incoming data from the TCP Server (this is on the client side)
*/
package client;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class ListenFromServer extends Thread {
TCPClient client;
boolean isRunning = false;
public ListenFromServer(TCPClient client){
this.client = client;
}
public void run(){
System.out.println("listen from server thread start");
isRunning = true;
while(isRunning){
try {
Byte b = client.sInput.readByte();
client.ui.console.println("BYTE: " + b.intValue());
} catch (IOException ex) {
Logger.getLogger(ListenFromServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
【问题讨论】:
-
您需要展示所有这些流是如何创建的,否则您的问题无法回答。您应该将对象流的创建推迟到线程的
run()方法。否则,您可以阻止程序的其他部分。并在ObjectInputStream.之前创建ObjectOutputStream