Problemer med klient server program
Hej eksperter.Jeg kæmper med at lave et klient- og et server program der kan kommunikerer med hinanden.
Det volder mig dog store problemer, og min overordnede programstruktur er efterhånden sønderbombet af de mange fejlkorrektioner jeg har forsøgt mig med.
Mit håb er nu, at en eller flere af jer kan hjælpe mig igennem til en løsning, og give input til mit videre arbejde.
Jeg arbejder med pt. med 3 klasser:
Server: klasse som lytter efter klienter, og opretter en tråd (ClientHandler) der håndterer den videre kommunikation med klienten
Client: klasse der opretter en socket forbindelse til severen, og forsøger at sende beskeder til denne. Her har jeg forsøgt mig med en grafisk brugergrænseflade.
ClientHandler: klasse der arver fra Thread. Håndterer komunikationen med en klient.
Der er main metoder i klasserne Client og Server.
Kørsel:
- kører klassen ServerSocket.
- kører klassen Client
- leverer input i textfield i gui'en til Client
Af mærkværdige grunde kan jeg kun få sendt en enkelt besked fra klienten til serveren (dvs. ClientHandleren). Jeg har hardkodet 7 reads i klassen ClientHandler,men som sagt er det kun den første der læses, ellers modtages null.
Output:
client wrote: hej
client wrote: null
client wrote: null
client wrote: null
client wrote: null
client wrote: null
client wrote: null
-----------------------------------------------------
// class Server
import java.net.*;
public class Server{
public void listen(){
try{
int port = 8000;
ServerSocket serverSocket = new ServerSocket(port);
while( true ){
Socket incoming = serverSocket.accept();
ClientHandler CH = new ClientHandler(incoming);
CH.start();
}
}
catch( Exception e ){
e.printStackTrace();
}
}
public static void main(String[] args){
Server s = new Server();
s.listen();
}
}
//--------------------------------
// class ClientHandler
mport java.net.*;
import java.io.*;
public class ClientHandler extends Thread
{
private Socket connectionSocket = null;
private String clientSentence;
private String capitalizedSentence;
public ClientHandler(Socket incoming)
{
connectionSocket = incoming;
}
public void run()
{
try
{
BufferedReader inFromClient =
new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
System.out.println("client wrote: " + clientSentence);
clientSentence = inFromClient.readLine();
System.out.println("client wrote: " + clientSentence);
clientSentence = inFromClient.readLine();
System.out.println("client wrote: " + clientSentence);
clientSentence = inFromClient.readLine();
System.out.println("client wrote: " + clientSentence);
clientSentence = inFromClient.readLine();
System.out.println("client wrote: " + clientSentence);
clientSentence = inFromClient.readLine();
System.out.println("client wrote: " + clientSentence);
clientSentence = inFromClient.readLine();
System.out.println("client wrote: " + clientSentence);
//capitalizedSentence = clientSentence.toUpperCase() + '\n';
//outToClient.writeBytes(capitalizedSentence);
inFromClient.close();
outToClient.close();
}
catch( Exception e )
{
e.printStackTrace();
}
try
{
connectionSocket.close();
}
catch( Exception e )
{
}
}
}
//----------------------------------
// class Client
// java core packages
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
// java extension packages
import javax.swing.*;
public class Client extends JFrame{
private DataOutputStream outToServer;
private BufferedReader inFromServer;
private Socket clientSocket;
private String message;
private String username;
private String hostIP;
private JTextArea outputArea;
private JTextField inputField;
public Client(String host, String name){
// set frames title
super(name );
// set serverInternetAddr and username
hostIP = host;
username = name;
Container containter = getContentPane();
// set up area and field - add ActionListener
outputArea = new JTextArea();
inputField = new JTextField();
inputField.addActionListener(new ActionHandler());
containter.add(new JScrollPane(outputArea) , BorderLayout.CENTER);
containter.add(inputField, BorderLayout.SOUTH);
this.setSize(300, 150);
this.setVisible(true);
System.out.println("sluningen af konstruktøren");
} // end constructor
private void testConversation() throws UnknownHostException, IOException{
String sentence = "";
String modifiedSentence;
//BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
connectToServer();
openStreams();
System.out.println("efter openstreams i konstruktøren");
/*
// 1 write til server
// in from user
sentence = inFromUser.readLine();
System.out.println("dit input var: " + sentence);
// output til server
outToServer.writeBytes(sentence + '\n');
// 2. write til server
sentence = inFromUser.readLine();
System.out.println("dit input var: " + sentence);
// output til server
outToServer.writeBytes(sentence + '\n');
*/
// input from server
// modifiedSentence = inFromServer.readLine();
// System.out.println("FROM SERVER: " + modifiedSentence);
}
/*
public void runConversation(){
try{
System.out.println("we connected to server");
// step 1 - connect to server
connectToServer();
// step 2 - open communication streams
openStreams();
//step 3 - proces connection
//processConnection();
//step 4 - close streams and connection
//closeConnection();
}
catch(IOException ioExc){
ioExc.printStackTrace();
}
}
*/
private void connectToServer() throws IOException{
outputArea.setText("Client (" + username + "): atempting connection\n");
// create socket to make connection to server
clientSocket = new Socket("127.0.0.1", 8000);
outputArea.append("Connected to: " + clientSocket.getInetAddress().getHostName());
}
// step 2
private void openStreams() throws IOException{
// @ spgm1 spørg om forskellige streams
// open outputStream
outToServer = new DataOutputStream(clientSocket.getOutputStream());
//outToServer.flush(); // ved ikke om dette flush er nødvendigt
// open buffered inputStreamReader
inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
outputArea.append("\nGot I/O streams\n");
}
private void sendData(String userMessage){
// send object to server
//inputField.setText("");
System.out.println("i starten af metoden sendData");
System.out.println("Dette input er sendt med til sendData: " + userMessage);
/*
try {
outToServer.writeBytes( username + ">>> " + userMessage );
//outToServer.flush();
outputArea.append( "\n" + username + ">>>" + userMessage);
}
// process problems sending object
catch ( IOException ioException ) {
outputArea.append( "\nError writing to server" );
}
System.out.println("i slutningen af metoden send data");
*/
}
private class ActionHandler implements ActionListener{
public void actionPerformed(ActionEvent event){
String userInput = inputField.getText();
System.out.println("er nu inde i actionPErformed - user skrev: " + userInput);
sendData(userInput);
try {
outToServer.writeBytes(userInput + '\n');
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//sendData(userInput);
}
} // end inner class ActionHandler
public static void main(String[] args){
Client application;
if(args.length == 0){
application = new Client("127.0.0.1", "Lille_Virgil");
}else{
application = new Client(args[0], args[1]);
}
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//application.runConversation();
try {
application.testConversation();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
private void connect() throws IOException{
outputArea.setText("Client (" + username + "): atempting connection\n");
// create socket to make connection to server
clientSocket = new Socket(InetAddress.getByName(hostIP), 8000);
outputArea.append("Connected to: " + clientSocket.getInetAddress().getHostName());
}
*/
Jeg beklager for det meget rodede udtryk i klasserne :]
