c#使用Socket实现局域网内通信
服务器端代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO; namespace socket通信
{
public partial class SERVER : Form
{
public SERVER()
{
InitializeComponent();
}
Socket socketSend;
private void Form1_Load(object sender, EventArgs e)
{
this.ActiveControl = this.btnListen;
txtaidip.Text = GetIpAdress();
//txtport.Text = "80";
Control.CheckForIllegalCrossThreadCalls = false;
}
//将远程连接的IP地址和Socket存放到集合中
Dictionary<string, Socket> diSocket = new Dictionary<string, Socket>();
private void button1_Click(object sender, EventArgs e)
{
try
{
//创建一个socket,负责监听IP地址和端口号
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim()); //提供一个IP地址
IPEndPoint point = new IPEndPoint(ip, ); //端口号,其中包括了IP地址 socketWatch.Bind(point); //绑定IP地址和端口
ShowMsg("监听成功");
socketWatch.Listen(); //设置监听队列,最多允许同时10个连接,(0表示不限制) Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWatch); //socketWatch是Listen()的参数
}
catch
{ } } private void ShowMsg(string str)
{
txtReceMsg.AppendText(str + "\r\n");
} /// <summary>
/// //获取本机IP地址
/// </summary>
/// <returns></returns>
private string GetIpAdress()
{
try
{
string HostName = Dns.GetHostName(); //得到主机名
IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
for (int i = ; i < IpEntry.AddressList.Length; i++)
{
//从IP地址列表中筛选出IPv4类型的IP地址
//AddressFamily.InterNetwork表示此IP为IPv4,
//AddressFamily.InterNetworkV6表示此地址为IPv6类型
if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
{
return IpEntry.AddressList[i].ToString();
}
}
return "";
}
catch (Exception ex)
{
return ex.Message;
}
} /// <summary>
/// 解决只能连接一个用户的问题
/// </summary>
private void Listen(Object o)
{
Socket socketWatch = o as Socket;
while (true)
{
try
{
//接下来等待客户端的连接
socketSend = socketWatch.Accept(); //为客户端创建一个负责通信的新的socket并接收来自客户端的请求
//将新的socket存放进集合中
diSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//将远程连接的IP地址和端口号存入下拉框
cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":连接成功"); //192.168.0.103:连接成功
Thread th = new Thread(ReceiveSend);
//开启一个新线程不停接收来自客户端的消息
th.IsBackground = true;
th.Start(socketSend);
}
catch
{ } }
}
/// <summary>
/// 服务器端不停的接收客户端发送过来的消息
/// </summary>
/// <param name="o"></param>
private void ReceiveSend(Object o)
{
Socket socketSend = o as Socket;
while (true)
{
try
{
//客户端连接成功后,服务器应该接受客户端发出的消息
byte[] buffer = new byte[* * ];
int r = socketSend.Receive(buffer); // 实际接收到的有效字节数
if (r == )
{
break;
}
string str = Encoding.UTF8.GetString(buffer, , r); //将字节流转换为string【str就是客户端向服务器发送的字符串】
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str); //远程客户端连接:接收客户端发送的内容 }
catch
{ }
}
} private void btnSendMsg_Click(object sender, EventArgs e)
{ //将服务器端的信息发送给客户端
string str = txtSendMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
//socketSend.Send(buffer);
//获得用户在下拉框中选中的IP地址,根据IP地址找到对应的socket,然后发送消息
string ip = cboUsers.SelectedIndex.ToString();
diSocket[ip].Send(buffer);
txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "\r\n");
txtSendMsg.Text = ""; //清空文本框
} //在文本框中输入信息后按【Enter】键,触发【发送消息】事件
private void txtSendMsg_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
btnSendMsg_Click(sender, e);
}
}
}
} 客户端代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading; namespace socket通信客户端
{
public partial class CLIENT : Form
{
public CLIENT()
{
InitializeComponent();
} Socket socketSend;
/// <summary>
/// //获取本机IP地址
/// </summary>
/// <returns></returns>
private string GetIpAdress()
{
try
{
string HostName = Dns.GetHostName(); //得到主机名
IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
for (int i = ; i < IpEntry.AddressList.Length; i++)
{
//从IP地址列表中筛选出IPv4类型的IP地址
//AddressFamily.InterNetwork表示此IP为IPv4,
//AddressFamily.InterNetworkV6表示此地址为IPv6类型
if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
{
return IpEntry.AddressList[i].ToString();
}
}
return "";
}
catch (Exception ex)
{
return ex.Message;
}
} private void Form1_Load(object sender, EventArgs e)
{
//txtlocalip.Text = GetIpAdress();
//txtport.Text = "8080";
Control.CheckForIllegalCrossThreadCalls = false;
this.ActiveControl = this.btnConnection; } private void btnConnection_Click(object sender, EventArgs e)
{
try
{
//创建一个socket用来连接服务器
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim()); //获取IP地址
IPEndPoint ipep = new IPEndPoint(ip, Convert.ToInt32(txtport.Text.Trim())); //获得要连接的远程服务器的IP地址和端口号
socketSend.Connect(ipep);
showMSG("连接成功");
//创建一个线程,用来不断接收服务器端发送的信息
Thread th = new Thread(ReceiveMessage);
th.IsBackground = true; //后台线程
th.Start(socketSend); //socketSend是Start()的参数
}
catch
{ } } private void showMSG(string str)
{
txtReceMsg.AppendText(str + "\r\n");
} private void btnSendMsg_Click(object sender, EventArgs e)
{
string str = txtSendMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "\r\n");
txtSendMsg.Text = "";
} private void txtMsg_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
this.btnSendMsg_Click(sender, e);
}
}
/// <summary>
/// 不停地接收服务器端发送来的信息
/// </summary>
/// <param name="o"></param>
private void ReceiveMessage(Object o)
{
Socket socketSend = o as Socket;
try
{
while (true)
{
byte[] buffer = new byte[ * * ];
int r = socketSend.Receive(buffer);
if (r == )
{
break;
}
string str = Encoding.UTF8.GetString(buffer, , r);
showMSG(socketSend.RemoteEndPoint.ToString() + ":" + str); }
}
catch
{ } }
} }
c#使用Socket实现局域网内通信的更多相关文章
- 局域网内python socket实现windows与linux间简单的消息传送
有个需求,就是在windows上看见一篇介绍linux相关的文章,想在局域网内的另外一台linux电脑上尝试一下, 于是就需要把该网页链接发送给linux,不想一点一点敲链接,又苦于没有找到其它好的方 ...
- erlang局域网内节点通信——艰难四步曲 (转)
http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...
- erlang局域网内节点通信——艰难四步曲
http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...
- 局域网内使用ipv6 通信
链路本地地址:用于网段内通信,不能跨路由访问 在ping本地链路地址和全球唯一地址时有点差别,链路本地地址需要加上网络接口号 Linux 查看ipv6链路本地地址:ifconfig linux系统pi ...
- Android基于TCP的局域网聊天通信
概述 在同一局域网内,两台设备通过TCP进行通信聊天. 详细 代码下载:http://www.demodashi.com/demo/10567.html 一.准备工作 开发环境 jdk1.8 Ecli ...
- Android基于UDP的局域网聊天通信
代码地址如下:http://www.demodashi.com/demo/12057.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1. 开发环境 1.1 开发工具 ...
- 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法
TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...
- C#的Socket实现UDP协议通信
今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层.与TC ...
- 局域网内Linux服务器时间同步
局域网内Linux服务器时间同步 1.将一台能够上网的服务器作为时间服务器: # /usr/bin/rdate -s time-b.timefreq.bldrdoc.gov //将时间服务器与互 ...
随机推荐
- 利用Session实现三天免登陆
什么是Session Session:在计算机中,尤其是在网络应用中,称为“会话控制”.(百度百科) Session:服务器端的数据存储技术. Session要解决什么问题 一个用户的不同请求(重定位 ...
- 「CH6901」骑士放置
「CH6901」骑士放置 传送门 将棋盘黑白染色,发现"日"字的两个顶点刚好一黑一白,构成一张二分图. 那么我们将黑点向源点连边,白点向汇点连边,不能同时选的一对黑.白点连边. 当 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:强制元素隐藏
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- rally问题合集
rally 执行过程中涉及到keystone的用例,需要调用adminurl,在-/rally/lib/python2.7/site-packages/rally/osclients.py(主机文件的 ...
- ROS学习笔记9-创建ros消息和服务
该节内容主要来自于官方文档的两个小节:1.使用rosed来编辑2.创建ros消息的服务 先来看rosed: rosedrosed命令是rosbash的一部分,使用rosed可以直接编辑包中的一个文件, ...
- 怎样实现android 返回到上一个Activity并重新执行一次onCreate方法
1.onCreate 方法只在activity一开始创建的时候执行.2.也就是在该activity销毁后才能再次执行,假如当前activity上再打开一个activity,并且原来的activity已 ...
- window和document的区别理解,bom和dom的区别理解
Window对象: 是整个BOM的核心,所有对象和集合都以某种方式回接到window对象.Window对象表示整个浏览器窗口,但不必表示其中包含的内容. Document对象: 实际上是window对 ...
- Linux CentOS7 VMware 安装软件包的三种方法、rpm包介绍、rpm工具用法、yum工具用法、yum搭建本地仓库
一.安装软件包的三种方法 Linux下游三种安装方法,rpm工具.yum工具.源码包.rpm按装一个程序包时,有可能因为该程序包依赖另一个程序包而无法安装:yum工具,可以连同依赖的程序包一起安装. ...
- SciPy 特殊函数
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- java有参
一.带参数的方法 语法: 访问修饰符 方法返回值类型 方法名称 (参数列表){ // 方法体 注意:每个参数之间用","分割 二.形参和实参 形参:在方法定义时指定的参数 实 ...