Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Локальный чат
Список форумов
 ->  Сети


На страницу 1, 2, 3, 4, 5, 6, 7, 8  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 
Ответить с цитатой
Вроде как все нормально работает Smile
Что умеет сервер:
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  След.
Список форумов
 -> Сети


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru