這個問題在我看來已經超過了一天了,我找不到它的一個修復程序。我正在用Java編寫一個聊天應用程序。問題是服務器無法發送消息給客戶端,但可以只接收it.Here是我的課:Java客戶端服務器
服務器類:
public class Server implements Runnable {
static InetAddress address;
static ArrayList<Integer> clients=new ArrayList<Integer>();
static ArrayList<Socket> socs=new ArrayList<>();
static String message="";
static DataOutputStream toClient;
static ServerSocket socket;
static Socket socketNew;
static boolean running=false;
public Server(InetAddress address){
this.address=address;
}
public static void main(String[] args) throws IOException
{
socket=new ServerSocket(8000);
System.out.println("Server started on port 8000");
running=true;
while(true)
{
socketNew=socket.accept();
socs.add(socketNew);
address=socketNew.getInetAddress();
System.out.println("connected to client at address: "+address);
Server server=new Server(address);
new Thread(server).start();
}
}
public void run() {
{
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream()));
String message=br.readLine();
System.out.println(message);
for(Socket s:socs) //sending the above msg. to all clients
{
OutputStream os=os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.write(message);
pw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void message() {
}
}
這裏是我的客戶端類的相關功能:
private void receive_data()
{
BufferedReader br;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message=br.readLine();
console(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void send_data() {
OutputStream os;
try {
os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(this.name+": "+textField.getText());
pw.flush();
textField.setText("");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
而且,服務器停服任何來自客戶端的消息在第一個消息之後。我認爲這個問題可以通過在循環內部將run()方法的內容封裝在服務器類中來消除。但是它會以這種方式拋出異常。對於上述問題的任何解決方案?
是的,你需要用循環把它括起來。請更改它,並在您的問題中包含它拋出的異常(完整堆棧跟蹤)。 – RealSkeptic
這種方法的問題是當我殺死客戶端的窗口時,有很多例外,並且這也是無限的。我嘗試了類似while(running)的方式,其中running最初爲true。如果發現任何異常,我將運行設置爲false。但這樣,其他客戶端也無法發送任何消息到服務器。並且你能幫我解決我的第一個問題嗎?爲什麼客戶端無法從服務器收到任何消息? –
他們可以從其他客戶端接收消息嗎? –