wstcl 2025-01-21 21:29 采纳率: 38.1%
浏览 86
已结题

c#客户端连接java websocket服务端出错

用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();
    }
    
    
    
    
}

  • 写回答

5条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    WebSocket 协议在客户端和服务器之间建立连接时,确实会涉及到一些标头(Headers)的设置和传递。但是,"Connection" 这个标头是由底层HTTP协议定义的,并不是 WebSocket 协议的一部分。在某些情况下,如在使用某些版本的浏览器或特定的客户端库时,"Connection" 标头可能会被自动处理或设置。因此,直接修改这个标头可能会导致问题。

    关于你的问题,错误提示 "Connection" 标头值 "upgrade, keep-alive" 无效可能是由于你的 C# 客户端试图设置一个不适用于当前连接模式的标头值。"upgrade" 是一个特殊的 HTTP 标头,用于指示客户端希望升级当前连接到一个新的协议(在这种情况下是 WebSocket)。然而,它不应该由客户端直接设置,而是由服务器在接收到客户端的升级请求时自动处理。因此,尝试通过 SetRequestHeader 方法设置这个标头可能是不正确的。

    为了解决这个问题,你可以尝试以下步骤:

    1. 确认你的 Java WebSocket 服务器是否正确配置并兼容你使用的 C# 客户端库。有时候,服务器和客户端之间的不兼容可能会导致连接问题。你可以尝试使用其他已知的 WebSocket 客户端库来测试你的 Java 服务器,以确保服务器本身没有问题。
    2. 检查你的 C# 客户端代码,确保你没有尝试修改不应更改的标头。你可以使用其他库(例如浏览器或标准的 WebSocket 库)来连接你的 Java 服务器,看看是否可以成功连接并获取数据。这可以帮助你确认问题是否出在 C# 客户端代码上。
    3. 如果问题仍然存在,你可以尝试查看 WebSocket 通信的详细日志或调试信息,以了解在连接过程中发生了什么。这可能会提供有关问题的更多线索。你也可以尝试与 Java 服务器的开发者交流,看看他们是否遇到了类似的问题或有任何建议。

    最后,关于如何获取 Java 服务器需要的标头信息,这通常取决于服务器的配置和使用的 WebSocket 库。如果服务器端的代码是你自己的,那么你可以检查服务器端代码中用于处理 WebSocket 连接的代码部分来查看它需要哪些标头信息。如果不是你的代码,你可能需要查阅该服务器的文档或联系开发者来获取更多信息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 2月2日
  • 已采纳回答 1月25日
  • 创建了问题 1月21日