socket,模拟服务器、客户端通信

服务器代码:
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 Missuin
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
private void button1_Click(object sender, EventArgs e)
        {
            //当点击开始监听的时候 在服务器端创建一个负责监IP地址和端口号的Socket
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            IPAddress ip = IPAddress.Any;//IPAddress.Parse(txtServer.Text);
            //创建端口号对象
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
            //监听
            socket.Bind(point);
            ShowMsg("监听成功");
            socket.Listen(10);
Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socket);
        }
Socket socketSend;
        /// <summary>
        /// 被线程所执行的函数,只能传object参数
        /// </summary>
        /// <param name="o"></param>
        void Listen(Object o)
        {
            Socket socketWatch = o as Socket;
            //等待客户端连接 并创建一个负责通信的Sokcet
            while (true)
            {
                //负责根客户通信的Socket
                socketSend = socketWatch.Accept();
                dictSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
cbuUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
                ////客户端连接成功后,服务器应该接受客户端发来的消息
                //byte[] buffer = new byte[1024 * 1024 * 2];
                ////实际接受到的有效字节数
                //int r = socketSend.Receive(buffer);
                //string str = Encoding.UTF8.GetString(buffer, 0, r);
                //Console.WriteLine(socketSend.RemoteEndPoint+":"+str);
                Thread th = new Thread(Recive);
                th.IsBackground = true;
                th.Start(socketSend);
            }
        }
Dictionary<String, Socket> dictSocket = new Dictionary<string, Socket>();
        /// <summary>
        /// 服务器端不修改的接收客户发来的消息
        /// </summary>
        /// <param name="o"></param>
        void Recive(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 (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
void ShowMsg(string msg)
        {
            txtLog.AppendText(msg + "\r\n");
        }
private void Form2_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        /// <summary>
        /// 服务器给客户端发消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button5_Click(object sender, EventArgs e)
        {
            byte[] msgs = Encoding.UTF8.GetBytes(this.txtmsg.Text);
List<byte> list = new List<byte>();
            list.Add(0);
            list.AddRange(msgs);
            byte[] newmsgs = list.ToArray();
            //获得用户在下拉框中选中的IP地址
            string ip = cbuUsers.SelectedItem.ToString();
            Socket sendSocket = dictSocket[ip];
            sendSocket.Send(newmsgs);
            ShowMsg(sendSocket.RemoteEndPoint + ":" + this.txtmsg.Text);
}
        /// <summary>
        /// 选择要发送的文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSelect_Click(object sender, EventArgs e)
        {
            OpenFileDialog of = new OpenFileDialog();
            of.InitialDirectory = @"C:\users";
            of.Title = "请选择要发送的文件";
            of.Filter = "所有文件|*.*";
            of.ShowDialog();
txtPath.Text = of.FileName;
}
private void btnFileSend_Click(object sender, EventArgs e)
        {
            string path = this.txtPath.Text.ToString();
            using(FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                byte[] buffer = new byte[1024 * 1024 * 5];
                List<byte> list = new List<byte>();
                list.Add(1);
                list.AddRange(list);
                byte[] newBytes = list.ToArray();
                Socket socket = dictSocket[cbuUsers.SelectedItem.ToString()];
                socket.Send(newBytes);
            }
        }    
        private void button3_Click(object sender, EventArgs e)
        {
            byte[] buffer = new byte[1];
            buffer[0] = 2;
            Socket socket = dictSocket[cbuUsers.SelectedItem.ToString()];
            socket.Send(buffer);
        }
    }
}
客户端代码
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 Client
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //创建负责通信的Socket
        Socket socketSend;
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(textBox1.Text);
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));
                socketSend.Connect(point);
                showMsg("连接成功");
//开启一个新线程不停的接收服务器发来的消息
                Thread th = new Thread(recive);
                th.IsBackground = true;
                th.Start();
            }
            catch(Exception ex)
            {
} 
        }
/// <summary>
        /// 不停的接收服务器发来的消息
        /// </summary>
        void recive()
        {
            while (true)
            { 
                byte[] buffer = new byte[1024 * 1024 * 2];
                int r = socketSend.Receive(buffer);
                if (r == 0)
                    break;
                //发来的是文字
                if (buffer[0] == 0)
                {
                    string s = Encoding.UTF8.GetString(buffer,1,r-1);
                    showMsg(socketSend.RemoteEndPoint + ":" + s);
                }
               else  if (buffer[0] == 1)
                {
                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.InitialDirectory = @"C:\";
                    sfd.Title = "请选择要保存的文件";
                    sfd.Filter = "所有文件|*.*";
                    sfd.ShowDialog(this);
                    string path = sfd.FileName;
                    using(FileStream sf = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
                    {
                        sf.Write(buffer, 1, r - 1);
                    }
                    MessageBox.Show("保存成功");
                } 
                else if (buffer[0] == 2)
                {
                    for (int i=0;i<10;i++){
                        this.Location = new Point(200, 200);
                        this.Location = new Point(210, 210);
                    } 
                }
            }
        }
private void showMsg(string msg)
        {
            this.txtLog.AppendText(msg + "\r\n");
        }
private void button2_Click(object sender, EventArgs e)
        {
            byte[] msgs = System.Text.Encoding.UTF8.GetBytes(txtmsg.Text);
            socketSend.Send(msgs);
        }
private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
    }
}
socket,模拟服务器、客户端通信的更多相关文章
- C#调用接口注意要点  socket,模拟服务器、客户端通信  在ASP.NET Core中构建路由的5种方法
		
C#调用接口注意要点 在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...
 - JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
		
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
 - c++下基于windows socket的服务器客户端程序(基于UDP协议)
		
前天写了一个基于tcp协议的服务器客户端程序,今天写了一个基于UDP协议的,由于在上一篇使用TCP协议的服务器中注释已经较为详细,且许多api的调用是相同的,故不再另外注释. 使用UDP协议需要注意几 ...
 - Java IO 与 NIO 服务器&客户端通信小栗子
		
本篇包含了入门小栗子以及一些问题的思考 BIO package com.demo.bio; import java.io.*; import java.net.ServerSocket; import ...
 - socket模拟服务器,客户端下载东西(ftp)
		
服务端(ftp_server.py) import hashlib,socket,os server = socket.socket() server.bind(("localhost&qu ...
 - Socket 模拟HTTP客户端请求
		
import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import ja ...
 - socket本地模拟TCP 服务器+客户端(二)
		
建立两个py文件,分别打开两个cmd界面,即可进行通信.服务器端运用多进程,连续不断的处理从客户端接收到的数据:客户端通过一个list不断给客户端发送数据. (每个连接都必须创建新线程(或进程)来处理 ...
 - C#使用Socket实现一个socket服务器与多个socket客户端通信
		
在分布式调度系统中,如果要实现调度服务器与多台计算节点服务器之间通信,采用socket来实现是一种实现方式,当然我们也可以通过数据存储任务,子节点来完成任务,但是往往使用数据作为任务存储都需要定制开发 ...
 - 使用CBrother做TCP服务器与C++客户端通信
		
使用CBrother脚本做TCP服务器与C++客户端通信 工作中总是会遇到一些对于服务器压力不是特别大,但是代码量比较多,用C++写起来很不方便.对于这种需求,我选择用CBrother脚本做服务器,之 ...
 
随机推荐
- 【爆料】-《西澳大学毕业证书》UWA一模一样原件
			
☞西澳大学毕业证书[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&a ...
 - oracle服务的一些问题,先发2个,以后慢慢添加~~
			
OracleOraDb11g_home1TNSLister服务启动后停止 解决办法: 1. 修改文件C:\app\zhuwei\product\11.1.0\db_1\NETWORK\ADMIN\li ...
 - Map集合中,关于取值和遍历的相关操作
			
这是自己的关于map集合的相关操作的小研究,分享给大家. 主要代码内容包含以下: 1,map集合的遍历 2,根据key值获取value值 3,根据value值获取key值 4,返回最大value值对应 ...
 - Text-CNN-文本分类-keras
			
Text CNN 1. 简介 TextCNN 是利用卷积神经网络对文本进行分类的算法,由 Yoon Kim 在 "Convolutional Neural Networks for Sent ...
 - 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版
			
欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...
 - 关于WebSocket需要知道
			
WebSocket 概念 WebSocket是再单个TCP连接上进行双工通讯的协议,仅需要通过一次握手两个之间就可以创建持久性的连接,进行双向数据传输.WebSocket 是HTML5新增加的协议. ...
 - 分布式系统关注点(15)——「水平&垂直切分」详解
			
如果第二次看到我的文章,欢迎右侧扫码订阅我哟~
 - 《k8s-1.13版本源码分析》-调度优选
			
源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...
 - 来聊一聊不low的Linux命令——find、grep、awk、sed
			
前几天面试,被一位面试官嫌弃了"你的Linux命令有点low".被嫌弃也挺正常的,因为我的简历写的我自己都有点看不下去:了解Linux常用命令,如ls,tail -f等命令,基本满 ...
 - Eclipse4JavaEE安装Gradle,并导入我们的Gradle项目
			
第一步:下载Gradle Gradle下载链接,如下图,下载最新版本即可.下载下来的zip包,解压到一个目录即可,如F盘 第二步:配置环境变量 首先添加GRADLE_HOME,如下图 然后在Path下 ...