الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Chat Program ( Client Server)

بدأه mr.beshoy في 28 أبريل 2009 · 3 رد · 874 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام للجميع

انا هنا يا جماعة كاتب كلاسين

لتنفيذ برنامج شات (chat)صغير و بسيط

كلاس خاص بال server

و خلاص خاص بال client

بس مش عارف ازاى اربط الكلاسين ببعض

ياريت أى حد يقولى الطريقة

و أدى هنا كلاس الserver

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.EOFException;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.ServerSocket;

import java.net.Socket;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

public class ServerClass extends JFrame {

private JTextField enterField;

private JTextArea displayArea;

private ServerSocket server;

private int counter = 1;

private Socket connection;

private ObjectOutputStream output;

private ObjectInputStream input;

public ServerClass() {

super("server");

enterField = new JTextField();

enterField.setEditable(false);

enterField.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

sendData(e.getActionCommand());

enterField.setText("");

}

});

getContentPane().add(enterField, BorderLayout.NORTH);

displayArea = new JTextArea();

getContentPane().add(new JScrollPane(displayArea), BorderLayout.CENTER);

}

public void runServer() {

try {

while (true) {

try {

server = new ServerSocket(12345, 100);

waitForConnection();

getStreams();

processConnection();

} catch (EOFException eof) {

System.err.println("server terminated connection");

} finally {

closeConnection();

++counter;

}

}

} catch (IOException ioE) {

ioE.printStackTrace();

}

}

private void waitForConnection() throws IOException {

displayMessage("waiting for connection\n");

connection = server.accept();

displayMessage("Connection" + counter + "received from:" + connection.getInetAddress().getHostName());

}

private void getStreams() throws IOException {

output = new ObjectOutputStream(connection.getOutputStream());

output.flush();

input = new ObjectInputStream(connection.getInputStream());

displayMessage("\nGot I/O stream ");

}

private void processConnection() throws IOException {

String message = "Conncetion successful";

sendData(message);

setTextFieldEditable(true);

do {

try {

message = (String) input.readObject();

displayMessage("\n" + message);

} catch (ClassNotFoundException classnotfounexception) {

displayMessage("\nUnknwon object type received");

}

} while (!message.equals("CLIENT>>TERMINATE"));

}

private void closeConnection() {

displayMessage("\nTerminating conection\n");

setTextFieldEditable(false);

try {

output.close();

input.close();

connection.close();

} catch (IOException ioe) {

ioe.printStackTrace();

}

}

private void sendData(String message) {

try {

output.writeObject("Server>> " + message);

output.flush();

displayMessage("\nServer>> " + message);

} catch (IOException ioe) {

displayArea.append("\nError writing object");

}

}

private void displayMessage(final String messageTodisplay) {

displayArea.append(messageTodisplay);

displayArea.setCaretPosition(displayArea.getText().length());

}

private void setTextFieldEditable(final boolean editable) {

enterField.setEditable(editable);

}

public static void main(String[] args) {

ServerClass application = new ServerClass();

application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

application.setSize(300, 150);

application.setLocationRelativeTo(null);

application.setEnabled(true);

application.runServer();

}

}

و أدى كلاس ال client

import java.awt.BorderLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.EOFException;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.net.InetAddress;

import java.net.Socket;

import javax.swing.JFrame;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.JTextField;

public class ClientClass extends JFrame {

private JTextField enterField;

private JTextArea displayArea;

private ObjectOutputStream output;

private ObjectInputStream input;

private String message = "";

private String chatServer;

private Socket client;

public ClientClass(String host) {

super("client");

chatServer = host;

enterField = new JTextField();

enterField.setEditable(false);

enterField.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

sendData(e.getActionCommand());

enterField.setText("");

}

});

getContentPane().add(enterField, BorderLayout.NORTH);

displayArea = new JTextArea();

getContentPane().add(new JScrollPane(displayArea), BorderLayout.CENTER);

}

private void runClient() {

try {

connectToserver();

getStream();

processConnection();

} catch (EOFException eof) {

System.err.println("Client terminated connection");

} catch (IOException ioe) {

ioe.printStackTrace();

} finally {

closeConnection();

}

}

private void connectToserver() throws IOException {

displayMessage("Attempting connection");

client = new Socket(InetAddress.getByName(chatServer), 12345);

displayMessage("Connected to:" + client.getInetAddress().getCanonicalHostName());

}

private void getStream() throws IOException {

output = new ObjectOutputStream(client.getOutputStream());

output.flush();

input = new ObjectInputStream(client.getInputStream());

displayMessage("\nGot I/O stream\n");

}

private void processConnection() throws IOException {

String message = "Conncetion successful";

sendData(message);

setTextFieldEditable(true);

do {

try {

message = (String) input.readObject();

displayMessage("\n" + message);

} catch (ClassNotFoundException classnotfounexception) {

displayMessage("\nUnknwon object type received");

}

} while (!message.equals("CLIENT>>TERMINATE"));

}

private void closeConnection() {

displayMessage("\nTerminating conection\n");

setTextFieldEditable(false);

try {

output.close();

input.close();

client.close();

} catch (IOException ioe) {

ioe.printStackTrace();

}

}

private void sendData(String message) {

try {

output.writeObject("\nclient>> " + message);

output.flush();

displayMessage("\nclient>> " + message);

} catch (IOException ioe) {

displayArea.append("\nError writing object");

}

}

private void displayMessage(final String messageTodisplay) {

displayArea.append(messageTodisplay);

displayArea.setCaretPosition(displayArea.getText().length());

}

private void setTextFieldEditable(final boolean editable) {

enterField.setEditable(editable);

}

public static void main(String[] args) {

ClientClass application ;

if(args.length==0)

application=new ClientClass("127.0.0.1");

else

application=new ClientClass(args[0]);

application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

application.setSize(300, 150);

application.setLocationRelativeTo(null);

application.setEnabled(true);

application.runClient();

}

}

بس انا مشكلتى هنا مش عارف ازاى

اربط بين الكرسين و اشغلههم

و تظهر شاشة ال client

و شاشة السيرفير

شكرا

بيشوى عاطف

كلاس السيرفير

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ServerClass extends JFrame {

	private JTextField enterField;
	private JTextArea displayArea;
	private ServerSocket server;
	private int counter = 1;
	private Socket connection;
	private ObjectOutputStream output;
	private ObjectInputStream input;

	public ServerClass() {
		super("server");
		enterField = new JTextField();
		enterField.setEditable(false);
		enterField.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				sendData(e.getActionCommand());
				enterField.setText("");
			}
		});
		getContentPane().add(enterField, BorderLayout.NORTH);
		displayArea = new JTextArea();
		getContentPane().add(new JScrollPane(displayArea), BorderLayout.CENTER);
	}

	public void runServer() {
		try {
			while (true) {
				try {
					server = new ServerSocket(12345, 100);
					waitForConnection();
					getStreams();
					processConnection();
				} catch (EOFException eof) {
					System.err.println("server terminated connection");
				} finally {
					closeConnection();
					++counter;
				}
			}
		} catch (IOException ioE) {
			ioE.printStackTrace();
		}
	}

	private void waitForConnection() throws IOException {
		displayMessage("waiting for connection\n");
		connection = server.accept();
		displayMessage("Connection" + counter + "received from:" + connection.getInetAddress().getHostName());
	}

	private void getStreams() throws IOException {
		output = new ObjectOutputStream(connection.getOutputStream());
		output.flush();
		input = new ObjectInputStream(connection.getInputStream());
		displayMessage("\nGot I/O stream ");
	}

	private void processConnection() throws IOException {
		String message = "Conncetion successful";
		sendData(message);
		setTextFieldEditable(true);
		do {
			try {
				message = (String) input.readObject();
				displayMessage("\n" + message);
			} catch (ClassNotFoundException classnotfounexception) {
				displayMessage("\nUnknwon object type received");
			}
		} while (!message.equals("CLIENT>>TERMINATE"));
	}

	private void closeConnection() {
		displayMessage("\nTerminating conection\n");
		setTextFieldEditable(false);
		try {
			output.close();
			input.close();
			connection.close();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}

	private void sendData(String message) {
		try {
			output.writeObject("Server>> " + message);
			output.flush();
			displayMessage("\nServer>> " + message);

		} catch (IOException ioe) {
			displayArea.append("\nError writing object");
		}
	}

	private void displayMessage(final String messageTodisplay) {
		displayArea.append(messageTodisplay);
		displayArea.setCaretPosition(displayArea.getText().length());
	}

	private void setTextFieldEditable(final boolean editable) {
		enterField.setEditable(editable);
	}

	public static void main(String[] args) {
		ServerClass application = new ServerClass();
		application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		application.setSize(300, 150);
		application.setLocationRelativeTo(null);
		application.setEnabled(true);
		application.runServer();
	}
}

كلاس ال client

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ClientClass extends JFrame {

	private JTextField enterField;
	private JTextArea displayArea;
	private ObjectOutputStream output;
	private ObjectInputStream input;
	private String message = "";
	private String chatServer;
	private Socket client;

	public ClientClass(String host) {
		super("client");
		chatServer = host;
		enterField = new JTextField();
		enterField.setEditable(false);
		enterField.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				sendData(e.getActionCommand());
				enterField.setText("");
			}
		});
		getContentPane().add(enterField, BorderLayout.NORTH);
		displayArea = new JTextArea();
		getContentPane().add(new JScrollPane(displayArea), BorderLayout.CENTER);
	}

	private void runClient() {
		try {
			connectToserver();
			getStream();
			processConnection();
		} catch (EOFException eof) {
			System.err.println("Client terminated connection");
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			closeConnection();
		}
	}

	private void connectToserver() throws IOException {
		displayMessage("Attempting connection");
		client = new Socket(InetAddress.getByName(chatServer), 12345);
		displayMessage("Connected to:" + client.getInetAddress().getCanonicalHostName());
	}

	private void getStream() throws IOException {
		output = new ObjectOutputStream(client.getOutputStream());
		output.flush();
		input = new ObjectInputStream(client.getInputStream());
		displayMessage("\nGot I/O stream\n");
	}

	private void processConnection() throws IOException {
		String message = "Conncetion successful";
		sendData(message);
		setTextFieldEditable(true);
		do {
			try {
				message = (String) input.readObject();
				displayMessage("\n" + message);
			} catch (ClassNotFoundException classnotfounexception) {
				displayMessage("\nUnknwon object type received");
			}
		} while (!message.equals("CLIENT>>TERMINATE"));
	}

	private void closeConnection() {
		displayMessage("\nTerminating conection\n");
		setTextFieldEditable(false);
		try {
			output.close();
			input.close();
			client.close();
		} catch (IOException ioe) {
			ioe.printStackTrace();
		}
	}

	private void sendData(String message) {
		try {
			output.writeObject("\nclient>> " + message);
			output.flush();
			displayMessage("\nclient>> " + message);

		} catch (IOException ioe) {
			displayArea.append("\nError writing object");
		}
	}

	private void displayMessage(final String messageTodisplay) {
		displayArea.append(messageTodisplay);
		displayArea.setCaretPosition(displayArea.getText().length());
	}

	 private void setTextFieldEditable(final boolean editable) {
		enterField.setEditable(editable);
	}
	public static void main(String[] args) {
		ClientClass application;
		if(args.length==0)
			application=new ClientClass("127.0.0.1");
		else
			application=new ClientClass(args[0]);
		application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		application.setSize(300, 150);
		application.setLocationRelativeTo(null);
		application.setEnabled(true);
		application.runClient();
	}
}

معلش انا وضعتهم تانى عشان شكل الكود لم يكون مظبوط فى المشاركة الأولى

#2

عن اي ربط تتكلم يا بيشوي ..هنا object من Socket و ServerSocket التي تقوم بالمهمة

في Method الـ runserver تحتاج لتاكيد الاتصال من الـclinte

connection=server.accept();

ومنا

client = new Socket(InetAddress.getByName(chatServer), 12345);

ضع الـlocalhost يدوي ..لان في بعض الاحيان اذا كنت منزل VM على جهازك قد يتضارب الامر

اما اذا قصدت موضوع قد يتولد اكثر من زبون ..فيجب عليك استخدام Multithreade وتحقيق واجهة Runnable و بقية العمل كما هوا

حاول تخلق class مسؤل عن write ,read لـ string بعيد عن الزحمة الموجودة لتفصل حالات العمل جيد

بالتوفيق

الله معك .

#3

بيشوي تصميمك سيء جداً

يجب أن تفص المنطق الخاص بالبرنامج عن الواجهات

قم بعمل فئتين أحدهما خادم والآخر عميل

واجعلهم يتصلوا مع بعضهم عن طريق سطر الأوامر console

إذا نجحت في هذا

سيسهل عليك عملية التحويل إلى واجهات

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة