LINUX.ORG.RU

WebSocketServer и Timer Java

 , ,


0

1

Здравствуйте, у меня создается сервер, который замечательно работает без таймера, но мне необходим таймер, что бы отправлять оставшееся время для работы клиентам (специфика сайта). Как только я добавляю таймер, то сервер просто не запускается. Не понимаю почему, вот код сервера:

package model;

import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;

import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;

public class video_chat_server extends WebSocketServer {
	private Set<WebSocket> conns;
	private int time_lesson;//время урока в минутах
	private int hour=0, min=0, sec=1;//тсавшееся время урока
	private Timer timer;
	
	public video_chat_server(int port, int time) throws UnknownHostException {
		super(new InetSocketAddress(port));
		conns = new HashSet<>();
		time_lesson=time;
		//устанавливаем время урока
		int num_min=0;
		int all_min=0;
		for(;;) {
			num_min=num_min+30;
			all_min=all_min+30;
			if(num_min==60) {
				hour++;
				num_min=0;
			}
			if(all_min>=time_lesson)break;
		}
		min=num_min;	
	}

	public video_chat_server( InetSocketAddress address ) {
		super(address);
	}

	@Override
	public void onClose(WebSocket conn, int arg1, String arg2, boolean arg3) {
		// TODO Auto-generated method stub
		System.out.println("CLOSESOCKET");
		conns.remove(conn);
	}

	@Override
	public void onError(WebSocket conn, Exception arg1) {
		// TODO Auto-generated method stub
		System.out.println("ERROR WEBSOCKET: "+arg1);
	}
	
	@Override
	public void onMessage(WebSocket conn, String message) {
		// TODO Auto-generated method stub
		System.out.println("Message from client " + conn.getRemoteSocketAddress().getAddress().getHostAddress() + ": " + message);
		AllSend(message);
	}

	@Override
	public void onOpen(WebSocket conn, ClientHandshake handshake) {
		// TODO Auto-generated method stub
		System.out.println("New connection from " + conn.getRemoteSocketAddress().getAddress().getHostAddress());
		if(conns.size()<2)conns.add(conn);
	}

	@Override
	public void onStart() {
		// TODO Auto-generated method stub
		System.out.println("STARTSOCKET");
		getTimeLesson();
	}
	
	//отправка всем сообщение
	public void AllSend(String message) {
		for (WebSocket sock : conns) {
            sock.send(message);
        }
	}
	
	public void getTimeLesson() {
		timer = new Timer();
		timer.scheduleAtFixedRate(new TimerTask() {
			@Override
			public void run() {
				String message;
				sec--;
				if(sec==-1) {
					sec=59;
					min--;
					if(min==-1) {
						if(hour>0) {
							min=59;
							hour--;
						}
					}
				}
				message="{\"oper\": \"TIMER\", \"data\": \"";
				if(hour>0)message+=Integer.toString(hour)+":";
				if(min>=0)message+=Integer.toString(min)+":";
				message+=Integer.toString(sec)+"\"}";
				AllSend(message);
	  		}
	  	}, 1000, 1000);
	}
}

ты бы хоть рабочий пример дал, чтобы он запустился и завис. Лень самому возиться

навскидку, ты читал джавадок к таймеру? Если у тебя таска выполняется дольше, чем delay, то таска наслаивается на таску и всё виснет намертво

еще попробуй все внутренности таски завернуть в try-catch и распечатать, там может быть тупо экзепшен, о котором этот быдлокодный класс Timer не говорит

stevejobs ★★★☆☆ ()
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Пробовал try-catch в функции запуска таймера в разных местах ставить и вызов функции обернул в try-catch, вообще никаких исключений в консоли файла не показывает. Если закоментировать всю функцию запуска таймера getTimeLesson, то сервер запускается нормально.

mikl43 ()
Ответ на: комментарий от stevejobs

timer.scheduleAtFixedRate(new TimerTask() { на этой строчке сервер не хочет запускаться, сервер вообще не приемлет так запускать таймер, не пойму, даже если я не вызываю функцию, но это строчка и ниже не закоментированы, то сервер не запускается вообще.

mikl43 ()
Ответ на: комментарий от mikl43

проблема в том как я понял, если добавить таймер в класс сервера, то при создании этого класса и происходит какая то ошибка, поставил вывод в консоль до строки создания класса и после и до строки создания класса вывод в консоль отображается, а вот после нет

mikl43 ()
Ответ на: комментарий от mikl43

ты знаешь, что можно входить внутрь функции? В IntelliJ IDEA это F7, в Eclipse это F5

отлаживать принтами бесполезное дело. Так ты можешь проверить только свой код, а у тебя ошибка в чужом. Нужно в отладчике

stevejobs ★★★☆☆ ()
Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от stevejobs

в другом журнале посмотрел и выдает вот такую ошибку при создании класса где веб сокет сервер и таймер

07-Nov-2018 23:42:12.106 SEVERE [https-openssl-apr-443-exec-10] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [controllers.otherUpdate] in context with path [] threw exception [Servlet execution threw an exception] with root cause
 java.lang.ClassNotFoundException: model.video_chat_server$1
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
	at controllers.otherUpdate.doPost(otherUpdate.java:99)
	at controllers.otherUpdate.doGet(otherUpdate.java:130)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:587)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http2.StreamProcessor.service(StreamProcessor.java:245)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.http2.StreamProcessor.process(StreamProcessor.java:65)
	at org.apache.coyote.http2.StreamRunnable.run(StreamRunnable.java:35)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

mikl43 ()
Ответ на: комментарий от mikl43

этот класс создаётся, когда ты компилируешь джава-приложение. Когда копируешь то что получилось на удалённый сервер, нужно все такие временные классы со странными названиями тоже копировать.

stevejobs ★★★☆☆ ()