实例介绍
实验内容:基于服务器的客户端相互直接通信
具体要求包括:
1,Server支持多客户访问;
2,C与S之间使用TCP连接;
3,C与C之间直接通信(不是通过S传递)。
4,C与C之间直接通信既可以使用TCP,也可以使用UDP。
5,可以使用Socket,也可以使用TcpClient/UdpClient等;
【实例截图】

【核心代码】
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SyncChatClient
{
public partial class Client : Form
{
private bool isExit = false;
private TcpClient client;
private BinaryReader br;
private BinaryWriter bw;
private List<User> userList = new List<User>();
private TcpListener myListener;
IPAddress localAddress;
private static int myport;
public Client()
{
InitializeComponent();
Random r = new Random((int)DateTime.Now.Ticks);
textBoxUserName.Text = "User" r.Next(100, 999);
listBoxOnline.HorizontalScrollbar = true;
//---------------------c-c----------------------------------
IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName());
localAddress = addrIP[0];
while (true)
{
myport = r.Next(2049, 8888);
try
{
myListener = new TcpListener(localAddress, myport);
break;
}
catch
{
//如果端口不可用
}
}
myListener.Start();
Thread myThread = new Thread(ListenClientConnect);
myThread.IsBackground=true;
myThread.Start();
}
//---------------------c-c----------------------------------
private void ListenClientConnect()
{
TcpClient newClient = null;
while (true)
{
try
{
newClient = myListener.AcceptTcpClient();
}
catch
{
break;
}
User user = new User(newClient);
Thread threadReceive = new Thread(ServerReceive);
threadReceive.Start(user);
threadReceive.IsBackground = true;
}
}
//---------------------c-c----------------------------------
private void ServerReceive(Object userState) //客户端充当server的接收方法
{
User user = (User)userState ;//////////////////////////////////////////
TcpClient client = user.client;
while (isExit == false)
{
string receiveString = null;
try
{
receiveString = user.br.ReadString();
AddTalkMessage(receiveString);
}
catch
{
if (isExit == false)
{
user.Close();
AddTalkMessage("接收信息失败");
}
break;
}
}
user.Close();
}
private void buttonConnect_Click(object sender, EventArgs e)
{
buttonConnect.Enabled = false;
try
{
client = new TcpClient(Dns.GetHostName(), 51888);
AddTalkMessage("连接成功");
NetworkStream networkStream = client.GetStream();
br = new BinaryReader(networkStream);
bw = new BinaryWriter(networkStream);
SendMessage("Login," textBoxUserName.Text "," localAddress "," myport);
Thread threadReceive = new Thread(new ThreadStart(ReceiveData));
threadReceive.IsBackground = true;
threadReceive.Start();
}
catch
{
AddTalkMessage("连接失败");
buttonConnect.Enabled = true;
return;
}
AddOnline("Server"); //添加在线者——Server
}
private void ReceiveData() //客户端是client的接收方法
{
string receiveString = null;
while (isExit == false)
{
try
{
receiveString = br.ReadString();
}
catch
{
if (isExit == false)
{
MessageBox.Show("与服务器失去联系。");
}
break;
}
string[] splitString = receiveString.Split(',');
string command = splitString[0].ToLower();
switch (command)
{
case "login":
AddOnline(receiveString);
break;
case "logout":
RemoveUserName(splitString[1]);
break;
case "talk":
AddTalkMessage(splitString[1] "对我说:" receiveString.Substring(splitString[0].Length splitString[1].Length 2));
break;
default:
AddTalkMessage("什么意思啊:" receiveString);
break;
}
}
Application.Exit();
}
private void SendMessage(string message)
{
try
{
bw.Write(message);
bw.Flush();
}
catch
{
AddTalkMessage("发送失败!");
}
}
private delegate void MessageDelegate(string message);
private void AddTalkMessage(string message)
{
if (richTextBoxTalkInfo.InvokeRequired)
{
MessageDelegate d = new MessageDelegate(AddTalkMessage);
richTextBoxTalkInfo.Invoke(d, new object[] { message });////////////
}
else
{
richTextBoxTalkInfo.AppendText(message Environment.NewLine);
richTextBoxTalkInfo.ScrollToCaret();
}
}
private delegate void AddOnlineDelegate(string message);
private void AddOnline(string message) //把新用户添加道listBox并储存在userList中(保存ip端口)
{
if (message == "Server")
{
if (listBoxOnline.InvokeRequired)
{
AddOnlineDelegate d = new AddOnlineDelegate(ToAddOnline);
listBoxOnline.Invoke(d, message);
}
else
{
ToAddOnline(message);
}
User u = new User("Server", Dns.GetHostName(), 51888);
userList.Add(u);
return;
}
string[] splitString = message.Split(',');
int port1;
if (listBoxOnline.InvokeRequired)
{
AddOnlineDelegate d = new AddOnlineDelegate(ToAddOnline);
listBoxOnline.Invoke(d, splitString[1]);
}
else
{
ToAddOnline(splitString[1]);
}
port1 = int.Parse(splitString[3]);
User user = new User(splitString[1], splitString[2], port1);
userList.Add(user);
}
private void ToAddOnline(string message)
{
listBoxOnline.Items.Add(message);
listBoxOnline.SelectedIndex = listBoxOnline.Items.Count - 1;
listBoxOnline.ClearSelected();
}
private delegate void RemoveUserNameDelegate(string userName);
private void RemoveUserName(string userName)
{
if (listBoxOnline.InvokeRequired)
{
RemoveUserNameDelegate d = RemoveUserName;
listBoxOnline.Invoke(d, userName);
}
else
{
listBoxOnline.Items.Remove(userName);
listBoxOnline.SelectedIndex = listBoxOnline.Items.Count - 1;
listBoxOnline.ClearSelected();
}
}
private void buttonSend_Click(object sender, EventArgs e)
{
if (listBoxOnline.SelectedIndex != -1)
{
SendMessage("Talk," listBoxOnline.SelectedItem "," textBoxSend.Text);
AddTalkMessage("我对" listBoxOnline.SelectedItem "说:" textBoxSend.Text);
textBoxSend.Clear();
}
else
{
MessageBox.Show("请先在[当前在线]中选择一个对话者");
}
}
private void Client_FormClosing(object sender, FormClosingEventArgs e)
{
if (client != null)
{
SendMessage("Logout," textBoxUserName.Text);
isExit = true;
br.Close();
bw.Close();
client.Close();
}
}
private void Client_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (Char)Keys.Return)
{
buttonSend.PerformClick();
}
}
private void buttonTcpSend_Click(object sender, EventArgs e)
{
User myUser;
if (listBoxOnline.SelectedIndex != -1)
{
for(int i = 0; i < listBoxOnline.SelectedItems.Count; i )
{
foreach(User u in userList)
{
if (u.userName.Equals("Server"))
{
//
}
else if (u.userName.Equals(listBoxOnline.SelectedItems[i].ToString()))
{
try
{
IPAddress ip = IPAddress.Parse(u.ip);
///IPEndPoint iep = new IPEndPoint(ip, u.port);
//TcpClient myClient = new TcpClient();
//myClient.Connect(iep); //connect一直出错,ip没问题,奇怪
TcpClient myClient = new TcpClient(Dns.GetHostName(), u.port);
myUser = new User(myClient);
myUser.bw.Write(textBoxUserName.Text "向我发来TCP消息:" textBoxSend.Text);
}
catch
{
AddTalkMessage("发送失败");
}
}
}
AddTalkMessage("向" listBoxOnline.SelectedItem "发送TCP消息:" textBoxSend.Text);
}
textBoxSend.Clear();
}
else
{
MessageBox.Show("请先在[当前在线]中选择一个对话者");
}
}
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论