110,499
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace Chat {
public partial class ChatRoom : Form {
private int port = 8000;
private UdpClient client;
private IPEndPoint ip;
public ChatRoom() {
InitializeComponent();
InitUdp();
}
#region
private void ChatRoom_FormClosing(object sender, FormClosingEventArgs e) {
this.Dispose(true);
}
#region Send Message
private void SendMessage(string str,IPEndPoint ip) {
client = new UdpClient();
client.Connect(ip);
byte[] sMsg = Encoding.ASCII.GetBytes(str);
try {
client.Send(sMsg, sMsg.Length);
}
catch (Exception exp) {
throw exp;
}
finally {
this.tbMessage.Text = "";
}
}
#endregion
#region Recive
private void InitUdp() {
ip = new IPEndPoint(IPAddress.Any, port);
client = new UdpClient(ip);
RequestState rs = new RequestState();
rs.ip = ip;
rs.client = client;
client.BeginReceive(new AsyncCallback(ReqCallback), rs);
}
private void ReqCallback(IAsyncResult ar) {
RequestState rs = (RequestState)ar.AsyncState;
UdpClient client = rs.client;
IPEndPoint ip = rs.ip;
rs.buffer = client.EndReceive(ar, ref ip);
this.Invoke(new MessageDelegate(Message), rs);
}
private delegate void MessageDelegate(RequestState rs);
private void Message(RequestState rs) {
this.tbContent.Text += "From Server:"+Encoding.ASCII.GetString(rs.buffer)+"\n";
}
#endregion
private void btnSend_Click(object sender, EventArgs e) {
ip = new IPEndPoint(IPAddress.Parse(tbIp.Text), 8000);
if (!string.IsNullOrEmpty(tbMessage.Text.Trim()))
if (!string.IsNullOrEmpty(tbIp.Text.Trim()))
SendMessage(tbMessage.Text, ip);
}
#endregion
private void btnEsc_Click(object sender, EventArgs e) {
this.Dispose(true);
}
}
public class RequestState {
public RequestState() { }
public UdpClient client;
public IPEndPoint ip;
public byte[] buffer;
}
}
Byte[] data = this.client.Receive(ref endpoint);
Byte[] data = this.client.Receive(ref endpoint);
client = new UdpClient();
client.Connect(ip);
byte[] sMsg = Encoding.ASCII.GetBytes(str);
try {
client.Send(sMsg, sMsg.Length);
}
catch (Exception exp) {
throw exp;
}
finally {
this.tbMessage.Text = "";
}
Thread thread = new Thread(new ThreadStart(Listen));
thread.Start();
private void Listen() {
string message = string.Empty;
while (true) {
IPEndPoint endpoint = null;
Byte[] data = this.client.Receive(ref endpoint);
if (data != null) {
message = Encoding.ASCII.GetString(data);
this.Invoke(new MessageDelegateString(Message), message);
}
Thread.Sleep(100);
}
}
private void InitUdp() {
ip = new IPEndPoint(IPAddress.Any, port);
client = new UdpClient(ip);
RequestState rs = new RequestState();
rs.ip = ip;
rs.client = client;
client.BeginReceive(new AsyncCallback(ReqCallback), rs);
}
private void ReqCallback(IAsyncResult ar) {
RequestState rs = (RequestState)ar.AsyncState;
UdpClient client = rs.client;
IPEndPoint ip = rs.ip;
rs.buffer = client.EndReceive(ar, ref ip);
this.Invoke(new MessageDelegate(Message), rs);
client.BeginReceive(new AsyncCallback(ReqCallback), rs);//这里实现向系统投递下一个请求,但是不行
}
private void ReqCallback(IAsyncResult ar) {
RequestState rs = (RequestState)ar.AsyncState;
UdpClient client = rs.client;
IPEndPoint ip = rs.ip;
rs.buffer = client.EndReceive(ar, ref ip);
this.Invoke(new MessageDelegate(Message), rs);
//下面想办法接着异步就可以了
//比如:
/*
ip = new IPEndPoint(IPAddress.Any, port);
RequestState rs = new RequestState();
rs.ip = ip;
rs.client = client;
client.BeginReceive(new AsyncCallback(ReqCallback), rs);
*/
}
private void Form1_Load(object sender, System.EventArgs e)
{
#region ----InitSocket----
try
{
string hostname=Dns.GetHostName();
IPHostEntry hostip=Dns.Resolve(hostname);
IPAddress[] addrList=hostip.AddressList;
if(addrList.Length >0)
{
try
{
this._mClient = new UdpClient(_AcptSocket);//初始化udp
}
catch(Exception ex)
{ MessageBox.Show("接收端口被占用,请修改配置文件调整端口!");
}
}
}
catch
{
}
this._Listen = new Thread(new ThreadStart(this.Listener));
this._Listen.IsBackground = true;
this._Listen.Start();
}
public void Listener()
{
Thread.Sleep(30);
while(true)
{
IPEndPoint endpoint = null;
Byte[] data = this._mClient.Receive(ref endpoint);
}
}
}
Thread thread = new Thread(new ThreadStart(InitUdp));
thread.Start();
private void InitUdp() {
ip = new IPEndPoint(IPAddress.Any, port);
client = new UdpClient(ip);
RequestState rs = new RequestState();
rs.ip = ip;
rs.client = client;
while (true) {
rs.buffer = this.client.Receive(ref rs.ip);
if(rs.ip!=null)
this.Invoke(new MessageDelegate(Message), rs);
}
//client.BeginReceive(new AsyncCallback(ReqCallback), rs);
}
public void Listener()
{
while(true)
{
IPEndPoint endpoint = null;
Byte[] data = this._mClient.Receive(ref endpoint);
}
}