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.Sockets;
using System.Net;
using System.Threading;
namespace 客户端QQ
{
public partial class Form1 : Form
{
NetworkStream myNetworkStream;
TcpClient myTcpClient;
DateTime time;
String strTest,talk_mess;
string[] allIp=new string [100];//记录在线用户的Ip值
// TcpListener listener;
bool sign=true ;
adduser ad = new adduser(); //实例化另一个类
Byte[] myBytes;
byte[] myBufferBytes = new byte[1024];
public Form1()
{
myTcpClient = new TcpClient();
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
}
private void Client_Bt_Click(object sender, EventArgs e)// 通过输入的IP和端口号连接服务器
{
try
{
myTcpClient.Connect(IP_Tb .Text , Convert .ToInt32 (Dk_Tb .Text ));
State_Lb.Text = "联机成功!";
Client_Bt.Enabled = false;
string sendIp = nicky_Tbox.Text;
WriteData(sendIp );//向服务器发送客户端信息
Thread Read = new Thread(new ThreadStart ( ReadData));//创建接收服务器端用户列表信息
Read.Start();
Thread getmethod = new Thread(new ThreadStart (ad.getting));//创建等待其它客户端连接的线程
getmethod.Start();
}
catch(Exception ee)
{
MessageBox.Show(ee.Message+"客户端1" );
Client_Bt.Enabled = true;
}
}
private void WriteData(string Mess) //发送客户端用户名
{
try
{
myBytes = Encoding.ASCII.GetBytes(Mess);//引用Encoding类ASCII属性,将strTest转换为Byte类型数组对象
myNetworkStream = myTcpClient.GetStream();
myNetworkStream.Write(myBytes, 0, myBytes.Length);
}
catch (Exception ee)
{
MessageBox.Show (ee.Message +"客户端6");
}
}
private void ReadData() //监听服务器发来的用户在线信息
{
int www = 0, m = 0;
string[] take;
while (sign)//不断监听服务器发来的在线列表更新
{
try
{
www= myNetworkStream.Read(myBufferBytes, 0, myBufferBytes.Length);
string ss= Encoding.ASCII.GetString(myBufferBytes, 0, myBufferBytes.Length);
// MessageBox.Show("在线用户的信息为:"+ss );
if (www != 0)
{
m = 0;
MessageBox.Show(ss);
online_Lbox.Items.Clear();//每当服务器有新客户端加入,客户端就清空在线列表,进行从新写入最新在线名单
take = ss.Split('|');
for (int j = 2; j <= (Convert.ToInt32(take[0]) * 2) + 1; j += 2)//把所有用户的Ip储存到allIp数组里
{
allIp[m++] = take[j];
}
for (int i = 1; i <= (Convert.ToInt32(take[0]) * 2) + 1; i += 2)
{
online_Lbox.Items.Add(take[i]);
}
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message + "客户端2");
}
}
}
private void Send_Bt_Click(object sender, EventArgs e)
{
//time = DateTime.Now;
//strTest = time + "/n" + Send_Tb.Text;
//WriteData(strTest );
//tt(strTest );
}
public void tt(string ww)
{
string rrr;
rrr = ww;
label1.Text = ww;
if (ww == "SHAKE")
shak();
else
Mess_Lb.AppendText(ww );
}
private void shak() //晃动窗口
{
int recordx = this.Left; //保存原来窗体的左上角的x坐标
int recordy = this.Top; //保存原来窗体的左上角的y坐标
int rand = 20;
Random random = new Random();
for (int i = 0; i < 100; i++)
{
int x = random.Next(rand);
int y = random.Next(rand);
if (x % 2 == 0)
{
this.Left = this.Left + x;
}
else
{
this.Left = this.Left - x;
}
if (y % 2 == 0)
{
this.Top = this.Top + y;
}
else
{
this.Top = this.Top - y;
}
this.Left = recordx; //还原原始窗体的左上角的x坐标
this.Top = recordy; //还原原始窗体的左上角的y坐标
}
}
private void Close_Bt_Click(object sender, EventArgs e)//关闭按钮
{
sign = false ;
WriteData("EXIT");
// myNetworkStream.Close();
Thread.Sleep(500);
this.Close();
}
private void Send_Tb_TextChanged(object sender, EventArgs e)
{
}
private void online_Lbox_SelectedIndexChanged(object sender, EventArgs e)//双击在线用户列表的时候自动和所选用户取得连接
{
}
public string mm
{
get {
return talk_mess;
}
set {
talk_mess = value;
}
}
private void online_Lbox_MouseDoubleClick(object sender, MouseEventArgs e)
{
try
{
int g = online_Lbox.SelectedIndex;
string name = online_Lbox.Items[g].ToString();
string ip = allIp[g];
if (name == nicky_Tbox.Text )
MessageBox.Show("对不起,您不能和自己对话!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
else
{
//MessageBox.Show(ip);
TcpClient signal = new TcpClient();
signal.Connect(ip, 3);
MessageBox.Show("成功于另一个客户端取得联系IP:" + ip + "索引" + g.ToString());
Form2 form2 = new Form2();
form2.Show();
form2.Na = name;//对form2的属性赋值
form2.tt = signal;
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message + "客户端3");
}
}
}
public class adduser //创建个服务器,监听其他客户端发来的请求
{
TcpListener listener = new TcpListener(3);
Socket soo;
public static string getmessage;
Byte[] str = new byte[1024];
public void getting()
{
try
{
listener.Start();
while (true)
{
soo = listener.AcceptSocket();
MessageBox.Show("连接到客户端成功");
Thread fromOthers = new Thread(show);
fromOthers.Start();
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message +"客户端4");
}
}
public void show()
{
try
{
int num=0;
while (true)
{
num = soo.Receive(str);
if (num != 0)
{
MessageBox.Show(num.ToString());
getmessage = Encoding.ASCII.GetString(str, 0, num);
Thread hh = new Thread(new ThreadStart(charge));
hh.Start();
}
num=0;
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message +"客户端5");
}
}
public void charge()
{Form1 form = new Form1();
Form2 form2 = new Form2();
string fff = getmessage;
if (fff != "")
{
form.tt(fff );
// form2.dd = getmessage;
}
}
}
}
本文介绍了一个基于客户端QQ的网络通信系统,包括客户端如何通过输入IP和端口号连接服务器,实现用户在线状态的实时更新,以及客户端与在线用户之间的消息发送与接收功能。系统设计了用户列表管理模块,能够显示当前在线用户的IP地址,并允许客户端通过双击用户列表中的名字与之建立连接。此外,系统还包含了连接断开和消息发送的功能,确保了客户端与服务器及在线用户之间的稳定通信。
1884

被折叠的 条评论
为什么被折叠?



