Tôi có một thông điệp đơn giản:Đọc Tin nhắn Protobuf trong C#
kiểm tra gói;
tin nhắn sendName {
tùy chọn chuỗi tên người dùng = 1;
}
Các tuyệt vời VS Plugin tạo ra cs file:
kiểm tra namespace {
[global :: System.Serializable toàn cầu :: ProtoBuf.ProtoContract (Tên = @ "sendName")]
lớp công khai một phần sendName: toàn cầu :: ProtoBuf.IExtensible {
public sendName() {} private string _username = ""; [global::ProtoBuf.ProtoMember(1, IsRequired = false, [email protected]"username", DataFormat = > global::ProtoBuf.DataFormat.Default)] [global::System.ComponentModel.DefaultValue("")] public string username { get { return _username; } set { _username = value; } } private global::ProtoBuf.IExtension extensionObject; global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) { return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); } } }
Tôi gửi một thông điệp từ phía java bằng cách sử dụng
objName.build() writeTo ((FileOutputStream) socket.getOutputStream()).
Trong ứng dụng # C của tôi, trong đó hoạt động như Listener Socket, tôi có một phương pháp gọi là Nghe mà nghe cho thông điệp gửi của khách hàng java:
public void Listen()
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); TcpListener listener = new TcpListener(ipAddress, 4055); TcpClient client = null; listener.Start(); while (true) { Debug.WriteLine("Waiting for a Connection"); client = listener.AcceptTcpClient(); Stream stream = client.GetStream(); // sendName sendNameObj = Serializer.Deserialize<sendName>(stream); }
}
Tôi rõ ràng là thiếu một số vấn đề cơ bản ở đây.
Tôi nên sử dụng phương pháp nào để nhận đối tượng sendName?
Khi tôi gỡ lỗi mã của mình trong C#, trình gỡ lỗi sẽ thoát khi tôi gọi phương thức DeserializeWithLengthPrefix.
Đây là mã # C của tôi:
private void Listen()
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
TcpListener listener = new TcpListener(ipAddress,4055);
listener.Start();
listener.BeginAcceptSocket(ClientConnected, listener);
}
private void ClientConnected(IAsyncResult result)
{
TcpListener server = (TcpListener)result.AsyncState;
using (TcpClient client = server.EndAcceptTcpClient(result))
using (NetworkStream stream = client.GetStream())
{
try
{
//SendNameMessage sendNameObj = Serializer.Deserialize<SendNameMessage>(stream);
SendNameMessage sendNameObj = Serializer.DeserializeWithLengthPrefix<SendNameMessage>(stream, PrefixStyle.Fixed32);
string name = sendNameObj.sendName;
if (name != null && name.Length > 0)
{
nameTextBox.Text = name;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
Đây là mã java của tôi:
SendNameMessage.Builder sendNameMessageObj = null;
sendNameMessageObj = SendNameMessage.newBuilder();
sendNameMessageObj.setSendName("Protobuf-net");
SocketRequest.INSTANCE.openSocket();
sendNameMessageObj.build().writTo(SocketRequest.INSTANCE.getWriter());
Marc, tôi tiếp tục nhận được ngoại lệ "Mã thông báo không hợp lệ: 0". Bạn có thể cho tôi biết điều này có ý nghĩa gì không? – sonu
@sonu - điều đó có nghĩa là nó đang tìm kiếm 0 lúc bắt đầu một loạt dữ liệu, đó là * không bao giờ * hợp lệ. Bạn có thể thêm bất kỳ chi tiết nào xung quanh dòng dữ liệu trông như thế nào và mã trông như thế nào khi bạn nhìn thấy điều này? –
Xin lỗi tôi mới tham gia stackoverflow. Tôi đã thêm mã bằng cách chỉnh sửa bài đăng. Khi tôi đóng socket ở phía bên java, tôi nhận được một ngoại lệ: "Đã cố gắng đọc qua cuối luồng" – sonu