您的位置:首页 > 其它

简单的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;
//}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: