博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
server and client
阅读量:6692 次
发布时间:2019-06-25

本文共 3691 字,大约阅读时间需要 12 分钟。

server:

 

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace multithreadserv

{
class Threadtcpserver
{
private Socket server;
private int userNum;//在线客户数量
private int socketNum;//连接服务段的数量
private Socket[] socketUser = new Socket[40];//存储在线的客户端

// 将客服端 nowClient 发来的信息 data,发送给其他在线的每个客户端,不包括 nowClient客服端。

private void SendAllUser(byte[] data, Socket nowClient)
{
if (userNum > 0)
{
for (int i = 0; i < socketNum; i++)
{
if (socketUser[i].Equals(nowClient)) continue;

// 在发送过程中可能有些客户已经离线,会发生异常

try
{
socketUser[i].Send(data);
}
catch
{
// 当一个发现异常后,说明 socket[i] 已经离线,需要从socketUser[] 数组中将其删除
Socket temp = socketUser[i];
socketUser[i] = socketUser[socketNum - 1];
i--;
socketNum--;
}
}
}
}

// 客户端 client 的接受信息的方法

private void ReceiveData(object client)
{
Socket nowClient = (Socket)client;
while (true)
{
int res = 0;
byte[] bytes = new byte[1024];
// 不段的接受客户端发来的信息, 当客户端离线后,退出。
try
{
res = nowClient.Receive(bytes);
}
catch
{
// client 离线,更新userNum 值
userNum--;
Console.WriteLine("现在有:{0} 个客户在连接中。", userNum);
return;
}
string str = Encoding.UTF8.GetString(bytes, 0, res);
byte[] data = Encoding.UTF8.GetBytes(str);
//将该信息发送给其他客户端
SendAllUser(data, nowClient);
}
}

// 侦听上线的客户端

private void AccpetUser()
{
while (true)
{
// 当侦听到一个客户端上线后,更新socketUser[],并给此客户端开一个接受信息的线程
Socket nowClient = server.Accept();
socketUser[socketNum++] = nowClient;
userNum++;
Console.WriteLine("现在有:{0} 个客户在连接中。", userNum);

// 开一个线程, 接受 nowClient 发来的信息。

// 这里调用的方法为有参数的方法, 需要使用委托。
Thread nowThread = new Thread(new ParameterizedThreadStart(ReceiveData));
//nowThread.IsBackground = true;
nowThread.Start(nowClient);
}
}

// 构造函数

public Threadtcpserver()
{
userNum = 0;
socketNum = 0;

//初始化 IP 地址

IPAddress local = IPAddress.Parse("192.168.1.101");//客户端的 IPAddress 地址
IPEndPoint iep = new IPEndPoint(local, 3000);// 端口为3000

server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

// 将套接字与本地终结点绑定

server.Bind(iep);

//在本地 3000 端口行上进行监听

server.Listen(20);

Console.WriteLine("等待客户级进行连接...");

AccpetUser();
}
static void Main(string[] args)
{
Threadtcpserver instance = new Threadtcpserver();
}
}

}

Client:

 

using System;

using System.Collections.Generic;
using System.Text;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace multithreadclient

{
class ClientSocket
{
// public string names;
public Socket client;
public ClientSocket()
{
client = null;
}
public void ReceiveData()
{
byte[] data = new byte[1024];
while (true)
{
int res = 0;
try
{
res = client.Receive(data);
}
catch
{
Console.WriteLine("与服务器断开连接!");
return;
}

Console.WriteLine(Encoding.UTF8.GetString(data, 0, res));

Console.WriteLine();
}
}
static void Main(string[] args)
{
//byte[] buf = new byte[1024];
ClientSocket ads = new ClientSocket();

IPAddress local = IPAddress.Parse("192.168.1.101");// 服务器的 IPAddres 地址

IPEndPoint iep = new IPEndPoint(local, 3000);
try
{
ads.client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ads.client.Connect(iep);
}
catch (SocketException)
{
Console.WriteLine("无法连接到服务器");
Console.ReadLine();
return;
}
finally
{
}

Console.Write("连接成功, 请输入昵称:");

string names = Console.ReadLine();

Thread newThread = new Thread(new ThreadStart(ads.ReceiveData));

newThread.Start();
names += " 说:";
while (true)
{
// 在控制台上输入一条消息
//Console.WriteLine("我想说:");
Console.WriteLine();
string input = Console.ReadLine();
input = names + input;
ads.client.Send(Encoding.UTF8.GetBytes(input));
}
Console.WriteLine("断开与服务器的连接...");
ads.client.Close();
Console.ReadLine();
}
}
}

转载于:https://www.cnblogs.com/QQing-xu/p/4832692.html

你可能感兴趣的文章
CentOS进入图形界面
查看>>
C#--web services之wsdl文件生成cs
查看>>
配置Apache+Tomcat实现SSO(单点登录)
查看>>
《Pro ASP.NET MVC 3 Framework》学习笔记之十五【示例项目SportsStore】
查看>>
Ext右键菜单完整版
查看>>
2012年1月凯立德地图普高清全分辨率懒人包P1750-D5616-2721J09(完美破解,已上路实测,永久下载地址)...
查看>>
SwipeBackActivity 的使用
查看>>
不停止MySQL服务增加从库的两种方式
查看>>
点击div折叠
查看>>
Sqli-LABS通关笔录-2
查看>>
hessian 在spring中的使用 (bean 如 Dao无法注入的问题)
查看>>
ccbpm工作流引擎是怎样支持多种流程模式的
查看>>
Unity打包android的apk与数据包.obb分离和apk签名
查看>>
hive 运行sqlclient异常
查看>>
Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile 解决办法
查看>>
maven中pom文件配置解决资源文件的编码问题
查看>>
Generative Adversarial Nets[LSGAN]
查看>>
Apache Nifi在Windows环境下搭建伪群集及证书登录
查看>>
socket的bind函数是不是只能绑定本地IP,不能绑定外网IP么?
查看>>
MySql 常用命令总结
查看>>