|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
robober : 7 Новичок
|
Ноя 25, 2010 16:52 |
|
|
хочу сделать локальный чат
проблема:
Немогу получить от сервера входящих данных
вот сервер:
| Код: |
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.String;
class ServerSk
{
public static void main(String[] args)
{
try
{
ServerSocket ss = new ServerSocket(Integer.parseInt(args[0]));
while (true)
new HttpConnect(ss.accept());
}catch(ArrayIndexOutOfBoundsException ae)
{
System.err.println("Usage: Server port");
System.exit(0);
}catch(IOException e)
{
System.out.println(e);
}
}
}
class HttpConnect extends Thread
{
int n;
private Socket sock;
HttpConnect(Socket s)
{
sock = s;
setPriority(NORM_PRIORITY - 1);
start () ;
}
public void run()
{
try
{
PrintWriter pw = new PrintWriter(new OutputStreamWriter(
sock.getOutputStream()), true);
BufferedReader br = new BufferedReader(new InputStreamReader(
sock.getInputStream(), "Cp866"));
String req;
try
{
while((req = br.readLine()) != null)
{
System.out.println(req);
}
n = System.in.read();
pw.println(n);
pw.flush();
}catch(Exception e){}
sock.close();
}catch(IOException el){
System.out.println(el);
}
}
}
|
вот клиент:
| Код: |
import java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
class Outbox implements Runnable
{
Thread OutM;
String name;
String host;
int port;
String message;
int OutMes;
Outbox(String host, int port, String name)
{
this.name = name;
this.host = host;
this.port = port;
OutM = new Thread(this);
OutM.start();
}
public void run()
{
Thread t = Thread.currentThread();
while(OutM == t)
{
try
{
Socket sock = new Socket(host, port);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(
sock.getOutputStream()), true);
OutMes = System.in.read();
message = String.valueOf(OutMes);
pw.println(message);
pw.flush();
sock.close();
}catch(Exception e){
System.err.println(e);
}
}
}
}
class Inbox implements Runnable
{
Thread inM;
String name;
String host;
int port;
String message;
String line;
Inbox(String host, int port, String name)
{
this.name = name;
this.host = host;
this.port = port;
inM = new Thread(this);
inM.start();
}
public void run()
{
Thread t = Thread.currentThread();
while(inM == t)
{
try
{
Socket sock = new Socket(host, port);
BufferedReader br = new BufferedReader(new InputStreamReader(
sock.getInputStream(), "Cp866"));
while ((line = br.readLine()) != null)
{
System.out.println(line);
}
sock.close();
} catch(Exception e){
System.err.println(e);
}
}
}
}
class ClientSk
{
public static void main(String[] args)
{
int port;
if (args.length != 3)
{
System.err.println("Usage: Client host port name");
System.exit(0) ;
}
port = Integer.parseInt(args[1]);
Inbox palev = new Inbox(args[0], port, args[2]);
Outbox palev1 = new Outbox(args[0], port, args[2]);
}
} |
Последний раз редактировалось: robober (Ноя 26, 2010 14:51), всего редактировалось 1 раз |
|
|
|
 |
robober : 7 Новичок
|
Ноя 25, 2010 18:47 |
|
|
| Помогите пожалуйста, я хотел бы чтобы с сервера пришло сообщение к клиенту, в дальнейшем хочу чтобы сервер передал сообщение от одного клиента к другому. Вот! |
|
|
|
 |
escalade : 244 Новичок Откуда: Kiev, Ukraine
|
Ноя 26, 2010 12:44 |
|
|
Код не оформлен через bb коды, трудно разобраться, плюс кривой какой то и наверно еще и не Ваш...
Если Вам сильно уж надо написать самый простой чат на ява, то могу Вам помочь написать с нуля. |
|
|
|
 |
robober : 7 Новичок
|
Ноя 26, 2010 14:53 |
|
|
| Просто не могу понять почему от сервера не могу читать поток? |
|
|
|
 |
robober : 7 Новичок
|
Ноя 26, 2010 14:59 |
|
|
| escalade писал(а): |
Код не оформлен через bb коды, трудно разобраться, плюс кривой какой то и наверно еще и не Ваш...
Если Вам сильно уж надо написать самый простой чат на ява, то могу Вам помочь написать с нуля. |
1)Код мой. 2)Кривой - да потому, что пытался понять ошибку и химичил с ним. 3)Поможете с нуля если не трудно? У меня порсто еще вопросы есть. |
|
|
|
 |
escalade : 244 Новичок Откуда: Kiev, Ukraine
|
Ноя 26, 2010 15:12 |
|
|
Давай минимальное ТЗ.
Графический интерфейс нужен, или ты просто хочешь самый простой чат чтобы разобраться как он работает? |
|
|
|
 |
robober : 7 Новичок
|
Ноя 26, 2010 15:16 |
|
|
| escalade писал(а): |
Давай минимальное ТЗ.
Графический интерфейс нужен, или ты просто хочешь самый простой чат чтобы разобраться как он работает? |
Хочу разобраться что куда идет, куда и откуда выходит. Графический интерфейс не нужен. |
|
|
|
 |
escalade : 244 Новичок Откуда: Kiev, Ukraine
|
Ноя 26, 2010 15:26 |
|
|
|
|
|
|
 |
escalade : 244 Новичок Откуда: Kiev, Ukraine
|
Ноя 26, 2010 18:42 |
|
|
| Сервер почти готов, проверяю его работу. Сегодня поздним вечером выложу код. |
|
|
|
 |
robober : 7 Новичок
|
Ноя 26, 2010 19:31 |
|
|
| escalade писал(а): |
| Сервер почти готов, проверяю его работу. Сегодня поздним вечером выложу код. |
Желательно с комментариями |
|
|
|
 |
escalade : 244 Новичок Откуда: Kiev, Ukraine
|
Ноя 26, 2010 22:32 |
|
|
Вроде как все нормально работает
Что умеет сервер:
1. Многопоточный сервер чата (отдельный поток на пользователя)
2. Показывает имя пользователя отправившего сообщение
3. Есть две команды: exit - сервак умирает, online - показывает количество пользователей онлайн на данный момент
4. Определяет отключение пользователя от сервера
Использование UTF-8 в cmd.exe
По умолчанию cmd.exe использует кодировку cp866.
Текущую кодировку можно посмотреть командой chcp. Иногда возникает необходимость использовать в терминале юникод. Для этого необходимо использовать шрифт "Lucida Console" и переключить кодировку командой
>chcp <codepage>
Где параметр <codepage> для UTF-8 равен 65001
Запуск сервера с консоли cmd.exe:
java ChatServer <порт>
Как проверять:
1. Качаем программу putty http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
2. Запускаем несколько экземпляров одновременно.
2. Выставляем Ip адрес и порт сервера, кодировку "UTF-8", и тип соединения "RAW". Поддерживаются русские символы.
3. Вводим логин и проверяем работу, все отправленные сообщения должны прийти всем и себе обратно.
Код сервера:
| Код: |
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
/**
*
* @author Escalade
*/
public class ChatServer extends Thread {
// Связной список который хранит всех пользователей чата
private LinkedList<SocketHandler> userList = new LinkedList<SocketHandler>();
private ServerSocket serverSocket;
public ChatServer(int port) throws IOException {
serverSocket = new ServerSocket(port);
System.out.println(" Сервер запущен: ");
System.out.println(" IP: "+serverSocket.getInetAddress().getHostAddress());
System.out.println(" Port: "+serverSocket.getLocalPort());
// Запуск потока из конструктора (так не рекомендуеться, но удобно)
start();
}
@Override
public void run() {
while(true) {
try {
// Метод accept() блочит данный поток пока не подключиться новый пользователь
Socket socket = serverSocket.accept();
// Создание нового потока-обработчика для подключенного пользователя
// он выполняется паралельно данному потоку, и ниче не блочит.
// Сервер переходит к готовности принять новое соединение
SocketHandler handler = new SocketHandler(userList, socket);
} catch (Exception ex) {
}
}
}
public static void main(String[] args) throws IOException {
// Запуск сервера на порту 500
new ChatServer(Integer.parseInt(args[0]));
//new ChatServer(500);
}
}
|
Код потока-обработчика соединения:
| Код: |
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.LinkedList;
/**
*
* @author Escalade
*/
public class SocketHandler extends Thread {
// Хранит всех пользователей
private LinkedList<SocketHandler> userList = null;
// Сокет пользователя с которым работает данный поток
private Socket socket = null;
// Входной канал
private BufferedReader bufferedReader = null;
// Выходной канал
private PrintStream printStream = null;
// Имя пользователя
private String userName = "";
/**
* Конструктор
* @param users
* @param socket
* @throws IOException
*/
public SocketHandler(LinkedList<SocketHandler> userList, Socket socket) throws IOException {
super("SocketHandler Thread");
this.userList = userList;
this.socket = socket;
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
printStream = new PrintStream(socket.getOutputStream());
start();
}
/**
* Возвращает имя пользователя
* @return
*/
public String getUserName() {
return userName;
}
/**
* Возвращает выходной поток
* @return
*/
public PrintStream getPrintStream() {
return printStream;
}
/**
* Основной метод-обработчик потока
*/
@Override
public void run() {
try {
System.out.println(" Есть входящее соединение: "+socket.getInetAddress());
// Предлагаем пользователю ввести свое имя
printStream.println("Enter your username: ");
// Получаем логин пользователя
userName = bufferedReader.readLine(); // блокируется пока не получит строки!
System.out.println(" К серверу подключился пользователь: "+userName);
// Помещаем пользователя в список пользователей
userList.add(this);
// Отправляем чат сообщение
sendChatMessage("New user connected: "+userName);
sendChatMessage("Users online: "+userList.size()); // userList.size() - так определяется количество пользователей онлайн
while(true) {
try {
// Читаем новое сообщение от пользователя
String messageReceived = bufferedReader.readLine(); // блокируется пока не получит строки или null!
System.out.println("<"+userName+">: "+messageReceived);
if(messageReceived==null) {
// Невозможно прочитать данные, пользователь отключился от сервера
closeSocket();
// Останавливаем бесконечный цикл
break;
}
// Сервер прекратит работу если получит сообщение exit
if(messageReceived.equals("exit")) System.exit(0);
// Вывод пользователей онлайн
else if(messageReceived.equals("online")) sendChatMessage("Users online: "+userList.size());
// Посылаем всем сообщение если оно не пустое
else if(!messageReceived.isEmpty()) sendChatMessage(messageReceived);
} catch (Exception ex) {
closeSocket();
break;
}
}
} catch(Exception ex) {}
}
/**
* Удаляет пользователя из списка онлайн пользователей и освобождает ресурсы сокета
*/
private void closeSocket() {
try {
System.out.println("Пользователь "+userName+" покинул чат ");
sendChatMessage("Пользователь "+userName+" покинул чат ");
userList.remove(this);
sendChatMessage("Users online: "+userList.size());
bufferedReader.close();
printStream.close();
socket.close();
} catch (Exception ex) {
}
}
/**
* Отправляет сообщение всем в чате даже и себе обратно :)
* @param socket отправитель сообщения
* @param message сообщение которое нужно отправить
*/
public void sendChatMessage(String message) {
synchronized(userList) {
for(SocketHandler socketHandler : userList) {
try {
PrintStream printer = socketHandler.getPrintStream();
printer.println("<"+userName+"> "+message);
} catch (Exception ex) {}
}
}
}
}
|
В принципе код не сложный.
Замечания и жесткая критика приветствуется...
Последний раз редактировалось: escalade (Ноя 26, 2010 23:07), всего редактировалось 2 раз(а) |
|
|
|
 |
SDA : 32 Новичок
|
Ноя 26, 2010 22:47 |
|
|
у меня на эти строки ругается IDE 5
| Код: |
private LinkedList<SocketHandler> userList = new LinkedList<SocketHandler>();
@Override
|
Объясни пожалуйста, почему? |
|
|
|
 |
escalade : 244 Новичок Откуда: Kiev, Ukraine
|
Ноя 26, 2010 22:50 |
|
|
| И что пишет? У меня Netbeans молчит. |
|
|
|
 |
escalade : 244 Новичок Откуда: Kiev, Ukraine
|
Ноя 26, 2010 22:58 |
|
|
И что пишет? У меня Netbeans молчит.
Его наверно в конструктор нужно вынести:
| Код: |
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedList;
/**
*
* @author Escalade
*/
public class ChatServer extends Thread {
// Связной список который хранит всех пользователей чата
private LinkedList<SocketHandler> userList = null;
private ServerSocket serverSocket;
public ChatServer(int port) throws IOException {
userList = new LinkedList<SocketHandler>();
serverSocket = new ServerSocket(port);
System.out.println(" Сервер запущен: ");
System.out.println(" IP: "+serverSocket.getInetAddress().getHostAddress());
System.out.println(" Port: "+serverSocket.getLocalPort());
// Запуск потока из конструктора (так не рекомендуеться, но удобно)
start();
}
@Override
public void run() {
while(true) {
try {
// Метод accept() блочит данный поток пока не подключиться новый пользователь
Socket socket = serverSocket.accept();
// Создание нового потока-обработчика для подключенного пользователя
// он выполняется паралельно данному потоку, и ниче не блочит.
// Сервер переходит к готовности принять новое соединение
SocketHandler handler = new SocketHandler(userList, socket);
} catch (Exception ex) {
}
}
}
public static void main(String[] args) throws IOException {
// Запуск сервера на порту 500
new ChatServer(Integer.parseInt(args[0]));
//new ChatServer(500);
}
}
|
|
|
|
|
 |
SDA : 32 Новичок
|
Ноя 26, 2010 22:59 |
|
|
| Код: |
C:\Documents and Settings\Admin\ServerChat\src\serverchat\Main.java:14: <identifier> expected
private LinkedList<SocketHandler> userList = new LinkedList<SocketHandler>();
C:\Documents and Settings\Admin\ServerChat\src\serverchat\Main.java:27: illegal character: \64
@Override
C:\Documents and Settings\Admin\ServerChat\src\serverchat\Main.java:50: <identifier> expected
|
что-то вроде этого |
|
|
|
 |
|
|
Страница 1 из 8 На страницу 1, 2, 3, 4, 5, 6, 7, 8 След. |
Список форумов
-> Сети |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|