【服务器】

 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.Windows.Forms; namespace SocketDemo
{
public partial class Server : Form
{
private Socket socketSend; public Server()
{
InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
this.filePath.ReadOnly = true;
} private void button1_Click(object sender, EventArgs e)
{
try
{
//当点击开始监听时,在服务器端创建一个负责监听的ip地址和端口号
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
//创建一个端口号
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(this.portNum.Text));
//创建监听
socketWatch.Bind(point);
ShowMessage("监听成功!");
socketWatch.Listen();
//等待客户端的链接,并且创建一个负责通信的socket
Thread thread = new Thread(Listen);
thread.IsBackground = true;
thread.Start(socketWatch);
}
catch (Exception)
{
}
} Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); /// <summary>
/// 等待客户端链接,创建与之通信的scoket
/// </summary>
private void Listen(object o)
{
Socket socketWatch = o as Socket;
while (true)
{
try
{
//等待客户端的连接
socketSend = socketWatch.Accept();
//将连接过来的客户端存储至Dictionary和下拉框中,以便区分是哪个客户端
dic.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//将ip和端口号存入下拉框中
dropList.Items.Add(socketSend.RemoteEndPoint.ToString());
ShowMessage($"{socketSend.RemoteEndPoint.ToString()}:连接成功!");
//另外再开一个线程不停地接收客户端发来的消息
Thread thread = new Thread(Receive);
thread.IsBackground = true;
thread.Start(socketSend);
}
catch (Exception)
{
}
}
} /// <summary>
/// 服务器不停地接收客户端发来的消息
/// </summary>
/// <param name="obj"></param>
private void Receive(object obj)
{
Socket socketSend = obj as Socket;
while (true)
{
try
{
//服务器应该接收客户端发来的消息
byte[] buffer = new byte[ * ];
//实际接收的有效字节数
int num = socketSend.Receive(buffer);
//判断接收的字节是否为0,如果为0,则表明客户端已经下线
if (num == )
{
break;
}
string str = Encoding.UTF8.GetString(buffer, , num);
ShowMessage($"{socketSend.RemoteEndPoint}:{str}");
}
catch (Exception)
{
}
}
}
private void ShowMessage(string str)
{
this.textListen.AppendText($"{str}\r\n");
} /// <summary>
/// 服务器发送消息给客户端
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
if (dropList.Text == "---请选择---")
{
MessageBox.Show("请先选择您要发送的客户端");
return;
}
if (this.serverMsg.Text.Trim() == "" && this.filePath.Text.Trim() == "")
{
MessageBox.Show("请输入信息或选择文件");
return;
}
List<byte> list = new List<byte>(); if (this.serverMsg.Text.Trim() != "" && this.filePath.Text.Trim() == "")
{
byte[] buffer = Encoding.UTF8.GetBytes(this.serverMsg.Text.Trim());
//给发送的内容添加前缀,如果加0,则表示发消息
list.Add();
list.AddRange(buffer);
byte[] newBuffer = list.ToArray();
dic[dropList.SelectedItem.ToString().Trim()].Send(newBuffer);
}
else if (this.filePath.Text.Trim() != "" && this.serverMsg.Text.Trim() == "")
{
using (FileStream fs = new FileStream(filePath.Text.Trim(), FileMode.Open, FileAccess.Read))
{
byte[] by = new byte[ * * ];
int length = fs.Read(by, , by.Length);
//给发送的内容添加前缀,如果加1,则表示发文件
list.Add();
list.AddRange(by);
byte[] newBy = list.ToArray();
dic[dropList.SelectedItem.ToString().Trim()].Send(newBy, , length + , SocketFlags.None);
}
}
else
{
MessageBox.Show("只能是发送消息或传输文件中的一项");
}
} /// <summary>
/// 打开所需的文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void openFile_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = @"C:\Users\Administrator\Desktop";
ofd.Title = "打开文件";
ofd.Filter = "所有文件|*.*";
ofd.ShowDialog();
this.filePath.Text = ofd.FileName;
}
}
}

【客户端】

 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.Windows.Forms; namespace 客户端
{
public partial class Client : Form
{
public Client()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
} Socket socketSend;
private void button1_Click(object sender, EventArgs e)
{
try
{
//创建一个负责通信的socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(this.IpMess.Text.Trim());
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(this.clientPort.Text.Trim()));
socketSend.Connect(point);
ShowMess("连接成功!");
//创建线程接收消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start();
}
catch (Exception)
{
MessageBox.Show("可能是因为没有启动服务器监听!");
}
}
private void Receive()
{
while (true)
{
try
{
byte[] buffer = new byte[ * * ]; //最长10M
//通过字节二进制来接收消息,获取字节长度
int length = socketSend.Receive(buffer);
if (length == )
{
break;
}
//如果为0接收消息
if (buffer[]==)
{
//去掉前缀
string str = Encoding.UTF8.GetString(buffer, , length-);
ShowMess(socketSend.RemoteEndPoint + ":" + str);
}
//如果为1接收文件
else if (buffer[]==)
{
//保存文件
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = @"C:\Users\Administrator\Desktop";
sfd.Title = "选择文件";
sfd.Filter = "所有文件|*.*";
//弹出对话窗
sfd.ShowDialog(this);
using (var fs=new FileStream(sfd.FileName,FileMode.OpenOrCreate,FileAccess.Write))
{
fs.Write(buffer, , length - );
}
MessageBox.Show("保存成功");
}
}
catch (Exception)
{
}
}
}
private void ShowMess(string str)
{
this.clientMess.AppendText($"{str}\r\n");
} private void clientMess_TextChanged(object sender, EventArgs e)
{ } /// <summary>
/// 客户端给服务器发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void sendBtn_Click(object sender, EventArgs e)
{
byte[] buffer = Encoding.UTF8.GetBytes(this.sendMsg.Text.Trim());
socketSend.Send(buffer);
}
}
}

Socket网络编程(winform)的更多相关文章

  1. Socket网络编程(2)--服务端实现

    中秋了,首先祝大家中秋快乐,闲着无事在家整一个socket的聊天程序,有点仿QQ界面,就是瞎折腾,不知道最后是不是能将所有功能实现. 如果你对socket不了解,请看这篇文章:http://www.c ...

  2. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  3. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  4. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  5. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  6. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  7. Socket网络编程-基础篇

    Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...

  8. Socket网络编程--FTP客户端

    Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...

  9. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...

随机推荐

  1. VS 中的几种注释方法

    在代码的后面添加形如下面注释: //TODO: (未实现)…… //UNDONE:(没有做完)…… //HACK:(修改)…… 等到再次打开VS的时候,找到 :视图>任务列表 即可显示所有带有T ...

  2. gulp 压缩 js 和 css 代码

    我们在写出来的代码都是非常规范的,改换行的时候就换行,改tab 的时候就有tab,还有这样做是为了后期维护方便,但是这也导致了内存占用量的增大,当把把代码发到线上,如果网速慢一点,可能很久都加载不出来 ...

  3. TypeScript 之 声明文件的结构

    https://www.tslang.cn/docs/handbook/declaration-files/library-structures.html 模块化库 一些库只能工作在模块加载器的环境下 ...

  4. py-day1-3 python基本数据类型

    数据的基本类型: 数字:

  5. Hystrix 使用入门

    在很多系统架构中都需要考虑横向扩.单点故障等问题,对于一个庞大的应用集群,部分服务或者机器出现问题不可避免,在出现故障时,如何减少故障的影响.保障集群的高可用,成为一个重要的工作,Hystrix 是一 ...

  6. nginx支持android、ios、微信扫一扫

    首先做一个android下载的html页面,页面中识别微信浏览器提示在浏览器中打开,然后在nginx对ios进行识别并跳转到apple store #下载App location ^~ /appDow ...

  7. spring4与mongodb的集成

    新项目的辅助系统,需要用到mongo系统,今天再次将其使用环境进行了操作搭建.还是遇到一些问题,毕竟之前使用的场景和现在的不同.版本也不一样了. 本次使用的环境: mongo:3.4.4版本 OS: ...

  8. [转]python实现RESTful服务(基于flask)

    python实现RESTful服务(基于flask) 原文: https://www.jianshu.com/p/6ac1cab17929  前言 上一篇文章讲到如何用java实现RESTful服务, ...

  9. Delphi 的 Bit

    我一直感觉 Delphi 下的Bit操作不是很好使, 所以一直屏蔽着这方面的学习.不过最近收集整理了一下代码. 原因是这样的. 由于某个需求被分解成 在 0~n(不定) 中,有几个数字被置换成了“tr ...

  10. 黄聪:FFmpeg视频转码技巧之-crf参数(H.264篇)

    昨天,有个朋友给我出了个难题:他手上有一个视频,1080P的,49秒,200多兆:要求在确保质量的情况下把文件压缩到10M以内. 这是什么概念呢?按照文件大小10M来计算,码率是:10 x 8 / 4 ...