用vs.net c#写了一个websocket客户端去连接java 写的一个客户端(客户端与服务端代码后附),发现连接后报错“Connection”标头值“upgrade, keep-alive”无效。导致其连接到服务器立即被断开,从而引发服务端java.io.EOFException。
然而这个错误只有vs.net写的客户端出现,我用安卓app和微信小程序连接均成功。并且vs.net写的客户端可以连接到其它代码的服务端,之所以要用java服务端是因为,java服务可以获得上下线客户端的seession相关值,这个对我很更要。
所以说这是不是因为vs.net c#websocketConnection标头值客户端不符合java服务端标头值有关。有人说设置clientWebSocket.Options.SetRequestHeader("Connection", "upgrade");但运行后又出现错误必须使用适当的属性或方法修改Connection标头。参数名: name的错误。换句话说如何知道java服务端需要怎样的Connection标头。所以这个标头值怎么改,是通过clientWebSocket.Options.SetRequestHeader方法还是其它方法,真的很奔溃的。
C#客户端代码
using System;
using System.Net.Http;
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 httpHandler = new HttpClientHandler();
var http = new HttpClient(httpHandler);
var clientWebSocket = new ClientWebSocket();
//clientWebSocket.Options.SetRequestHeader("Connection", "upgrade");
//Connection
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);
}
}
}
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)
{
// 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.getBasicRemote());
}
@OnError
public void onError(Session session, Throwable throwable) {
System.err.println("error: " + throwable.getMessage());
throwable.printStackTrace();
}
}