I have created a SIP server using the JAIN-SIP library. I am using Apache Tomcat 9.0.95 with the Spring framework. When I can connect to the SIP server through WebSocket (ws://localhost:8080/society/ws) it gets connected, but when I try connecting it through jssip.min.js or sip.min.js,
I receive the following error: Please help me to resolve this error.
`java.io.EOFException
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1343)
at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1231)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:74)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:184)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:164)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:152)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:937)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at java.base/java.lang.Thread.run(Thread.java:1570)`
WebSocket Configuration
Here is my WebSocket configuration:
I have set setAllowedOrigins as * and checked url
`import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
@EnableWebSocket
@EnableWebSecurity
public class WebSocketConfig extends WebSecurityConfigurerAdapter implements WebSocketConfigurer, WebMvcConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new MyWebSocketHandler(), "/ws")
.setAllowedOrigins("http://localhost:8080/society"); // Specify the allowed origin
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/ws")
.allowedOrigins("http://localhost:8080/society")
.allowCredentials(true);
}
@Override
protected void configure(HttpSecurity http) {
try {
http
.authorizeRequests()
.antMatchers("/ws").permitAll() // Allow WebSocket connections
.anyRequest().authenticated()
.and()
.csrf().disable(); // CSRF can interfere with WebSocket connections
} catch (Exception e) {
System.out.println("HttpSecurity error occurred");
e.printStackTrace();
}
}
}`
WebSocket Handler
Below is my WebSocket handler:
Here I tried printing the payload also but it not getting printed.
`import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.sip.*;
import javax.sip.address.*;
import javax.sip.header.*;
import javax.sip.message.*;
import javax.websocket.*;
import org.springframework.web.socket.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
public class MyWebSocketHandler extends TextWebSocketHandler {
private SipProvider sipProvider;
private AddressFactory addressFactory;
private MessageFactory messageFactory;
private HeaderFactory headerFactory;
private Map<String, Session> webSocketSessions = new ConcurrentHashMap<>(); // Store WebSocket sessions per user
public MyWebSocketHandler() {
try {
SipServerConfig sipConfig = new SipServerConfig(); // Assuming your SipServerConfig is correctly set up
this.sipProvider = sipConfig.sipProvider();
this.addressFactory = sipConfig.addressFactory();
this.messageFactory = sipConfig.messageFactory();
this.headerFactory = sipConfig.headerFactory();
} catch (Exception e) {
System.out.println("MyWebSocketHandler error occurred");
e.printStackTrace();
}
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) {
System.out.println("WebSocket transport error with session: " + session.getId());
exception.printStackTrace();
try {
session.close(CloseStatus.SERVER_ERROR);
} catch (Exception e) {
System.out.println("handleTransportError error occurred");
e.printStackTrace();
}
}
@Override
public void afterConnectionEstablished(WebSocketSession session) {
System.out.println("WebSocket connection established with session: " + session.getId());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
System.out.println("WebSocket connection closed: " + session.getId() + ", status: " + status);
}
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
try {
String payload = message.getPayload();
System.out.println("Received SIP message: " + payload);
// Parse the SIP message
Request request = createSipRequestFromMessage(payload);
// Forward the SIP message to the SIP server via JAIN-SIP
sipProvider.sendRequest(request);
} catch (Exception e) {
System.err.println("Error handling SIP message: " + e.getMessage());
e.printStackTrace();
}
}
private Request createSipRequestFromMessage(String payload) throws Exception {
// This is where you'd parse the SIP message from the WebSocket payload
// and create a SIP Request using the JAIN-SIP stack
return null; // Implement the actual parsing logic
}
// Other methods omitted for brevity
}
`
Client-Side Code
Here is my client-side file:
I also tried using jssip.min.js and sip.min.js both are showing same error.
`
SIP Call
SIP Call Handling
Waiting for incoming call…
<button id="answerButton" style="display:none;" onclick="acceptCall()">Accept Call</button>
<button id="rejectButton" style="display:none;" onclick="rejectCall()">Reject Call</button>
<script>
// SIP User Agent Configuration
JsSIP.debug.enable('JsSIP:*'); // Enable full debug logging for JsSIP
const socket = new JsSIP.WebSocketInterface('ws://localhost:8080/society/ws');
const configuration = {
sockets: [socket],
uri: 'sip:user@localhost',
contact_uri: 'sip:user@localhost:8080;transport=ws',
trace_sip: true,
};
// Create a new SIP UserAgent
const userAgent = new JsSIP.UA(configuration);
// Start the UserAgent
userAgent.start();
// Register with the SIP server
userAgent.register();
</script>
</body>
</html>
`
What could be causing the java.io.EOFException error, and how can I resolve it?
Komal Agarwal is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.