Hejsan! Hej Burre, Hejsan Sky! ids inte tanka ner det hela men du kan ju göra om lite grann =) Tycker du har gjort det oerhört omständigt. Mycket kod för inte speciellt mycket. TACK!!Problem med chattserver
Har försökt skriva en chattserver som man kan ansluta till med t.ex. telnet. Har några problem dock:
-Texten man skriver i Telnet syns inte i själva klienten, men kommer fram till servern!
-Om jag ansluter flera än en klient hanteras bara den första.
-Inget jag skikar till klienten kommer fram.
Jag hittade lite exempelfiler på nätet som jag tog lite tips från, men mesta koden är min egen. Jag kör Java 1.4.2_01 och JRE 1.4.2_01-b06.
ChatServer.java:
<code>
package myprojects.chatserver;
import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
class ChatServer extends JFrame implements Runnable{
String newline=System.getProperty("line.separator");
Vector clientList=new Vector();
ServerSocket servSock;
Thread serverThread;
JTextField txtMessage;
JTextArea txtChat;
JButton btnStart;
JButton btnSend;
public ChatServer() {
super("JChat 0.1b by Burre");
// Komponenterna
txtChat=new JTextArea();
txtMessage=new JTextField(15);
btnStart=new JButton("Start");
btnSend=new JButton("Send");
JPanel bottom=new JPanel(new FlowLayout());
/*****************************************
* Lyssnaren för send-knappen. Läser av
* txtMessage och skickar texten vidare om
* den inte e tom.
*****************************************/
btnSend.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent evt){
String msg=txtMessage.getText();
if(msg!=null){
sendToAll(msg);
txtChat.append(newline+msg);
txtMessage.setText("");
}
}
});
/*****************************************
* Lyssnaren för start/stop-knappen. Om
* serverThread är null så körs servern
* igång, annars stoppas servern.
*****************************************/
btnStart.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(serverThread==null){
System.out.println("startar servern");
start(); // Startar servern.
btnStart.setText("Stop");
}else{
System.out.println("Stoppar servern");
stop(); // Stopparservern och rensar upp
btnStart.setText("Start");
}
}
});
//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
bottom.add(txtMessage);
bottom.add(btnSend);
bottom.add(btnStart);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(new JScrollPane(txtChat), BorderLayout.CENTER);
getContentPane().add(bottom,BorderLayout.SOUTH);
/*****************************************
* Fönsterlyssnaren stänger alla klienter,
* rensar trådarna och avslutar programmet
******************************************/
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
if(serverThread!=null) stop();
dispose();
System.exit(0);
}
});
}
public void run(){
Thread thisThread=Thread.currentThread();
ServerThread serverthread;
int sockID=0;
try{
// Skapar en ServerSocket på en ledig port
servSock=new ServerSocket(0);
System.err.println("Servern lyssnar på port: " +servSock.getLocalPort());
}catch(IOException e){
System.out.println("Kunde inte skapa serversocket!");
}
while(thisThread==serverThread){
serverThread=connectToClient(servSock,sockID++);
//clientList.add(serverThread);
}
}
protected ServerThread connectToClient(ServerSocket serverSocket, int id){
ServerThread sThread;
Socket socket;
try{
socket=serverSocket.accept();
}catch(IOException e){
System.err.println("fel med anslutningen");
e.printStackTrace();
return null;
}
try{
sThread=new ServerThread(socket,this,id);
sThread.start();
}catch(Exception e){
System.err.println("Fel med startandet!");
e.printStackTrace();
return null;
}
writeToStream("Welcome to Burres! You are #"+ id, sThread.os);
clientList.add(sThread);
return sThread;
}
// Startar en ny tråd för servern.
public void start(){
serverThread=new Thread(this);
serverThread.start();
}
// Stoppar servern. All rensing kommer hit
public void stop(){
serverThread=null;
try{
servSock.close();
servSock=null;
}catch(IOException e){
System.err.println("Stärv!!");
e.printStackTrace();
}
System.out.println(serverThread);
}
// Skickar meddelandet från servern till klienterna
private void sendToAll(String msg){
for(int i=0;i<clientList.size();i++){
ServerThread tmp=(ServerThread)clientList.get(i);
System.out.println(tmp.os);
writeToStream(msg,tmp.os);
}
}
// Skickar meddelandet till alla utom avsändaren.
public void sendToClients(String msg, ServerThread sender){
txtChat.append(msg+newline);
/*********************************
* Loopar igenom vektorn med klienterna,
* och skapar en tillfällig ServerThread
* av alla objekt. Om avsändarens id inte
* är lika med tmp-objektets så skickas
* meddelandet.
**********************************/
for(int i=0;i<clientList.size();i++){
ServerThread tmp=(ServerThread)clientList.get(i);
//if(tmp.id!=sender.id){
writeToStream(msg,tmp.os);
//}
}
}
private void writeToStream(String msg, BufferedWriter stream){
System.out.println(msg);
try{
stream.write(msg);
stream.newLine();
stream.flush();
}catch(IOException ioe){
System.err.println("IOException vid sändning");
ioe.printStackTrace();
return;
}catch(NullPointerException npe){
System.out.println("Utströmmen är null");
return;
}
return;
}
/*********************************
* main() startar programmet och
* anropar CreateAndShowGUI() som
* visar GUI:et
*********************************/
private static void createAndShowGUI(){
System.out.println("Creating GUI...");
ChatServer serv=new ChatServer();
serv.setSize(new Dimension(500,400));
serv.setVisible(true);
}
public static void main(String args[]) {
System.out.println("Starting ChatServer...");
// Startar programmets GUI i AWTs händelsetråd.
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run(){
createAndShowGUI();
}
});
}
}
</code>
ServerThread.java
<code>
package myprojects.chatserver;
import java.net.*;
import java.io.*;
public class ServerThread extends Thread{
int id=0;
ChatServer server;
public Socket socket; // Socketen som används
public BufferedReader is; // Klientens inputstream
public BufferedWriter os; // Klientens outputstream
public ServerThread(Socket socket, ChatServer server, int id)throws IOException{
is=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
os=new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
if (is == null) {
System.err.println("InputStreamen verkade skapas ok, men är null);
throw new IOException();
}
if (os == null) {
System.err.println("OutputStreamen verkade skapas ok, men är null");
throw new IOException();
}
this.socket=socket;
this.server=server;
this.id=id;
}
/*******************************
* Så länge socketen inte är noll
* så läser start() det som kommer
* på is och vidarebefodrar det.
*******************************/
public void start(){
System.out.println("i ServerThread::start()");
while(socket!=null){
try{
String msg=is.readLine();
System.out.println("msg="+msg);
if(msg!=null){
server.sendToClients(msg, this);
}
}catch(EOFException eof){
close("Inga andra chattare inkopplade :-(");
return;
}catch(NullPointerException np){
close("Ingen socket till andra chattaren");
return;
}catch(IOException ioe){
close("Problem med läsningen");
return;
}catch(Exception ex){
ex.printStackTrace();
close("Något gick fel");
return;
}
}
}
protected void finlize(){
close("från finalize");
}
// Rensar in- och utströmmarna och socketen
void close(String reason){
System.out.println(reason);
try{
if(is!=null){
System.out.println("Stänger inputstream");
is.close();
is=null;
}
}catch(Exception ex){}
try{
if(os!=null){
System.out.println("Stänger outputstream");
os.close();
os=null;
}
}catch(Exception ex){}
try{
if(socket!=null){
System.out.println("Stänger socket");
socket.close();
socket=null;
}
}catch(Exception e){}
}
}
</code>
Tack på förhand, BurreSv: Problem med chattserver
Tror ingen har svarat för att du dunka in så mycket kod :-)
Iaf, om du connectar till din chattserver med telnet så kommer det ju förbli en telnet fönster om man säger så. När du skapar din gui så skapas den ju på servern och kommer aldrig hamna hos klienten eftersom klienten kör telnet. Det är ju vad jag tänker rent logiskt och om jag inte har fått allt om bakfoten hur saker o ting fungerar.
Så det du måste göra är att du skriver en klient del med gui som connectar till din serversocket till att börja med. Tittade inte så noga på din kod men den kan vi säkert hjälpa dig att fixa när du stöter problem.Sv: Problem med chattserver
Tack för svaret, du har säkert rätt angånde mängden kod :-) La filerna i ett zip-arkiv på www.sit.fi/~granqvit/ChatServer.zip så e de kanske lättare om nån vill se dem. Skulle du villa pröva att kompilera koden och koppla upp med telnet mot servern så ser du kanske bättre vad jag menar. Har förrut skrivit en enkel grej som kopplades från telnet till just en serversocket och det funkade bra, men inte detta nu med flera klienter. tror det är något med loopen i run() metoden:
<code>
while(thisThread==serverThread){
serverThread=connectToClient(servSock,sockID++);
//clientList.add(serverThread);
}
</code>
som e menad att loopa tills man trycker stop.
såhär ser connectToClient ut:
<code>
protected ServerThread connectToClient(ServerSocket serverSocket, int id){
ServerThread sThread;
Socket socket;
try{
socket=serverSocket.accept();
}catch(IOException e){
System.err.println("fel med anslutningen");
e.printStackTrace();
return null;
}
try{
sThread=new ServerThread(socket,this,id);
sThread.start();
}catch(Exception e){
System.err.println("Fel med startandet!");
e.printStackTrace();
return null;
}
writeToStream("Welcome to Burres! You are #"+ id, sThread.os);
clientList.add(sThread);
return sThread;
}
Stort tack om du orkar provköra koden.Sv: Problem med chattserver
'äsch fan nu försvann det jag hade svarat.
ändra där du kör
try{
sThread=new ServerThread(socket,this,id);
sThread.start();
}catch(Exception e){
System.err.println("Fel med startandet!");
e.printStackTrace();
return null;
}
till bara
new ServerThread(socket,this,id);
sedan ändrar du i slutet av konstruktorn i serverthread till
start();
Ett mycket bra och lätt genom gång hur du ska hantera en liten chat med trådar är denna pdf
http://www.cn-java.com/download/data/book/socket_chat.pdf
Den går igenom på en bra och enkelt sätt hur du ska göra. Titta på den så kanske det klarnar lite. Sv: Problem med chattserver
Bra tutorial du skickade! Skriver om koden efter att ha läst igenom pdf:en
mvh Burre