怎么在C#中使用Socket实现局域网聊天
这篇文章将为大家详细讲解有关怎么在C#中使用Socket实现局域网聊天,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
成都创新互联专注于企业全网营销推广、网站重做改版、阳春网站定制设计、自适应品牌网站建设、H5页面制作、商城系统网站开发、集团公司官网建设、外贸营销网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为阳春等各大城市提供网站开发制作服务。
先运行一个java写的局域网聊天,效果图如下

后使用c#图形修改如下:

C#代码:
servlet服务端
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace Server
{
public partial class MainForm : Form
{
private TcpListener listener;
private Dictionary socketList;
private bool tag = true;
private StringBuilder charList;
public MainForm()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
void Bu_StartClick(object sender, EventArgs e)
{
cb_chatList.Items.Clear();
selectChat.Text="";
int port = 8888;
//创建服务端,并且启动
try{
listener = new TcpListener(IPAddress.Parse(ipAddress()),port);
listener.Start();
bu_Start.Enabled = false;
bu_stop.Enabled = true;
}catch(Exception ex)
{
MessageBox.Show("服务器启动失败, 原因:"+ex.Message);
bu_Start.Enabled = true;
bu_stop.Enabled = false;
return;
}
selectChat.Text = "服务器启动成功,访问IP:"+ipAddress()+" 端口号:"+port;
//记录住连接的客户端
socketList = new Dictionary();
charList = new StringBuilder();
//使用多线程,用于多个客户端接入
Thread th = new Thread(new ThreadStart(executeTask));
th.Start();
}
public void executeTask()
{
while(tag)
{
//等待用户连接
TcpClient client = null;
try{
client = listener.AcceptTcpClient();
}catch(Exception)
{
}
Thread th = new Thread(executeRead);
th.Start((Object)client);
}
}
public void executeRead(Object pamars)
{
//永久监听读取客户端
TcpClient client = pamars as TcpClient;
while(tag)
{
NetworkStream ns = client.GetStream();
StreamReader sr = new StreamReader(ns);
String msg = String.Empty;
String people = String.Empty;
try {
msg = sr.ReadLine();
if(msg.IndexOf("")!=-1)
{
msg = Regex.Split(msg,"=")[1];
cb_chatList.Items.Add(msg);
charList.Append(msg).Append("<@>");
socketList.Add(msg,client);
msg = "
欢迎【"+msg+"】光临
";
}
selectChat.AppendText(msg.Replace("
","\r\n"));
sendMsg(String.Empty,msg);
} catch (Exception) {
//MessageBox.Show(ex.Message.ToString());
break;
}
}
}
public void sendMsg(String target,String msg)
{
if(String.Empty!=target)
{
TcpClient client = socketList[target];
StreamWriter sw = new StreamWriter(client.GetStream());
sw.WriteLine(msg);
sw.Flush();
}else{
Dictionary.KeyCollection keyColl = socketList.Keys;
foreach (String name in keyColl)
{
StreamWriter sw = new StreamWriter(socketList[name].GetStream());
sw.WriteLine(msg+"<@=@>"+charList.ToString());
sw.Flush();
}
}
}
/*根据计算名获取IP地址*/
public String ipAddress()
{
IPAddress[] address = DNS.GetHostAddresses(Dns.GetHostName());
return address[2].ToString();
}
void ServerFromFormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = false;
if(tag)
tag = false;
if(listener!=null)
listener.Stop();
}
void Bu_stopClick(object sender, EventArgs e)
{
bu_Start.Enabled = true;
bu_stop.Enabled = false;
if(tag)
tag = false;
if(listener!=null)
listener.Stop();
}
}
} Client客户端
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
namespace Client
{
public partial class MainForm : Form
{
private System.Windows.Forms.Timer closeWindowTimer;
private StreamReader sr;
private StreamWriter sw;
private TcpClient tc;
private ClientLong cl;
private bool tag = true;
public MainForm(TcpClient tcp,ClientLong clo)
{
cl = clo;
tc = tcp;
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
bu_simple.Hide();
}
void ClientFromLoad(object sender, EventArgs e)
{
PiayCheckedChanged();
}
/*事件方法*/
public void PiayCheckedChanged()
{
closeWindowTimer = new System.Windows.Forms.Timer();
closeWindowTimer.Interval = 1000;
closeWindowTimer.Tick += new EventHandler(theout);
closeWindowTimer.Start();
}
/*执行的事件*/
public void theout(object source, EventArgs e)
{
//这里单独开一个线程用来显示信息
try{
Thread t1 = new Thread(new ThreadStart(readMsg));
t1.Start();
}catch(Exception)
{
}
}
void readMsg()
{
if(tag && tc!=null){
sr = new StreamReader(tc.GetStream());
String msg = sr.ReadLine();
String[] address = Regex.Split(msg,"<@=@>");
chatText.AppendText(address[0].Replace("
","\r\n"));
address = Regex.Split(address[1],"<@>");
cb_chatList.Items.Clear();
foreach (String s in address)
{
if(!String.IsNullOrEmpty(s) && s != cl.clientName)
cb_chatList.Items.Add(s);
}
}
}
void Button1Click(object sender, EventArgs e)
{
if(String.IsNullOrEmpty(textBox2.Text)){
MessageBox.Show("请输入消息");return;
}
sw = new StreamWriter(tc.GetStream());
sw.WriteLine("
"+cl.clientName+" "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"
"+textBox2.Text);
textBox2.Text = "";
sw.Flush();
}
void Bu_exitClick(object sender, EventArgs e)
{
MainFormFormClosing(null,null);
}
void Button2Click(object sender, EventArgs e)
{
chatText.Text = "";
}
void MainFormFormClosing(object sender, FormClosingEventArgs e)
{
closeWindowTimer.Stop();
cl.Close();
tag = false;
if(sr!=null)
sr.Close();
if(sw!=null)
sw.Close();
}
void Bu_simpleClick(object sender, EventArgs e)
{
String selected = cb_chatList.Text;
if(selected==null)
{
MessageBox.Show("请选择单聊对象");
return;
}
}
}
}C#是什么
C#是一个简单、通用、面向对象的编程语言,它由微软Microsoft开发,继承了C和C++强大功能,并且去掉了一些它们的复杂特性,C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程从而成为.NET开发的首选语言,但它不适用于编写时间急迫或性能非常高的代码,因为C#缺乏性能极高的应用程序所需要的关键功能。
关于怎么在C#中使用Socket实现局域网聊天就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
分享文章:怎么在C#中使用Socket实现局域网聊天
文章地址:http://www.jxjierui.cn/article/gpsiog.html


咨询
建站咨询
