В настоящее время я делаю чат, который является прямым соединением UDP. Я видел много предложений TCP-чата и третьего компьютера (сервера), но я этого не хотел. Чат должен работать только на месте, так как я тестировал и отлично разбираюсь в таких больших местах, как школа, работа или другие.Получать данные UDP с определенного порта, выводимого в richtextbox, сохраняя текст C#
До сих пор я получил его для отправки UDP-пакета при попадании Return в текстовое поле, но человек, которого я отправляю, не является швом, чтобы получить его в программу. Я использую Wireshark, чтобы проверить, действительно ли он подходит к нему, и это так. Я пробовал несколько поисков и тестов Google, но только шов, чтобы получить ошибки, или ничего не получал от программы.
Что я хочу, это переводчик, который получает UDP-пакет с определенного порта и отображает только текстовые данные из пакета. Я хочу, чтобы он отображался в richTextBox2, поддерживая то, что уже есть.
Вот код, и несколько скриншотов:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace chat
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// set this.FormBorderStyle to None here if needed
// if set to none, make sure you have a way to close the form!
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_NCHITTEST)
m.Result = (IntPtr)(HT_CAPTION);
}
private const int WM_NCHITTEST = 0x84;
private const int HT_CLIENT = 0x1;
private const int HT_CAPTION = 0x2;
private void pictureBox1_Click(object sender, EventArgs e)
{
colorDialog1.ShowDialog();
pictureBox1.BackColor = colorDialog1.Color;
this.BackColor = colorDialog1.Color;
}
private void button1_Click(object sender, EventArgs e)
{
}
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);
string IpAddress = textBox3.Text;
IPAddress serverAddr = IPAddress.Parse(IpAddress);
IPEndPoint endPoint = new IPEndPoint(serverAddr, 2522);
string text = textBox4.Text + ": " + richTextBox1.Text;
byte[] send_buffer = Encoding.ASCII.GetBytes(text);
sock.SendTo(send_buffer, endPoint);
richTextBox2.Text = richTextBox2.Text + Environment.NewLine + textBox4.Text + ": " + richTextBox1.Text;
richTextBox1.Text = "";
}
}
}
private void timer1_Tick(object sender, EventArgs e)
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
скриншоты:
Я недавно спрыгнул с Visual Basic на C#, и я m вид нового для сетевого материала. Большое спасибо, если вы готовы помочь :)
Вы экипировку близко сразу после того, как данные пересылаются becuase сокет объявлен в методе KeyDown. Не очень хорошая идея, потому что сокет может закрыться до фактического получения данных. сокет будет удален, когда вы вернетесь из метода KeyDown. – jdweng
хорошо, Wireshark показывает все это, и нет никаких проблем с отправкой, что так всегда – KrisPus
Когда происходит закрытие? Если вы не видите, что сообщение действительно получено, это не означает, что сообщение действительно досталось получателю. Закрытие фактически может добраться до получателя до последнего сообщения. – jdweng