服务器端代码:

 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实现局域网内通信的更多相关文章

  1. 局域网内python socket实现windows与linux间简单的消息传送

    有个需求,就是在windows上看见一篇介绍linux相关的文章,想在局域网内的另外一台linux电脑上尝试一下, 于是就需要把该网页链接发送给linux,不想一点一点敲链接,又苦于没有找到其它好的方 ...

  2. erlang局域网内节点通信——艰难四步曲 (转)

    http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...

  3. erlang局域网内节点通信——艰难四步曲

    http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...

  4. 局域网内使用ipv6 通信

    链路本地地址:用于网段内通信,不能跨路由访问 在ping本地链路地址和全球唯一地址时有点差别,链路本地地址需要加上网络接口号 Linux 查看ipv6链路本地地址:ifconfig linux系统pi ...

  5. Android基于TCP的局域网聊天通信

    概述 在同一局域网内,两台设备通过TCP进行通信聊天. 详细 代码下载:http://www.demodashi.com/demo/10567.html 一.准备工作 开发环境 jdk1.8 Ecli ...

  6. Android基于UDP的局域网聊天通信

    代码地址如下:http://www.demodashi.com/demo/12057.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1. 开发环境 1.1 开发工具 ...

  7. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

  8. C#的Socket实现UDP协议通信

    今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层.与TC ...

  9. 局域网内Linux服务器时间同步

    局域网内Linux服务器时间同步   1.将一台能够上网的服务器作为时间服务器:  # /usr/bin/rdate -s time-b.timefreq.bldrdoc.gov //将时间服务器与互 ...

随机推荐

  1. centos7一步一步搭建docker jenkins 及自定义访问路径重点讲解

    系统环境:centos7.7 (VMware中) 镜像image 版本:jenkins/jenkins (截止2020.01.10最新版) 参考文章:https://www.jianshu.com/p ...

  2. 图解jvm--(三)类加载与字节码技术

    类加载与字节码技术 1.类文件结构 根据 JVM 规范,类文件结构如下 ClassFile { u4 magic; //魔数 u2 minor_version; //小版本号 u2 major_ver ...

  3. webpack的配置文件[webpack.config.js]

    如果项目里没有webpack.config.js这个文件,webpack会使用它本身内置在源码里的配置项. webpack.config.js这个配置名称可以通过指令修改 npx webpack -- ...

  4. 用python发送qq邮件

    一.需要开启smtp服务,获取授权密码. 在qq邮箱的设置里开启smtp 二.代码 # -*- coding:utf-8 -*- import smtplib from email.mime.text ...

  5. BZOJ 4166: 月宫的符卡序列

    如果使用回文树,节点 \(u\) 的回文串和 \(fail_u\) 的回文串中心不一样,因为回文树的 \(fail\) 指针指向的是最长回文后缀,没法快速解决异或和 考虑魔改回文树,用马拉车来解决,扩 ...

  6. Django线上部署代码修改失效问题

    记一次django项目的线上部署维护问题,django+nginx 关于nginx反向代理服务器的介绍这里有一篇博客介绍的比较好:nginx的相关介绍 以及当一次客户端请求发出后,uwsig以及uWS ...

  7. jQuery设置input的type属性

    $("#inputName").attr("type","text");

  8. JS 一键复制插件应用 和 原生实现

    一.目前来说复制功能 clipboard.js基本可以兼容所有浏览器,可以任意复制文本,官方地址 https://clipboardjs.com/ 1.进入官方网站下载 然后引入 <script ...

  9. java学习-初级入门-面向对象①-面向对象概述-结构化程序设计

    为了学习面向对象程序设计,今天我们先利用面向对象以前的知识,设计一个学生类. 要求进行结构化程序设计. 学生类: Student 要求:存储学生的基本信息(姓名.性别.学历层次和年级),实现学生信息的 ...

  10. 33 第一个只出现一次的字符+ASCII码

    题目描述 在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 思路:使用一个hashmap遍历一遍,统计每个字符出现的次数,然后再统 ...