简单的socket通讯
2011-11-11 15:23
211 查看
首先服务端
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net.Sockets; namespace Chat { class Program { int port = 4444;//端口号 List list=new List();//用于存放已经登录上线的客户端IP static void Main(string[] args) { new Program().listen(); } public void listen()//侦听客户端的端口 { try { TcpListener listener = new TcpListener(port); while (true)//循环侦听 { listener.Start();//侦听开启 Console.WriteLine("服务端开始运行..."); TcpClient tcp = listener.AcceptTcpClient(); NetworkStream network = tcp.GetStream(); Console.WriteLine("连接建立成功!"); string s = tcp.Client.RemoteEndPoint.ToString(); s = s.Substring(0, s.IndexOf(':'));//获取远程连接客户端的IP地址 if (list.Count != 0)//防止记录相同的IP地址 { for (int i = 0; i < list.Count; i++) { if (s == list[i]) { list.Remove(list[i]); } } } list.Add(s);//将获取到的IP地址存放于list泛型结合中 if (list.Count != 0)//如果list集合里面有数据的话,那么说明有人在线,则将在线人的地址发送过去 { StreamWriter sw = new StreamWriter(network); foreach (string str in list)//循环list中的内容并将其传送到客户端 { sw.WriteLine(str); } sw.Flush(); sw.Close(); } network.Close();//关闭流 listener.Stop(); } } catch (Exception e) { Console.WriteLine(e.Message); } } } }客户端,第一个窗体用于显示在线的ip地址,其窗体上有一个下拉列表框,和开始聊天的按钮
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Net.Sockets; namespace Chat { class Program { int port = 4444;//端口号 List list=new List();//用于存放已经登录上线的客户端IP static void Main(string[] args) { new Program().listen(); } public void listen()//侦听客户端的端口 { try { TcpListener listener = new TcpListener(port); while (true)//循环侦听 { listener.Start();//侦听开启 Console.WriteLine("服务端开始运行..."); TcpClient tcp = listener.AcceptTcpClient(); NetworkStream network = tcp.GetStream(); Console.WriteLine("连接建立成功!"); string s = tcp.Client.RemoteEndPoint.ToString(); s = s.Substring(0, s.IndexOf(':'));//获取远程连接客户端的IP地址 if (list.Count != 0)//防止记录相同的IP地址 { for (int i = 0; i < list.Count; i++) { if (s == list[i]) { list.Remove(list[i]); } } } list.Add(s);//将获取到的IP地址存放于list泛型结合中 if (list.Count != 0)//如果list集合里面有数据的话,那么说明有人在线,则将在线人的地址发送过去 { StreamWriter sw = new StreamWriter(network); foreach (string str in list)//循环list中的内容并将其传送到客户端 { sw.WriteLine(str); } sw.Flush(); sw.Close(); } network.Close();//关闭流 listener.Stop(); } } catch (Exception e) { Console.WriteLine(e.Message); } } } }第二个窗体用于开启聊天下面为用户开始聊天的发送端
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.Threading; using System.Net.Sockets; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Drawing; namespace ChatRoom { public partial class chatinfo : Form { string chatip; int chatport = 4445; public chatinfo() { InitializeComponent(); } public chatinfo(string ip)//传入聊天IP { InitializeComponent(); chatip = ip; } private void chatinfo_Load(object sender, EventArgs e) { Thread t = new Thread(mythread); t.IsBackground = true; t.Start(); //Thread t2 = new Thread(format); //t2.IsBackground = true; //t2.Start(); } private void mythread()//线程T的方法 { chatserice c = new chatserice(chatport, listBox1); c.listen(); } //private void format()//发送图片委托 //{ //} private void button1_Click(object sender, EventArgs e)//发送 { try { TcpClient tcp = new TcpClient(chatip, chatport); NetworkStream network = tcp.GetStream(); StreamWriter sw = new StreamWriter(network); sw.WriteLine(textBox1.Text); sw.Flush(); sw.Close(); network.Close(); listBox1.Items.Add( " " + textBox1.Text + " " + DateTime.Now.ToLocalTime()); textBox1.Text = ""; } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button2_Click(object sender, EventArgs e)//发送图片 { try { BinaryFormatter bf = new BinaryFormatter(); //序列化 Bitmap bit = new System.Drawing.Bitmap(pictureBox1.Image); TcpClient tcpc = new TcpClient(); NetworkStream n = tcpc.GetStream(); bf.Serialize(n, bit); StreamWriter sw = new StreamWriter(n); sw.Flush(); sw.Close(); n.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } //private void chatinfo_FormClosed(object sender, FormClosedEventArgs e) //{ // Form1 f = new Form1(); // f.Show(); //} } }有发送肯定还得接收,下面则是对文件的接收
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.IO; using System.Windows.Forms; using System.Runtime.Serialization.Formatters.Binary; using System.Drawing; namespace ChatRoom { /// /// 用于客户端之间的通讯的侦听 /// /// class chatserice { int chatport; string s; ListBox r = new ListBox(); string myip; delegate void del(string s); PictureBox pb = new PictureBox(); chatinfo chat = new chatinfo(); delegate void imagedel(Image i); Image img; public chatserice(int port,ListBox rt) { chatport = port; r = rt; } //public chatserice(int port, PictureBox p)//构造函数重载 //{ // chatport = port; // pb = p; //} //private void lietenimage() //{ // TcpListener tl = new TcpListener(chatport); // tl.Start(); // TcpClient yc = tl.AcceptTcpClient(); // NetworkStream nws = yc.GetStream(); // StreamReader sr = new StreamReader(nws); // BinaryFormatter bf = new BinaryFormatter(); // img=(Image)bf.Deserialize(nws); // if (pb.InvokeRequired) // { // pb.Invoke(new imagedel(showimage),img); // //pb.Image = (Image)bf.Deserialize(nws); // } //} public void listen()//侦听连接服务端 { try { TcpListener tcp = new TcpListener(chatport); while (true) { tcp.Start(); TcpClient client = tcp.AcceptTcpClient(); NetworkStream net = client.GetStream(); myip = client.Client.RemoteEndPoint.ToString(); myip = myip.Substring(0, myip.IndexOf(':')); StreamReader sr = new StreamReader(net); s=sr.ReadLine(); if (s != null) { chat.Show(); } if (r.InvokeRequired) { r.Invoke(new del(showinfo), s); } tcp.Stop(); net.Close(); sr.Close(); } } catch (Exception e) { MessageBox.Show(e.Message); } } public void showinfo(string s)//委托回调方法 { r.Items.Add(myip + " " + s + " " + DateTime.Now.ToLocalTime()); } //public void showimage(Image i) //{ // pb.Image = i; //} } }
相关文章推荐
- Java 简单的Socket通讯的客户端实现
- java swing实现简单的socket通讯聊天程序源码
- socket 服务器端与客户端简单通讯
- 简单的socket通讯
- socket TCP简单通讯
- Java实现简单的Socket服务器与客户端字符串通讯(适合初学者阅读)
- 用java写的基于Socket的简单即时通讯程序
- NodeJS+Express+Socket.io的简单及时通讯
- Netty框架的简单使用,实现socket通讯
- Java实现简单的Socket服务器与客户端字符串通讯(适合初学者阅读)
- windows的socket_tcp服务端与linux的socket_tcp客服端简单通讯
- 一个简单的基于socket的通讯处理程序
- socket UDP简单通讯
- 一个简单而又灵活的IOCP模块——完成端口通讯服务器(IOCP Socket Server)设计(四)
- [转]基于C#的Socket简单通讯
- socket通讯简单例子
- 运维人的Python有趣小程序,Socket通讯简单实例
- 用java写的基于Socket的简单即时通讯程序
- Socket简单通讯
- 最简单的Socket通讯