最近朋友建议我写一些关于微软云技术的博客留给学校下一届的学生们看,怕下一届的MSTC断档。于是我也觉的有这个必要。写了几篇博客之后,我觉得也有必要把这一年的学习内容放在博客做个纪念,就这样写了本篇博客。
该程序可以在公共网络上运行,只要输入服务器的IP地址即可。
程序不是很难,由于时间过了一年多了,现在也不好详细讲解了。就贴一下代码,程序还是很容易理解的,看英文单词就知道代码的意思了。
客户端代码在:http://blog.csdn.net/arsenal1109389480/article/details/12400385
第一步:建一个Winform程序
第二步:添加一个类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
namespace server
{
class StreamObject
{
public TcpClient client;
public NetworkStream netStream;
public byte[] readBytes;
public byte[] writeBytes;
public StreamObject(TcpClient client)
{
this.client = client;
netStream = client.GetStream();
readBytes = new byte[client.ReceiveBufferSize];
writeBytes = new byte[client.SendBufferSize];
}
public void InitReadArray()
{
readBytes = new byte[client.ReceiveBufferSize];
}
public void InitWriteArray()
{
writeBytes = new byte[client.SendBufferSize];
}
}
}
第三步:服务器代码
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;
using System.Threading;
using System.IO;
namespace server
{
public partial class ServerMain : Form
{
System.Collections.ArrayList clientList = new System.Collections.ArrayList();
Thread ServerThread;
private delegate void SetListBoxStatuCallback(string str);
private SetListBoxStatuCallback setlistboxstatucallback;
private delegate void SetListBoxRecieveCallback(string str);
private SetListBoxRecieveCallback setlistboxrecievecallback;
bool isExit = false;
private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.ManualReset);
public ServerMain()
{
InitializeComponent();
setlistboxstatucallback = new SetListBoxStatuCallback(SetListboxStatu);
setlistboxrecievecallback = new SetListBoxRecieveCallback(SetListboxRecieve);
}
private void ServerMain_Load(object sender, EventArgs e)
{
startlisten.Enabled = true;
stoplisten.Enabled = false;
labelstatu.Text = "等待运行......";
}
private void startlisten_Click(object sender, EventArgs e)
{
startlisten.Enabled = false;
stoplisten.Enabled = true;
ThreadStart ts = new ThreadStart(AcceptConnect);
ServerThread = new Thread(ts);
ServerThread.Start();
}
private void AcceptConnect()
{
TcpListener listener;
IPAddress IP = IPAddress.Parse("127.0.0.1");
listener = new TcpListener(IP, Convert.ToInt32(portText.Text));
listener.Start();
while (isExit == false)
{
try
{
allDone.Reset();
AsyncCallback callback = new AsyncCallback(AcceptTcpClient);
listBoxStatus.Invoke(setlistboxstatucallback, "开始等待用户连接");
listener.BeginAcceptTcpClient(callback, listener);
allDone.WaitOne();
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}
}
private void AcceptTcpClient(IAsyncResult ar)
{
try
{
allDone.Set();
TcpListener myListener = (TcpListener)ar.AsyncState;
TcpClient myclient = myListener.EndAcceptTcpClient(ar);
listBoxRecieve.Invoke(setlistboxrecievecallback,
"已接受客户连接" + myclient.Client.RemoteEndPoint);
StreamObject streamobject = new StreamObject(myclient);
clientList.Add(streamobject);
SendString("用户"+myclient.Client.RemoteEndPoint+"进入服务器");
streamobject.netStream.BeginRead(streamobject.readBytes,
0, streamobject.readBytes.Length, ReadCallback, streamobject);
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}
private void ReadCallback(IAsyncResult ar)
{
try
{
StreamObject streamobject = (StreamObject)ar.AsyncState;
int count = streamobject.netStream.EndRead(ar);
SendString(string.Format("[来自{0}]{1}", streamobject.client.Client.RemoteEndPoint,
System.Text.Encoding.UTF8.GetString(streamobject.readBytes,
0, count)));
if (isExit == false)
{
streamobject.InitReadArray();
streamobject.netStream.BeginRead(streamobject.readBytes,
0, streamobject.readBytes.Length, ReadCallback, streamobject);
}
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
}
private void SendString(string str)
{
StreamObject streamobject;
for(int i=0;i<clientList.Count;i++)
{
streamobject = (StreamObject)clientList[i];
try
{
streamobject.writeBytes = System.Text.Encoding.UTF8.GetBytes(str);
streamobject.netStream.BeginWrite(streamobject.writeBytes, 0,
streamobject.writeBytes.Length,
new AsyncCallback(SendCallback), streamobject);
streamobject.netStream.Flush();
}
catch
{
clientList.RemoveAt(i);
SendString(string.Format("用户{0}离开服务器。",streamobject.client.Client.RemoteEndPoint));
streamobject.netStream.Close();
}
}
}
private void SendCallback(IAsyncResult ar)
{
StreamObject streamobject = (StreamObject)ar.AsyncState;
try
{
streamobject.netStream.EndWrite(ar);
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
private void SetListboxStatu(string str)
{
listBoxStatus.Items.Add(str);
listBoxStatus.SelectedIndex = listBoxStatus.Items.Count - 1;
listBoxStatus.ClearSelected();
}
private void SetListboxRecieve(string str)
{
listBoxRecieve.Items.Add(str);
listBoxRecieve.SelectedIndex = listBoxRecieve.Items.Count - 1;
listBoxRecieve.ClearSelected();
}
private void stoplisten_Click(object sender, EventArgs e)
{
//使线程自动结束
isExit = true;
//将事件状态设置为终止状态,允许一个或者多个等待线程继续
//从而使线程正常结束
allDone.Set();
startlisten.Enabled = true;
stoplisten.Enabled = false;
}
}
}
分享到:
相关推荐
详见:https://blog.csdn.net/weixin_38566632/article/details/124289573 Qt网络编程——TCP 1. 概念 2. 服务器 3. 客户端 4. TCP服务器和客户端互传文件
Linux下网络编程TCP客户端和服务器端数据传输代码的实现,c语言程序,使用前请阅读readme.txt
基于TCP的Socket编程服务器和客户端代码
对初学习linux网络编程的同学给予一点小小的帮助,希望大家多多支持!
网络编程合集 TCP-IP详解 windows Linux UNIX Ace 网络编程 搜索关键字:网络编程 TCP-IP详解 windows Linux UNIX 网络编程1_TCP-IP详解卷1.rar 网络编程2_TCP-IP详解卷2-1.rar 网络编程3_windows网络编程电子书及...
完整版本网络编程 TCP Socket 同步、异步操作,已经在项目中测试,日访问量超16万次,主要为封装的类,可以直接调用,支持星跳包【适合学习和对性能要求较高的开发者】
网络程序设计TCP echo 客户端与服务器端源代码
Java网络编程之TCP协议下—上传文件到服务器程序,欢迎大家下载和知道
代码采用C#编写,服务器采用异步方式,带有测试的例子。
linux下多线程网络编程TCP服务器端数据传输代码,C语言程序,使用前请阅读readme.txt
基于TCP网络编程实现代码:客户端与服务器数据通信
使用socket类做的一个客户端 一个服务器 可以开启多个客户端来连接服务器,对于刚学习网络编程的人来说是个好的例子 O(∩_∩)O~,在客户端里面还有个按钮叫做一直发送里面是tcp客户端用多线程同步发送1000条数据到...
TCP的简单使用为同步,但作为工程使用效率不高 此为TCP异步通信封装类文件,使用事件来通知连接、断开信息,并传送数据 若有错误不吝赐教
在C#中使用异步Socket编程实现TCP网络服务的CS的通讯构架.
C#语言,运用TCP异步收发信息。客户端只要知道服务器端IP和端口号,就可以和服务器建立连接,异步收发信息。本实例包括服务器端和客户端程序,并且有很详细的注释,希望大家看后能有一定的收获。
qt编程实现客户端与服务器端通信 QT编程TCP协议使用户端和服务器端通信 服务器端
基于TCP异步编程的聊天程序,包括服务器和客户端两个项目,在VS2008上编译通过。服务器端在监听、接收和发送时都采用异步方式;同样,客户端在连接、接收和发送时也采用异步方式。
网络编程合集 TCP-IP详解 windows Linux UNIX Ace 网络编程 搜索关键字:网络编程 TCP-IP详解 windows Linux UNIX 网络编程1_TCP-IP详解卷1.rar 网络编程2_TCP-IP详解卷2-1.rar 网络编程3_windows网络编程电子书及...
boost.asio库是一个跨平台的网络及底层IO的C++编程库,它使用现代C++手法实现了统一的异步调用模型。 boost.asio库支持TCP、UDP、ICMP通信协议。 下面介绍同步TCP模式: 大家好!我是同步方式! 我的主要特点...
SOCKET TCP 文件传输 客户端 服务器端 client svever 实现简易文件传输功能