C#网络编程简单实现通信小例子-2
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的更多相关文章
- C#网络编程简单实现通信小例子-1
1.主界面 2.源程序 Send public partial class formUdpSend : Form { //声明一个UdpClient对象 UdpClient udpClient; pu ...
- 网络编程 单纯UDP通信
网络编程 单纯UDP通信 1,UDP发送端 2,UDP接收端 UDP发送端: #include <stdio.h> #include <unistd.h> #include & ...
- Socket网络编程--简单Web服务器(6)
本来是想实现ssl连接的,但是弄了好久都不成功,就索性不做了,等以后有能力再做了.所以这一小节就是本次的最后一节了.就简单的说几个注意点. 1.加个配置文件 使用单例模式,使用一个类,该类保存一些信息 ...
- java即时通信小例子
学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是 ...
- 《UNIX网络编程》TCP客户端服务器例子
最近在看<UNIX网络编程>(简称unp)和<Linux程序设计>,对于unp中第一个获取服务器时间的例子,实践起来总是有点头痛的,因为作者将声明全部包含在了unp.h里,导致 ...
- Linux网络编程简单示例
linux 网络编程是通过socket(套接字)接口实现,Socket是一种文件描述符,socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开—读/写—关闭& ...
- Java入门网络编程-使用UDP通信
程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...
- 【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
原地址:http://www.cnblogs.com/xuling/archive/2013/03/04/2943154.html 最近开始研究U3D,它的强大就不多说了, 今天研究了研究射线相关东西 ...
- JAVA基础知识之网络编程——-基于TCP通信的简单聊天室
下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...
随机推荐
- spring mvc 使用Optional
return Optional.ofNullable(brokerRepository.findOne(id)) .map(broker -> new ResponseEntity<> ...
- struts2 后台action向前端JSP传递参数的问题
后台有个方法,里面部分代码如下: System.out.print("alter:"+user.getId()); User temp=userservice.getUserByU ...
- cvSaveImage的第三个参数
http://stackoverflow.com/questions/801054/opencv-cvsaveimage-jpeg-compression-factor #define CV_IM ...
- [改善Java代码]不要让四舍五入亏了一方
建议25: 不要让四舍五入亏了一方 本建议还是来重温一个小学数学问题:四舍五入.四舍五入是一种近似精确的计算方法,在Java 5之前,我们一般是通过使用Math.round来获得指定精度的整数或小数的 ...
- Angular 2.0 从0到1 (四)
第一节:Angular 2.0 从0到1 (一)第二节:Angular 2.0 从0到1 (二)第三节:Angular 2.0 从0到1 (三)第四节:Angular 2.0 从0到1 (四)第五节: ...
- wap测试学习
注意要点 UI元素 修改源码 物理键操作(回车.确认) 焦点 习惯性操作(前进.后退.屏幕翻转和停止) 刷新 重启服务器 重启浏览器 异常关闭 书签 cookies/session 缓存 接口 URL ...
- IT技术开发人员35岁之前应该做的十件事
第一,学会本行业所需要的一切知识并有所发展.已故零件大王布鲁丹在他35岁时,已经成为零件行业的领袖,并且组建了年收入达千万美元的海湾与西部工业公司.每个人在年轻时都可能有过彻夜不眠.刻苦攻读,这在20 ...
- Service通信详解
1.使用Intent进行异步通讯 在Service任务一旦完成后,就发送广播.开发者只需要实现一个BroadcastReceiver来监听响应既可. Activity.startService启动in ...
- 消息推送SignalR
一.什么是 SignalR ASP.NET SignalR is a library for ASP.NET developers that simplifies the process of add ...
- HTML+CSS学习笔记 (7) - CSS样式基本知识
HTML+CSS学习笔记 (7) - CSS样式基本知识 内联式css样式,直接写在现有的HTML标签中 CSS样式可以写在哪些地方呢?从CSS 样式代码插入的形式来看基本可以分为以下3种:内联式.嵌 ...