在兩台電腦上同時運作本程式,可以實作點對點的聊天。
輸入對方IP,連接配接即可聊天。
源代碼:
類ClassListener,監聽通信資訊。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Threading;
using System.Net.Sockets;
using System.Windows.Forms;
namespace PToP
{
public class AddMessageEventArge : EventArgs
{
public string mess; //定義一個全局變量
}
class ClassListener
{
private Thread th;
private TcpListener tcp1;
public bool listenerRun = true;
public event EventHandler<AddMessageEventArge> OnAddMessage;
//啟動線程開始監聽
public void StartListen()
{
th = new Thread(new ThreadStart(Listen));
th.Start();
}
//停止監聽
public void stop()
{
tcp1.Stop();
th.Abort();
}
public void Listen()
{
try
{
IPAddress addr = new IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);
IPEndPoint iplocalendpoint = new IPEndPoint(addr, 5656);
tcp1 = new TcpListener(iplocalendpoint);
tcp1.Start();
while (listenerRun)
{
Socket s = tcp1.AcceptSocket();
string remote = s.RemoteEndPoint.ToString();
Byte[] stream = new Byte[512];
int i = s.Receive(stream);
string msg = "<" + remote + ">" + System.Text.Encoding.UTF8.GetString(stream);
AddMessageEventArge arg = new AddMessageEventArge();
arg.mess = msg;
OnAddMessage(this, arg);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
類ClassSender,實作發送聊天資訊
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Windows.Forms;
namespace PToP
{
class ClassSender
{
private string obj;
public ClassSender(string str)
{
obj=str;
}
public void Send(string str)
{
try
{
TcpClient tcpc = new TcpClient(obj, 5656);
NetworkStream tcpstream = tcpc.GetStream();
Byte[] data = System.Text.Encoding.ASCII.GetBytes(str);
tcpstream.Write(data, 0, data.Length);
tcpstream.Close();
tcpc.Close();
}
catch(Exception)
{
MessageBox.Show("連接配接被目标主機拒絕!");
}
}
}
}
窗體代碼中,添加連接配接目标計算機和發送聊天資訊的程式
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Net.Security;
namespace PToP
{
public partial class Form1 : Form
{
//定義委托
public delegate void InvokeDelegate();
public bool appRun = true;
private ClassListener Lie;
private ClassSender sen;
string Strs = "";
public Form1()
{
InitializeComponent();
}
private void button3_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void Form1_Load(object sender, EventArgs e)
{
}
//接收事件
void Lie_OnAddMessage(object sender, AddMessageEventArge e)
{
Strs = e.mess.ToString();
Invoke_Click(null, null);
}
//委托
private void Invoke_Click(object sender, EventArgs e)
{
textBox1.BeginInvoke(new InvokeDelegate(InvokeMethod));
}
public void InvokeMethod()
{
if (textBox1.Text == "")
{
textBox1.Text = Strs;
}
else
{
textBox1.Text = textBox1.Text + "/r/n" + Strs;
}
}
//連接配接目标計算機
private void button1_Click(object sender, EventArgs e)
{
try
{
//連接配接
Lie.listenerRun = false;
Lie.stop();
}
catch (NullReferenceException) { ;}
finally
{
Lie = new ClassListener();
Lie.OnAddMessage +=new EventHandler<AddMessageEventArge>(Lie_OnAddMessage);
Lie.StartListen();
}
}
//發送聊天記錄資訊
private void button2_Click(object sender, EventArgs e)
{
if (textBox3.Text == "")
{
MessageBox.Show("請輸入目标主機的IP位址");
}
else if (textBox2.Text == "")
{
MessageBox.Show("不能發送空資訊!");
}
else
{
IPAddress ipaddress = new System.Net.IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address);
if (textBox1.Text == "")
{
textBox1.Text = "<" + ipaddress.ToString() + "> " + textBox2.Text;
}
else
{
textBox1.Text =textBox1.Text +"/r/n"+ "<" + ipaddress.ToString() + "> " + textBox2.Text;
}
sen = new ClassSender(textBox3.Text);
sen.Send(textBox2.Text);
}
}
}
}