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 //将时间服务器与互 ...
随机推荐
- IELTS Writing Task 1: two-chart answer
Thursday, January 09, 2020 The chart below shows the value of one country's exports in various categ ...
- jsp 防止表单多次提交
1:首先java 后台代码生成一个token,然后保存到jsp 页面的一个隐藏控件并且保存到set session中 */ @RequestMapping("/yuDengJi") ...
- 问题解决 : org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
问题分析: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): ,即在mybatis中da ...
- luogu P3356 火星探险问题
本题很简单的费用流问题,有石头的点需要限制,那我们就可以拆点,capacity为1就可以限制,然后cost为-1,直接跑板子就可以了,注意输出的时候找残量网络的反向边
- JavaScript图形实例:正多边形
圆心位于坐标原点,半径为R的圆的参数方程为 X=R*COS(θ) Y=R*SIN(θ) 在圆上取N个等分点,将这N个点首尾连接N条边,可以得到一个正N边形. 1.正多边形阵列 构造一个8行8列的正N( ...
- mysql遇到java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
在连接数据库的url中,加上allowPublicKeyRetrieval=true from:https://blog.csdn.net/Gushiyuta/article/details/9323 ...
- 如何更改linux(centos)下的Apache http端口号
# vi /etc/httpd/conf/httpd.conf 文件 修改两个地方 #Listen 12.34.56.78:80 Listen 80 #把80改为你设置的端 ...
- (C#)Image.FromFile 方法会锁住文件的原因及可能的解决方法
Image.FromFile 一旦使用后,对应的文件在一直调用其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修改等 ...
- 大公司病,为什么要PPT背锅?
新东方年会上,一曲吐槽式的<释放自我>火遍网络,据说这六位员工,是冒着被解雇的风险完成演出的,歌词内容涉及到非常敏感的大企业病,如机构臃肿.效率低下.内耗甩锅.拍领导马屁等等,而最高潮的部 ...
- Oracle查看正在执行的存储过程
正在执行的存储过程 select owner,name from v$db_object_cache where type like '%PROCE%' and locks >0 and pin ...