一个c# 写的客户端去访问java写的websocke服务端,然后客户端和服务端都有异常,客户端为“Connection”标头值“upgrade, keep-alive”无效。,服务端为java.io.EOFException,这是不是因为客户端为“Connection”标头值不符合java写的websocke服务端,服务端断开了客户断连接。为了证明到服务端还是客户端问题,作了以下测试
java编写安卓app客户端访问java写的websocke服务端无异常
java编写安卓app客户端访问nodejs写的websocket服务端无异常
C#编写安卓app客户端访问nodejs写的websocket服务端无异常
只有C#编写安卓app客户端访问java写的websocke服务端发生要述异常
之所以用java写的websocke服务端,是因为可以通过session.getBasicRemote()来获得某个客户端上下线
下面将java 和 C# 的代码贴出来
java
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.OnError;
import javax.websocket.server.ServerEndpoint;
import com.sun.net.httpserver.Headers;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.List;
import java.util.Map;
@ServerEndpoint("/testWebSocket")
public class WebSocketServer {
@OnOpen
public void onOpen(Session session,EndpointConfig config) {
// System.out.println("Connected ... " + session.getId());
System.out.println( session.getBasicRemote()+"接入服务器 ");
}
@OnMessage
public String onMessage(String message, Session session) {
System.out.println("Received: " + message);
return "Response: " + message;
}
@OnClose
public void onClose(Session session) {
System.out.println("Disconnected ... " + session.getId());
}
@OnError
public void onError(Session session, Throwable throwable) {
System.err.println("error: " + throwable.getMessage());
throwable.printStackTrace();
}
}
c#
using System;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
Method1();
Console.ReadKey();
}
public static async Task Method1()
{
try
{
var clientWebSocket = new ClientWebSocket();
await clientWebSocket.ConnectAsync(new Uri("ws://localhost:1998/WebSocket/testWebSocket"), CancellationToken.None);
Console.WriteLine("Connected!");
// Send message to server
var msg = "你好服务器!";
var buffer = System.Text.Encoding.UTF8.GetBytes(msg);
await clientWebSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);
// Receive message from server
var receiveBuffer = new byte[1024 * 4];
var receiveResult = await clientWebSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
while (!receiveResult.CloseStatus.HasValue)
{
Console.WriteLine("Received message: " + System.Text.Encoding.UTF8.GetString(receiveBuffer, 0, receiveResult.Count));
receiveResult = await clientWebSocket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None);
}
// Close connection
await clientWebSocket.CloseAsync(receiveResult.CloseStatus.Value, receiveResult.CloseStatusDescription, CancellationToken.None);
Console.WriteLine("Disconnected!");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}