Socket通信客户端和服务端代码
这两天研究了下Socket通信,简单实现的客户端和服务端代码
先上winfrom图片,客户端和服务端一样
服务端代码:
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; namespace Server
{
public partial class Form1 : Form
{
private List<Socket> listSocket = new List<Socket>();
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
} private void btnStart_Click(object sender, EventArgs e)
{
/*
* AddressFamily.InterNetwork:寻址方式
* SocketType.Stream:传输数据方式
* ProtocolType.Tcp:通信协议
*/
//1.创建一个socket对象
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //2.创建一个IP地址
IPAddress address =IPAddress.Parse(txtIP.Text.Trim()); //3.创建一个EndPoint
IPEndPoint ipEndPoint = new IPEndPoint(address,int.Parse(txtPort.Text)); //4.绑定一个端口:独享此端口
socket.Bind(ipEndPoint); //5.开启监听
socket.Listen(); AddShow("服务器启动,开始监听。。。");
//6.开始接受客户端的连接
//此代码一执行就阻塞当前线程,等待客户端的连接
Task task = Task.Factory.StartNew(x => {
Socket serverSocket = x as Socket;
while (true)
{
//客户端一连接上之后,服务器端自动生产一个跟客户端通信的socket
Socket workSocket = serverSocket.Accept();
AddShow("有一个连接上"+workSocket.RemoteEndPoint.ToString());
workSocket.Send(Encoding.Default.GetBytes("你好")); listSocket.Add(workSocket); //接收消息
Task t = Task.Factory.StartNew(c => {
Socket recSocket = c as Socket;
while (true)
{
try
{
byte[] bufferData = new byte[ * ];
int length = recSocket.Receive(bufferData);
if (length <= )
{
AddShow(recSocket.RemoteEndPoint.ToString() + "正常退出");
listSocket.Remove(recSocket);
//客户端退出会发送一个空字节过来
recSocket.Shutdown(SocketShutdown.Both);
recSocket.Close(); return;
}
string recStr = Encoding.Default.GetString(bufferData, , length);
AddShow(recSocket.RemoteEndPoint.ToString());
AddShow(recStr);
}
catch (Exception ex)
{
//异常退出捕获
AddShow(recSocket.RemoteEndPoint.ToString() + "异常退出");
listSocket.Remove(recSocket);
//客户端退出会发送一个空字节过来
recSocket.Shutdown(SocketShutdown.Both);
recSocket.Close(); }
}
},workSocket);
} },socket); } public void AddShow(string message)
{
//判断现在线程是否是创建txtShow的线程
if (txtShow.InvokeRequired)
{
//在拥有该线程的句柄上去执行
txtShow.Invoke(() =>
{
this.txtShow.Text += message + "\r\n";
});
}
else
{
this.txtShow.Text += message + "\r\n";
}
} private void btnSend_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();
byte[] data = Encoding.Default.GetBytes(str);
//群发消息
foreach (Socket item in listSocket)
{
item.Send(data);
}
}
}
}
客户端代码:
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;
using System.Net.Sockets; namespace Client
{
public partial class Form1 : Form
{
Socket connectSocket = null;
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
} private void btnStart_Click(object sender, EventArgs e)
{
//1.创建一个socket连接
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //2.连接到客户端
socket.Connect(IPAddress.Parse(txtIP.Text.Trim()),int.Parse(txtPort.Text.Trim())); AddShow(socket.RemoteEndPoint.ToString()+"连接成功");
connectSocket = socket; //3.开启异步线程,不停接收消息
Task task = Task.Factory.StartNew(()=> {
while (true)
{
try
{
byte[] bufferData = new byte[ * ];
int length = connectSocket.Receive(bufferData);
if (length<=)
{
//服务器退出,发送空消息
AddShow("连接正常退出");
connectSocket.Shutdown(SocketShutdown.Both);
connectSocket.Close();
return;
}
string str = Encoding.Default.GetString(bufferData, , length);
AddShow(connectSocket.RemoteEndPoint.ToString());
AddShow(str);
}
catch (Exception ex)
{
AddShow("连接异常退出");
if (connectSocket!=null&&connectSocket.Connected)
{
connectSocket.Shutdown(SocketShutdown.Both);
connectSocket.Close();
}
return;
}
} });
} public void AddShow(string message)
{
if (txtShow.InvokeRequired)
{
txtShow.Invoke(() => {
this.txtShow.Text += message + "\r\n";
});
}
else
{
this.txtShow.Text += message + "\r\n";
} } private void btnSend_Click(object sender, EventArgs e)
{
byte[] data = Encoding.Default.GetBytes(txtMsg.Text.Trim());
connectSocket.Send(data);
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//关闭窗体同时关闭socket
if (connectSocket!=null&&connectSocket.Connected)
{
connectSocket.Shutdown(SocketShutdown.Both);
connectSocket.Close();
}
}
}
}
Socket通信客户端和服务端代码的更多相关文章
- c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP 入门级客户端与服务端交互代码 网 ...
- 基于socket.io客户端与服务端的相互通讯
socket.io是对websocket的封装,用于客户端与服务端的相互通讯.官网:https://socket.io/. 下面是socket.io的用法: 1.由于使用express开的本地服务,先 ...
- 根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码
根据wsdl,apache cxf的wsdl2java工具生成客户端.服务端代码 apache cxf的wsdl2java工具的简单使用: 使用步骤如下: 一.下载apache cxf的包,如apac ...
- 用PHP的socket实现客户端到服务端的通信
服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'loca ...
- Python socket编程客户端与服务端通信
[本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...
- 基于socket的客户端和服务端聊天机器人
服务端代码如下: using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threa ...
- [Java]Hessian客户端和服务端代码例子
简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...
- C# Winform 通过Socket实现客户端和服务端TCP通信
操作界面如下: 1.声明Socket 第一个参数:寻址方式,第二个参数:传输数据的方式,第三个参数:通信协议 Socket socket = new Socket(AddressFamily.Inte ...
- 基于socket的客户端和服务端聊天简单使用 附Demo
功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听L ...
随机推荐
- global作用域
1 global在函数内部 $somevar=15; function addit () { GLOBAL $somevar; $somevar++ ; echo "somevar is ...
- MyBatis01 MyBatis基础知识【搞清楚原理】
1 MyBatis是什么 mybatis是一个持久层的框架,它对jdbc做了封装:是apache下的顶级项目 mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成 ...
- 主键primary key和唯一索引unique index
1)主键一定是唯一性索引,唯一性索引并不一定就是主键. 2)主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引. 3)主键常常与外键构成参照完整性约束,防止出现数 ...
- WOJ 18 动态无向图
一开始我是不会写的,后来点开了题解: 无话可说……那就写吧……然而第一发跑成暴力分,后来加了一个优化:就是在询问里面提到过的边都不用再加了. 然后……然后就过了呀…… 其实还有面向数据的编程的骚操作… ...
- Umbraco 中获取一个media item的文件路径 file path
我们要使用UmbracoHelper, 这里就需要用到我们在之前的blog里面写的UmbracoContext 参看这个blog https://www.cnblogs.com/wphl-27 ...
- 防恶意解析,禁止用IP访问网站的Apache设置 修改 httpd.conf 实现
一般来说,网站可以用域名和IP来访问.你的网站可以通过IP直接访问,本来这没什么问题,但是会有些隐患: 由于搜索引擎也会收录你的IP地址的页面,所以同一个页面搜索引擎会重复收录,造成页面的权重不如单个 ...
- HttpGet和HttpPost处理重定向的区别
get方法默认会处理302的重定向,response获取到的页面其实是重定向以后的页面,通过response.getStatusLine(),取到的值是200. 通过设置可以用post方法去请求或者把 ...
- maven tomcat:run指定tomcat7:
配置好下面的内容后,执行 run as -> tomcat7:run 或者tomcat6:run可以将maven的web应用在tomcat6/7里面运行 ,eclipse Indigo 版本默认 ...
- 工作中用的cobbler命令行
在使用cobbler服务器,从pxe启动虚机的时候,经常用到的cobbler命令行 1.查看注册信息 cobbler system report --name=test25 2.注册信息 cobble ...
- UGUI 深度優化提升手遊效能
https://hackmd.io/s/S1z1ByaGb#UGUI-%E6%B7%B1%E5%BA%A6%E5%84%AA%E5%8C%96%E6%8F%90%E5%8D%87%E6%89%8B%E ...