java与c#使用Socket实现局域网聊天

来源:互联网 发布:淘宝网警用手铐脚铐 编辑:程序博客网 时间:2024/06/10 01:31

先运行一个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<String,TcpClient> 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<String,TcpClient>();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("<clientName>")!=-1){msg = Regex.Split(msg,"=")[1];        cb_chatList.Items.Add(msg);               charList.Append(msg).Append("<@>");socketList.Add(msg,client);msg = "<br>欢迎【"+msg+"】光临<br>";}selectChat.AppendText(msg.Replace("<br>","\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<String,TcpClient>.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("<br>","\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("<br>"+cl.clientName+"  "+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")+"<br> "+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;}}}}

补充:

1:上传下载文件、聊天表情、私聊、踢人.......都是可以扩展的功能。

只是目前还没有可执行的思路,希望有相同爱好者多多提出宝贵意见。我会继续关注。

1 0
原创粉丝点击