1、主界面 

2、源代码                                                        

Client

public partial class FormClient : Form
{
//声明一个Socket
public Socket newClient;
//判断是否连接成功
public bool isConnected;
//定义一个线程
public Thread myThread;
//定义一个委托
public delegate void MyInvoke(string str);
public FormClient()
{
InitializeComponent();
} private void Connection()
{
//IPAddress ip=null;
//int port=888;
byte[]data=new byte[];
//创建一个新的Socket
newClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//获取IP地址
#region GetIP
//if (txtIP.Text == string.Empty)
//{
// MessageBox.Show("远程IP不能为空");
//}
//else
//{
// string pattrn = @"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))";
// if (System.Text.RegularExpressions.Regex.IsMatch(txtIP.Text.Trim(), pattrn))
// {
// ip = IPAddress.Parse(txtIP.Text.Trim());
// }
// else
// {
// MessageBox.Show("IP地址格式不正确!");
// }
//} #endregion
//获取端口号
#region GetPort
//if (System.Text.RegularExpressions.Regex.IsMatch(@"^[-]?\d+[.]?\d*$", txtPort.Text.Trim()))
//{
// port = Convert.ToInt32(txtPort.Text.Trim());
//}
//else
//{
// MessageBox.Show("端口号格式不正确");
//}
#endregion
//封装网络端点
IPEndPoint ie = new IPEndPoint(IPAddress.Parse(txtIP.Text.Trim()),Convert.ToInt32(txtPort.Text.Trim()));
#region Connection
try
{
//建立与远程主机之间的连接
newClient.Connect(ie);
//设置连接服务器控件的属性
// btnConnection.Enabled = false;
//设置连接状况
btnConnection.Text = "停止连接";
//isConnected = true;
}
catch (SocketException ex)
{
MessageBox.Show("连接服务器失败" + ex.Message);
return;
}
#endregion
//启动当前线程用于接收消息
ThreadStart myThreadDelegate = new ThreadStart(ReceiveMessage);
myThread = new Thread(myThreadDelegate);
myThread.Start();
}
/// <summary>
/// 接收消息
/// </summary>
public void ReceiveMessage()
{
while (true)
{
//定义字节数组大小
byte[]data=new byte[];
//获取数组长度
int recv = newClient.Receive(data);
//接收数据
string strData = Encoding.UTF8.GetString(data, , recv);
//显示信息
ShowMessage(newClient.RemoteEndPoint.ToString()+":"+strData+"\r\n");
}
}
/// <summary>
/// 显示消息
/// </summary>
/// <param name="msg">接收的消息,可能来自Client/也可能来自Server</param>
public void ShowMessage(string msg)
{
//如果是在创建该控件以外的线程调用该控件
if (lbMessage.InvokeRequired)
{
MyInvoke myInvoke = new MyInvoke(ShowMessage);
//lbMessage.Invoke(myInvoke, new object[] { msg });
lbMessage.Invoke(myInvoke,new object[]{"远程主机:"+msg});
}
else
{
lbMessage.Items.Add(msg);
}
} private void btnSend_Click(object sender, EventArgs e)
{
if (txtSendMessage.Text == null)
{
txtSendMessage.Text = "发送消息不能为空";
//停留1秒消失
}
else
{
//获取发送数据长度
int myMessLength = txtSendMessage.Text.Length;
//将数据转换为字节数组
byte[] data = new byte[myMessLength];
data = Encoding.UTF8.GetBytes(txtSendMessage.Text);
//发送数据
int i = newClient.Send(data);
//将数据显示在Client
ShowMessage("我说:" + txtSendMessage.Text + "\r\n");
}
} private void btnConnection_Click(object sender, EventArgs e)
{
if (btnConnection.Text == "连接服务")
{
Connection();
}
else
{
newClient.Close();
}
} private void FormClient_Load( object sender, EventArgs e )
{ } }

Server

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public Thread myThread;//声明一个线程实例
public Socket newSocket;//声明一个Socket实例
public Socket serverSocket;//声明服务端Socket实例
public Socket clientSocket;//声明客户端Socket
public delegate void MyInvoke(string str);//声明一个委托
public IPEndPoint localEP;//声明本地网络端点
public EndPoint remote;//声明网络地址
public int localPort;//声明本地端口号
public Boolean isListening;//声明服务端是否监听
public Hashtable _sessionTable;//用于记录用户信息
public bool btnState=true;
//设置服务端监听的端口号属性
public int SetPort
{
get { return localPort; }
set { localPort = value; }
}
//设置监听
public void Listening()
{
SetPort = int.Parse(txtPort.Text.Trim());//设置端口号
newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化Socket实例
newSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);//允许Socket被绑定在已使用的地址上
localEP = new IPEndPoint(IPAddress.Any, SetPort);//初始化网络端点信息
try
{
_sessionTable = new Hashtable( );
newSocket.Bind(localEP);//绑定端口
newSocket.Listen();//开始监听
newSocket.BeginAccept(new AsyncCallback(OnConnectRequest),newSocket);//开始异步接受连接
}
catch(Exception ex)
{
ShowMessage(ex.ToString());
} }
private void btnStartServer_Click(object sender, EventArgs e)
{
ThreadStart myThreadDelegate = new ThreadStart(Listening);//新建一个线程用于委托
myThread = new Thread(myThreadDelegate);
if (btnState)
{
myThread.Start();
stateBar.Text = "服务已经启动,等待客户端连接";
btnState = false;
btnStartServer.Text = "停止服务";
}
else
{
myThread.Interrupt();
myThread.Abort();
btnState = true;
btnStartServer.Text = "开始服务";
stateBar.Text = "服务已停止";
}
}
//显示信息
public void ShowMessage(string msg)
{
if (rtbMessage.InvokeRequired)
{
MyInvoke myInvoke = new MyInvoke(ShowMessage);
rtbMessage.Invoke(myInvoke, new object[] { msg });
}
else
{
rtbMessage.AppendText(msg);
}
}
public void OnConnectRequest(IAsyncResult ar)
{
serverSocket = (Socket)ar.AsyncState;
clientSocket = serverSocket.EndAccept(ar);//异步接收连接
string welcomeStr = "欢迎登陆到服务器";
byte[] data = System.Text.Encoding.UTF8.GetBytes(welcomeStr);
remote = clientSocket.RemoteEndPoint;//获取远程终点信息
ShowMessage(remote.ToString()+" 连接成功 "+DateTime.Now.ToString()+"\r\n");
clientSocket.Send(data,data.Length,);
UserListOperate(clientSocket.RemoteEndPoint.ToString());
_sessionTable.Add(clientSocket.RemoteEndPoint,null);//将连接成功的客户端实例添加到哈希表中
serverSocket.BeginAccept(new AsyncCallback(OnConnectRequest), serverSocket);//等待新的客户端连接
//接收数据
ReceiveMessage();
}
//接收数据
public void ReceiveMessage ()
{
while (true)
{
byte[]data=new byte[];
int recv = clientSocket.Receive( data );
string message = Encoding.UTF8.GetString(data,,recv);
ShowMessage(clientSocket.RemoteEndPoint.ToString()+":"+message+"\r\n");
}
}
//添加用户列表
public void UserListOperate(string msg)
{
//在线程里以安全的方式调用控件
if (lbUserList.InvokeRequired)
{
MyInvoke myInvoke = new MyInvoke(UserListOperate);
lblUserList.Invoke(myInvoke, new object[] { msg });
}
else
{
lbUserList.Items.Add(msg);
}
}
//删除用户列表
public void UserListOperateRemove(string msg)
{
if (lbUserList.InvokeRequired)
{
MyInvoke myInvoke = new MyInvoke(UserListOperateRemove);
lbUserList.Invoke(myInvoke, new object[] { msg });
}
else
{
lbUserList.Items.Remove(msg);
}
}
//发送广播
public void BroadCast()
{
string strMessage = txtMessage.Text;
Byte[] data = Encoding.UTF8.GetBytes(strMessage);
foreach (DictionaryEntry item in _sessionTable)
{
EndPoint temp = (EndPoint)item.Key;
clientSocket.SendTo(data, temp);
ShowMessage("我:"+strMessage+"\r\n");
}
txtMessage.Text = "";
}
private void Form1_Load(object sender, EventArgs e)
{
//获取本机IP
IPAddress[] ip = Dns.GetHostByName( Dns.GetHostName() ).AddressList;
lblIP.Text+=ip[].ToString();
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//窗体关闭时判断线程是否为空
if (myThread != null)
{
myThread.Abort();
}
throw new Exception();
} private void btnSend_Click(object sender, EventArgs e)
{
BroadCast();
}
}

如有不当之处,烦请指教。

C#网络编程简单实现通信小例子-2的更多相关文章

  1. C#网络编程简单实现通信小例子-1

    1.主界面 2.源程序 Send public partial class formUdpSend : Form { //声明一个UdpClient对象 UdpClient udpClient; pu ...

  2. 网络编程 单纯UDP通信

    网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...

  3. Socket网络编程--简单Web服务器(6)

    本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息 ...

  4. java即时通信小例子

    学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...

  5. 《UNIX网络编程》TCP客户端服务器例子

    最近在看<UNIX网络编程>(简称unp)和<Linux程序设计>,对于unp中第一个获取服务器时间的例子,实践起来总是有点头痛的,因为作者将声明全部包含在了unp.h里,导致 ...

  6. Linux网络编程简单示例

    linux 网络编程是通过socket(套接字)接口实现,Socket是一种文件描述符,socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭& ...

  7. Java入门网络编程-使用UDP通信

    程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...

  8. 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子

    原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...

  9. JAVA基础知识之网络编程——-基于TCP通信的简单聊天室

    下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...

随机推荐

  1. 开发技巧01——改变Toast显示位置

    1.获得Toast对象——Toast toast = Toast.makeText(this, "Top Left!", Toast.LENGTH_SHORT); 2.Toast对 ...

  2. linux-搜索

    grep显示文件中的匹配行     grep  参数  字符串  文件名 -c 输出匹配的行数 -v输出不匹配行 不加参数  :输出匹配的行 经常和管道符一起使用 eg:ps -ef|grep tom ...

  3. 给jdk写注释系列之jdk1.6容器(8)-TreeSet&NavigableMap&NavigableSet源码解析

    TreeSet是一个有序的Set集合. 既然是有序,那么它是靠什么来维持顺序的呢,回忆一下TreeMap中是怎么比较两个key大小的,是通过一个比较器Comparator对不对,不过遗憾的是,今天仍然 ...

  4. 类、对象以及jvm运行内存解析

    一.JVM内存的分析: 第一步:存放在硬盘上的程序首先要被加载到内存空间中. 第二步:内存中的jvm找到程序中main函数作为入口,然后开始执行. 第三步:执行过程中的内存管理:内存分为四个部分: 栈 ...

  5. [设计模式]<<设计模式之禅>>关于迪米特法则

    迪米特法则(Law of Demeter,LoD)也称为最少知识原则(Least KnowledgePrinciple,LKP),虽然名字不同,但描述的是同一个规则:一个对象应该对其他对象有最少的了解 ...

  6. Android异常:异步任务导致的窗口句柄泄漏问题

    05-05 10:36:41.009: E/WindowManager(4243): Activity com.tao.MyActivity has leaked window com.android ...

  7. input两种默认显示文字方式

    First Note: placeholder属性 规定帮助用户填写输入字段的提示,值不会被提交, 且该提示会在输入字段为空时显示,并会在字段获得焦点时消失. 如 <input type=&qu ...

  8. Redis - 发布/订阅模式

    Redis 提供了一组命令可以让开发者实现 “发布/订阅” 模式.“发布/订阅” 可以实现进程间的消息传递,其原理是这样的: “发布/订阅” 模式中包含两种角色,分别是发布者和订阅者.订阅者可以订阅一 ...

  9. Wireshark - 观察 ARP 地址解析过程

    下面使用 Wireshark 分析 ARP 的工作过程.试验的机器:发送者机器(IP 地址:10.21.28.47,MAC 地址:68:f7:28:0f:32:2e)下文称为 HOSTA:目标机器(I ...

  10. Windows命令实现Sleep

    等待一分钟:ping 192.0.2.2 -n 1 -w 60000 > nul 等待一秒钟:ping 192.0.2.2 -n 1 > nul (ping一次需要一秒钟) -w 6000 ...