这两天研究了下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通信客户端和服务端代码的更多相关文章

  1. c++ 网络编程(一)TCP/UDP windows/linux 下入门级socket通信 客户端与服务端交互代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9601511.html c++ 网络编程(一)TCP/UDP  入门级客户端与服务端交互代码 网 ...

  2. 基于socket.io客户端与服务端的相互通讯

    socket.io是对websocket的封装,用于客户端与服务端的相互通讯.官网:https://socket.io/. 下面是socket.io的用法: 1.由于使用express开的本地服务,先 ...

  3. 根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码

    根据wsdl,apache cxf的wsdl2java工具生成客户端.服务端代码 apache cxf的wsdl2java工具的简单使用: 使用步骤如下: 一.下载apache cxf的包,如apac ...

  4. 用PHP的socket实现客户端到服务端的通信

    服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'loca ...

  5. Python socket编程客户端与服务端通信

    [本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...

  6. 基于socket的客户端和服务端聊天机器人

    服务端代码如下: using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threa ...

  7. [Java]Hessian客户端和服务端代码例子

    简要说明:这是一个比较简单的hessian客户端和服务端,主要实现从客户端发送指定的数据量到服务端,然后服务端在将接收到的数据原封不动返回到客户端.设计该hessian客户端和服务端的初衷是为了做一个 ...

  8. C# Winform 通过Socket实现客户端和服务端TCP通信

    操作界面如下: 1.声明Socket 第一个参数:寻址方式,第二个参数:传输数据的方式,第三个参数:通信协议 Socket socket = new Socket(AddressFamily.Inte ...

  9. 基于socket的客户端和服务端聊天简单使用 附Demo

    功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听L ...

随机推荐

  1. css 层叠式样式表(2)

    一,样式表分类 (1)内联样式. --优先级最高,代码重复使用最差. (当特殊的样式需要应用到单独某个元素时,可以使用. 直接在相关的标签中使用样式属性.样式属性可以包含任何 CSS 属性.) (2) ...

  2. IFC标准 IFCWALLSTANDARDCASE参数说明

    例如: #229= IFCWALLSTANDARDCASE('3_ydjarPr1s9tRASGqIAUD',#41,'\X2\57FA672C5899\X0\:\X2\78165899\X0\240 ...

  3. 算法Sedgewick第四版-第1章基础-024-M/M/1 queue

    /****************************************************************************** * Compilation: javac ...

  4. JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-004Table per class hierarchy(@Inheritance..SINGLE_TABLE)、@DiscriminatorColumn、@DiscriminatorValue、@DiscriminatorFormula)

    一.结构 You can map an entire class hierarchy to a single table. This table includes columns for all pr ...

  5. R: 基本的数学运算

    ################################################### 问题:基本数学运算   18.4.30 R语言用于初等数学的计算,都怎么表示??加减乘除.余数. ...

  6. CF 464E The Classic Problem

    补一补之前听课时候的题. 考虑使用dij算法求最短路,因为边权存不下,所以考虑用主席树维护二进制位,因为每一次都只会在一个位置进行修改,所以可以暴力进位,这样均摊复杂度是对的. <算法导论> ...

  7. Luogu 3942 将军令

    之前写那个(Luogu 2279) [HNOI2003]消防局的设立的时候暴力推了一个树形dp,然后就导致这个题不太会写. 贪心,先把树建出来,然后考虑按照结点深度排个序,每次取出还没有被覆盖掉的深度 ...

  8. 1.初学c++,比较困惑的问题。

    1.c++是一门实用的语言吗? c++是一个实用的工具,它很有用. 在工业软件世界中,c++被视为坚实和成熟的主流工具.它具有广泛的行业支持和好批. 2.面向对象编程在c++中的作用? 我们要开发一个 ...

  9. jQuery选择器和选取方法.RP

    我们已经使用了带有简单Css选择器的jQuery选取函数:$().现在是时候深入了解jQuery选择器语法,以及一些提取和扩充选中元素集的方法了. 一.jQuery选择器 在CSS3选择器标淮草案定义 ...

  10. java的编码问题详解

    ucenter的中文问题终于解决,这也暴露我对Java编码知识的严重不足,经过多次试验和搜索,对这块知识终于有了一个新的认识,所以把理解的内容写道这里 1:JVM的内存中字符串的编码格式是统一的吗? ...