Tcp与Ip协议的客户端和服务器编程

Tcp与Ip协议的客户端和服务器编程

本文就TCP和Ip协议的客户端和服务器分别进行编程,实现了客户端和服务端进行通信的功能,服务端对多个客户端进行监听,并能与多个客户端通信。

服务器端代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 服务端
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Control.CheckForIllegalCrossThreadCalls = false;}/// <summary>/// 获取本机IP地址/// </summary>/// <returns>返回一个IP</returns>private string GetIpAddress(){string hostName = Dns.GetHostName();//获取本机名IPHostEntry localhost = Dns.GetHostByName(hostName);//方法已过期了,只能得到一个IPV4的地址
            IPAddress localaddr = localhost.AddressList[0];return localaddr.ToString();}private void btnStart_Click(object sender, EventArgs e){try{//当点击开始监听时,在服务器端创建一个负责监听IP地址和端口号的Socket//IP V4,流式服务,TCP协议Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ip = IPAddress.Any;  //IPAddress.Parse(txtServer.Text);我的理解是获取本机IPtxtServer.Text = GetIpAddress();//将IP地址给文本//创建端口号对象IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));//监听
                socketWatch.Bind(point);ShowMsg("监听成功");socketWatch.Listen(10);//一次监听10 人///创建一个线程来监听,否则没监听时就卡死了Thread th = new Thread(Listen);th.IsBackground = true;th.Start(socketWatch);}catch { }}Dictionary<string, Socket> dicSock = new Dictionary<string, Socket>();//创建键值对来存放IP和socket
        Socket socketSend;void Listen(object o)//必须用object类型 ,因为线程要使用
        {Socket socketWatch = o as Socket;//将传递过来的参数转换为Socket类型while (true){try{//等待客户端的连接 并且创建一个负责通信的SocketsocketSend = socketWatch.Accept();//获得远端 IP+端口号:连接成功ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");dicSock.Add(socketSend.RemoteEndPoint.ToString(), socketSend);//将IP地址添加到下拉列表中
                    comboBox1.Items.Add(socketSend.RemoteEndPoint.ToString());Thread th = new Thread(ReciveMsg);//在线程中只写方法名,括号和里面的参数不写在这里th.IsBackground = true;//写为后台线程,这样关闭窗口时线程就关闭了,否则关闭不了,会报错
                    th.Start(socketSend);}catch{ }}}/// <summary>/// 用来接收客户端发送来的信息,线程来调用他/// </summary>/// <param name="o"></param>void ReciveMsg(object o){Socket socketSend = o as Socket;while (true){try{//连接成功之后,客户端就要给服务端发送数据了byte[] buffer = new byte[1024 * 1024 * 2];int r = socketSend.Receive(buffer);//实际接收到的有效字符if (r == 0){break;}string str = Encoding.UTF8.GetString(buffer, 0, r);ShowMsg(socketSend.RemoteEndPoint + ":" + str);}catch { }}}/// <summary>/// 在上面一个文本框中显示信息的方法/// </summary>/// <param name="str"></param>void ShowMsg(string str){txtLOg.AppendText(str + "\r\n");//写AppendText追加,不然会覆盖
        }/// <summary>/// 服务端给客户端发送消息/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button4_Click(object sender, EventArgs e){try{if (comboBox1.Text == ""){MessageBox.Show("请选中一个客户端地址再发送消息", "谢谢");}string str = textBox4.Text;textBox4.Clear();byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);List<byte> list = new List<byte>();list.Add(0);list.AddRange(buffer);byte[] newbuffer = list.ToArray();string ip = comboBox1.SelectedItem.ToString();dicSock[ip].Send(newbuffer);//通过键IP地址找到值socketSend //socketSend.Send(buffer);
            }catch{ }}private void button2_Click(object sender, EventArgs e){if (comboBox1.Text == ""){MessageBox.Show("请选择一个客户端IP地址再选择要发送的文件", "提示!");}else{OpenFileDialog ofd = new OpenFileDialog();ofd.Title = "请选择要发送的文件";ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";ofd.Filter = "所有文件|*.*";ofd.ShowDialog();textBox5.Text = ofd.FileName;//获得选中的一个文件名
            }}/// <summary>/// 发送文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){try{//发送文件string path = textBox5.Text;using (FileStream fsRead = new FileStream(path, FileMode.Open, FileAccess.Read)){byte[] buffer = new byte[1024 * 1024 * 5];int r = fsRead.Read(buffer, 0, buffer.Length);List<byte> list = new List<byte>();list.Add(1);list.AddRange(buffer);byte[] newbuffer = list.ToArray();//int r= fsRead.Read(newbuffer , 0, newbuffer.Length);//实际读取的有效字节dicSock[comboBox1.SelectedItem.ToString()].Send(newbuffer, 0, r + 1, SocketFlags.None);}}catch { }}///让客户端震动private void button5_Click(object sender, EventArgs e){try{if (comboBox1.Text == ""){MessageBox.Show("请选择一个客户端IP地址再震动", "提示!");}else{byte[] buffer = new byte[1];buffer[0] = 2;dicSock[comboBox1.SelectedItem.ToString()].Send(buffer);}}catch { }}}
}

 

客户端代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace 客户端
{public partial class Form1 : Form{public Form1(){InitializeComponent();}Socket socketConnect = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);private void button1_Click(object sender, EventArgs e){try{//建立负责通讯的Socketif (textBox1.Text == "" || textBox2.Text == ""){MessageBox.Show("IP地址或者端口号不能为空", "去你大爷的!");}IPAddress ip = IPAddress.Parse(textBox1.Text);IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));socketConnect.Connect(point);ShowMsg("连接成功");Thread th = new Thread(Receive);th.IsBackground = true;th.Start();}catch { }}void ShowMsg(string str){textBox3.AppendText(str + "\r\n");}private void button2_Click(object sender, EventArgs e){try{//客户端要给服务器发送消息string str = textBox4.Text.Trim();//Trim()就是把所写内容前后空格去除byte[] buffer = Encoding.UTF8.GetBytes(str);//System.Text.Encoding.UTF8.GetBytes(str);
                socketConnect.Send(buffer);textBox4.Clear();}catch { }}///写一个不断接收服务端发过来的消息的方法,创建线程来调用他void Receive(){try{while (true)//不停的接收
                {byte[] buffer = new byte[1024 * 1024 * 3];int r = socketConnect.Receive(buffer);//实际接收到的有效字节数if (r == 0){break;}if (buffer[0] == 0)//接收到文字
                    {string str = Encoding.UTF8.GetString(buffer, 1, r - 1);ShowMsg(socketConnect.RemoteEndPoint + ":" + str);}else if (buffer[0] == 1){//接收的是文件SaveFileDialog ofd = new SaveFileDialog();//保存对话框
ofd.Title = "请选择保存文件的路径";ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";ofd.Filter = "所有文件|*.*";ofd.ShowDialog(this);string path = ofd.FileName;using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write)){fsWrite.Write(buffer, 1, r - 1);}MessageBox.Show("保存成功", "kao");}else if(buffer [0]==2){ZD();}}}catch { }}
/// <summary>
/// 写个方法来使窗体震动
/// </summary>void ZD(){for (int i = 0; i < 500; i++){this.Location = new Point(200 , 200);this.Location = new Point(280 , 280);}}private void Form1_Load(object sender, EventArgs e){Control.CheckForIllegalCrossThreadCalls = false;}}
}

 

转载于:https://www.cnblogs.com/xiaoyaohan/p/9755748.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven建立webapp项目时显示Cannot change version of project facet Dynamic web module to 2.5

为什么80%的码农都做不了架构师&#xff1f;>>> 网上查了很多东西都没啥用&#xff0c;其实直接把这段代码加到web.xml头部&#xff0c;自然就不报错了 <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.…

python数据结构算法 北京大学_北京大学公开课《数据结构与算法Python版》

之前我分享过一个数据结构与算法的课程&#xff0c;很多小伙伴私信我问有没有Python版。看了一些公开课后&#xff0c;今天特向大家推荐北京大学的这门课程&#xff1a;《数据结构与算法Python版》。课程概述很多同学想要转行机器学习&#xff0c;也确实掌握了一些机器学习模型…

20道C#练习题(一)1——10题

1.输入三个整数&#xff0c;xyz&#xff0c;最终以从小到大的方式输出。利用if嵌套。 Console.Write("请输入x"); double x double.Parse(Console.ReadLine()); Console.Write("请输入y"); double y double.Parse(Console.ReadLine()); Console.Write(&q…

fd 句柄_linux文件描述符fd(windows下的句柄)

在Linux系统中一切皆可以看成是文件&#xff0c;文件又可分为&#xff1a;普通文件、目录文件、链接文件和设备文件fd&#xff1a;file descriptor文件描述符0,1,2分别给了标准输入、标准输出和错误输出。ls -l /proc/pid/fd可以查看某个进程所使用的fd用lsof可以查看比如&…

Python——三级菜单

#三级菜单函数 menu {北京&#xff1a;&#xff5b;海淀&#xff1a;&#xff5b;五道口&#xff1a;&#xff5b;&#xff5d;中关村&#xff1a;&#xff5b;&#xff5d;上帝&#xff1a;&#xff5b;&#xff5d;&#xff5d;昌平&#xff1a;&#xff5b;&#xff5d;朝阳…

HTTPS 原理解析

http://www.cnblogs.com/zery/p/5164795.html 一 前言 在说HTTPS之前先说说什么是HTTP&#xff0c;HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的&#xff0c;也就是明文的&#xff0c;因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐…

python 函数参数注解_python-如何使用函数注释来验证函数调用类...

我最近才发现有一种叫做函数注释的东西,但是我不太确定如何使用它.这是我到目前为止的内容&#xff1a;def check_type(f):def decorated(*args, **kwargs):counter0for arg, type in zip(args, f.__annotations__.items()):if not isinstance(arg, type[1]):msg Not the vali…

SQL Server Replication 中关于视图的点滴

在服务器A数据库TEST新建了一个本地发布&#xff08;Local Publications&#xff09;RPL_GES_MIS_TEST,在服务器B数据库RPL_TEST上创建了一个本地订阅&#xff08;Local Subscriptions&#xff09;&#xff0c;它订阅了了这个发布RPL_GES_MIS_TEST.如下截图所示&#xff0c;本地…

kbmmw 5.0 中的REST 服务

目前关于REST 服务的话题越来越热&#xff0c;kbmmw 在5.0 里面开始支持rest。今天我就试一下kbmmw 的 rest 服务。闲话少说&#xff0c;开始。 老规矩&#xff0c;放上两个kbmMWServer1和 kbmMWHTTPSysServerTransport1两个控件。 设置kbmMWHTTPSysServerTransport1的server 属…

php7 匿名继承类_PHP7匿名类的用法示例

本文实例讲述了PHP7匿名类的用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/*** Created by PhpStorm.* User: Itboot* Date: 2019/1/17* Time: 18:15*/class An{private $num;protected $age 15;public function __construct() {$this->num 1;}protected f…

python中不需要函数重载的原因

函数重载主要是为了解决两个问题&#xff1a; 1.可变参数类型 2.可变参数个数 并且函数重载一个基本的设计原则是&#xff0c;仅仅当两个函数除了参数类型和参数个数不同以外&#xff0c;其功能是完全相同的&#xff0c;此时才使用函数重载&#xff0c;如果两个函数的功能其实不…

多租户saas 架构_[译/注] Force.com 多租户互联网应用开发平台的设计

原文地址 http://cloud.pubs.dbs.uni-leipzig.de/sites/cloud.pubs.dbs.uni-leipzig.de/files/p889-weissman-1.pdf译注&#xff1a;原文发表于 ACM&#xff0c;2009年6月作者Craig D Weissman, CTO, Salesforce.comSteve Bobrowski, Technical Marketing Consultant, Salesfor…

富文本

View Code转载于:https://www.cnblogs.com/baidaye/p/5295448.html

Jenkins持续集成——用户管理

一、基于安全矩阵系统管理 —>Configure Global Security相关权限的作用&#xff1a;其中有一些比较特别的权限&#xff1a;最大的权限是Overall的Administer&#xff0c;拥有该权限可以做任何事情。最基本的权限是Overall的Read&#xff0c;用户必须赋予阅读的权限&#xf…

pythonui教学视频_分享软件开发相关视频教程(Java、C++、Python、UI设计、HTML5、iOS)...

以下是我收藏的关于开发及其他教程&#xff0c;基本都是花钱在网上买的&#xff0c;网盘没有加密的&#xff0c;虽然特别爱学习&#xff0c;但并不可能有这么多的精力学习这么多&#xff0c;技术总是很快就被新的淘汰掉&#xff0c;放在网盘中确实太浪费呀&#xff0c;分享出去…

JAVA Set接口和其常用子类HashSet集合

Set接口&#xff0c;它里面的集合&#xff0c;所存储的元素就是不重复的。 HashSet集合&#xff0c;采用哈希表结构存储数据&#xff0c;保证元素唯一性的方式依赖于&#xff1a;hashCode()与equals()方法。 保证HashSet集合元素的唯一&#xff0c;其实就是根据对象的hashCode和…

python初始化函数_当你学会了Python爬虫,网上的图片素材就免费了

前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。加入作者的python学习圈子&#xff1a;1156465813 即可免费获取&#xff0c;资料全在群文件里。资料可以领取包括不限于Python实战演练、PDF电子文档…

第三周作业(一)单元测试

下载vs2015安装包&#xff0c;打开进行安装. 选择颜色 安装完成&#xff0c;需要登录 启动vs 单元测试 1.打开vs界面。 2.新建项目。选择Visual C# 创建类库。 3.点击确定后&#xff0c;进入代码编辑界面。 4.根据书中代码&#xff0c;写入程序&#xff0c;并进行测试。 转载于…

React-Native-lesson

React-Native-lesson 一、React-Native入门指南 lesson2: 认识代码结构lesson4: 学会React-Native布局&#xff08;一&#xff09;lesson6: UI组件lesson8: 自己动手写组件 https://github.com/vczero/toilet React Native完全开发的独立App&#xff0c;支持ES6语法&#xff0c…

1、如何进行字符串常量中的字符定位_Java String:字符串常量池,我相信会有很多朋友不很理解这部分...

作为最基础的引用数据类型&#xff0c;Java 设计者为 String 提供了字符串常量池以提高其性能&#xff0c;那么字符串常量池的具体原理是什么&#xff0c;我们带着以下三个问题&#xff0c;去理解字符串常量池&#xff1a;字符串常量池的设计意图是什么&#xff1f;字符串常量池…