Bir sunucuda (Java'da) ve JavaScript'te istemci üzerinde websockets kullanarak çalışıyorum ve her şey sadece Android'de çalışıyor, ancak iPhone'da test ettiğimde, JavaScript sayfası kapatılıyor herhangi bir websocket.send yönteminde.Javascript Websocket OnOpen çağrılmayan IOS
Android'de, gameButton işlevi "Send!" sayfada ve sunucu mesajı alır. IOS'ta, gameButton işlevi "Input: u" gibi bir şey çıkarır, ancak görünüşe göre connection.send üzerinde askıda kalıyor ve "Gönderildi" çıktı vermiyor ve sunucu iletiyi almıyor. Onopen işlevi asla iPhone'da çağrılmaz, ancak Android'de. Herhangi bir fikir? Sunucu kodunun bazılarını görmeniz gerekiyorsa bana bildirin ..
Uzun kod için özür dilerim! müşteri için
JavaScript:
<!DOCTYPE html>
<html>
<head>
<title>Echo Test</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
</head>
<body onload="pageLoad()" style="background:black; color:cyan">
<div id="joinform">
<input type="text" id="username" value="Username..."></input>
<button id="joinbutton" onclick="joinSubmit()">Join!</button></div>
<div id="gamecontrols">
<button onclick="gameButton('u')" id="upbutton"> UP </button>
<button onclick="gameButton('d')" id="downbutton">DOWN</button></div>
<div id="leftDiv" style="float:left; width=10%; height=300px"><canvas id="leftCanvas" style="border:2px solid cyan"></canvas> </div>
<div id="rightDiv" style="float:left; width=10%; height=300px"><canvas id="rightCanvas" style="border:2px solid cyan"></canvas> </div>
<div id="statusdiv"> </div>
<div id="messages"></div>
</body>
<script type="text/javascript">
var connection = new WebSocket('ws://174.51.xxx.xx:9091');
var messages = document.getElementById("messages");
var username = document.getElementById("username");
var joinbutton = document.getElementById("joinbutton");
var game = document.getElementById("gamecontrols");
var joinform = document.getElementById("joinform");
var state = 0;
var leftCanvas = document.getElementById('leftCanvas')
var rightCanvas = document.getElementById('rightCanvas');
var statusdiv = document.getElementById('statusdiv')
var startx = 0
var starty = 0;
var distx = 0;
var disty = 0;
// When the connection is open, send some data to the server
connection.onopen = function(e) {
writeResponse('Open!');
connection.send('TEST');
}
// Log errors
connection.onerror = function(error) {
writeResponse('Error: ' + error);
}
connection.onclose = function(e) {
writeResponse("Disconnected: " + e.data);
}
// Log messages from the server
connection.onmessage = function(e) {
writeResponse('Server: ' + e.data);
}
function pageLoad() {
game.style.visibility = "hidden";
}
function writeResponse(text) {
messages.innerHTML += "<br/>" + text;
}
function joinSubmit() {
game.style.visibility = "visible";
//connection.send(username.value);
writeResponse("Username sent to server.");
joinform.remove();
leftCanvas.addEventListener('touchstart', function(e) {
var touchobj = e.changedTouches[0] // reference first touch point (ie: first finger)
startx = parseInt(touchobj.clientX) // get x position of touch point relative to left edge of browser
starty = parseInt(touchobj.clientY)
statusdiv.innerHTML = 'Status: touchstart<br> ClientX: ' + startx + 'px'
drawJoystick(startx, starty);
e.preventDefault()
}, false)
leftCanvas.addEventListener('touchmove', function(e) {
e.preventDefault()
var touchobj = e.changedTouches[0] // reference first touch point for this event
var distx = parseInt(touchobj.clientX) - startx
var disty = parseInt(touchobj.clientY) - starty
statusdiv.innerHTML = 'Status: touchmove<br> Horizontal distance traveled: ' + distx + 'px<br> Vertical distance traveled: ' + disty + 'px' +
'<br>Dist: ' + Math.sqrt((startx - (distx + startx)) * (startx - (distx + startx)) + (starty - (disty + starty)) * (starty - (disty +
starty)));
//connection.send("L=" + distx + "=" + disty);
connection.send("A=" + Math.floor(angleBetween2Lines(startx, starty, startx + distx, starty + disty) + 90) * -1);
connection.send("B=" + distx + "=" + disty);
}, false)
leftCanvas.addEventListener('touchend', function(e) {
var touchobj = e.changedTouches[0] // reference first touch point for this event
statusdiv.innerHTML = 'Status: touchend<br> Resting x coordinate: ' + touchobj.clientX + 'px'
e.preventDefault()
}, false)
}
function gameButton(ctrl) {
writeResponse("Control: " + ctrl);
connection.send(ctrl);
writeResponse("Sent!");
}
function find_angle(x1, y1, x2, y2) {
var AB = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
var BC = Math.sqrt(Math.pow(x2 - (x1 - 10), 2) + Math.pow(y2 - y1, 2));
var AC = Math.sqrt(Math.pow((x1 - 10) - x1, 2) + Math.pow(y1 - y1, 2));
return Math.acos((BC * BC + AB * AB - AC * AC)/(2 * BC * AB)) * (180/Math.PI);
}
function angleBetween2Lines(x1, y1, x2, y2) {
var angle1 = Math.atan2(y1 - y1,
x1 - (x1 + 100));
var angle2 = Math.atan2(y1 - y2,
x1 - x2);
return angle1 - angle2 * (180/Math.PI);
}
</script>
</html>
DÜZENLEME: Bu sayfada http://websocket.org/echo.html itibaren tam kodunu test edilmiş ve o Android hem de iOS üzerinde çok iyi çalışıyor görünüyor, bu yüzden benim neyin sebep olduğunu gerçekten emin değilim websocket uygulama iOS üzerinde kırmak için ... Herhangi bir fikir çalıştırmak için link.send() işlevini çalıştırmak için javascript yönteminin geri kalanı dondurmak ve engellemek?
GÜNCELLEME: Sunucu kodumu mümkün olan en kısa forma indirdim ve hala Android'de çalışıyor ancak denediğim iPhone'larda çalışmıyor. Ayrıca, javascript kodu yukarıdaki iPhone "connection.onopen" işlevini çağırarak değil, ancak burada
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import javax.xml.bind.DatatypeConverter;
public class DateServer {
static String[] headers = new String[10];
static String[] bodies = new String[10];
public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
ServerSocket listener = new ServerSocket(9091);
try {
while (true) {
Socket socket = listener.accept();
System.out.println("Accepted");
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String msg;
while ((msg = input.readLine()) != null) {
if (msg.length() == 0)
break;
parseHeaders(msg);
}
String httpResponse = returnHeader();
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println(httpResponse + "\n");
out.flush();
System.out.println("Sent HTTP Response");
} finally {
}
}
}
finally {
listener.close();
}
}
public static void parseHeaders(String in) {
System.out.println(in);
String[] thisLine = in.split(": ");
if (thisLine[0].equals("Host")) {
bodies[0] = thisLine[1];
}
else if (thisLine[0].equals("Upgrade")) {
bodies[1] = thisLine[1];
}
else if (thisLine[0].equals("Connection")) {
bodies[2] = thisLine[1];
}
else if (thisLine[0].equals("Sec-WebSocket-Key")) {
bodies[3] = thisLine[1];
}
else if (thisLine[0].equals("Sec-WebSocket-Version")) {
bodies [4] = thisLine[1];
}
}
public static String returnHeader() throws NoSuchAlgorithmException, UnsupportedEncodingException {
String head = "HTTP/1.1 101 Web Socket Protocol Handshake\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: ";
String key = bodies[3];
String encoded = WebSocketAccept(key);
String httpResponse = head.concat(encoded);
httpResponse.concat("\r\n\r\n"); // is concat not working??
return httpResponse;
}
private static String WebSocketAccept(String message) throws NoSuchAlgorithmException, UnsupportedEncodingException {
message = message.concat("258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
MessageDigest digest = MessageDigest.getInstance("SHA-1");
byte[] hashedBytes = digest.digest(message.getBytes("UTF-8"));
return convertByteArrayToHexString(hashedBytes);
}
private static String convertByteArrayToHexString(byte[] arrayBytes) {
StringBuffer stringBuffer = new StringBuffer();
for (int i = 0; i < arrayBytes.length; i++) {
stringBuffer.append(Integer.toString((arrayBytes[i] & 0xff) + 0x100, 16).substring(1));
}
return convertHexToBase64(stringBuffer.toString());
}
private static String convertHexToBase64(String hex) {
byte[] hexToBytes = DatatypeConverter.parseHexBinary(hex);
String base64 = Base64.getEncoder().encodeToString(hexToBytes);
System.out.println(base64);
return base64;
}
}
sunucu vs iPhone Android aldığı başlık olduğu ... Android'de çağrıldığını:
Android:
GET/HTTP/1.1
Host: 174.51.xxx.xx:9091
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://server.site88.net
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Linux; Android 5.0; SM-G900V Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.91 Mobile Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Sec-WebSocket-Key: IKTSyKHA8zclXsm2hFzm5Q==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
iPhone:
GET/HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 174.51.xxx.xx:9091
Origin: http://server.site88.net
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: Sq0xOYhkomBmiyMbGwp/kQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13D15 Safari/601.1