zoukankan
html css js c++ java
使用 UDPClient 生成聊天客户端
using
System;
using
System.Net;
using
System.Net.Sockets;
using
System.Threading;
using
System.Text;
public
class
Chat
{
private
static
UdpClient m_Client;
private
static
int
ListenerPort
=
8080
;
private
static
int
SenderPort
=
8080
;
private
static
int
LocalPort;
private
static
int
RemotePort;
private
static
string
m_szHostName;
private
static
IPAddress m_GroupAddress;
private
static
IPHostEntry m_LocalHost;
private
static
IPEndPoint m_RemoteEP;
private
static
bool
m_Done
=
false
;
public
static
void
Usage()
{
Console.WriteLine(
"
UDP 多路广播聊天实用工具
"
);
Console.WriteLine(
"
\n用法::
"
);
Console.WriteLine(
"
chat.exe
"
);
}
public
static
void
Main( String [] args )
{
LocalPort
=
SenderPort;
RemotePort
=
ListenerPort;
if
( args.Length
>
0
)
{
//
//
输出帮助消息,因为此实用工具不采用任何参数
//
Usage();
return
;
}
m_szHostName
=
Dns.GetHostName();
m_LocalHost
=
Dns.GetHostByName(m_szHostName);
Console.WriteLine(
"
本地端口:{0},远程端口:{1}
"
, LocalPort, RemotePort);
Console.WriteLine(
"
正在初始化
"
);
Initialize();
Console.WriteLine(
"
正在启动侦听器线程
"
);
Thread t
=
new
Thread(
new
ThreadStart(Listener));
t.Start();
Byte [] buffer
=
null
;
Encoding ASCII
=
Encoding.ASCII;
bool
m_ShuttingDown
=
false
;
while
(
!
m_ShuttingDown)
{
String s
=
Console.ReadLine();
if
( s.Length
==
0
)
continue
;
if
(String.Compare(s,
0
,
"
@
"
,
0
,
1
)
==
0
)
{
m_Done
=
true
;
//
//
将结束符发送给我们自己,
//
以便接收线程可以关闭
//
s
=
m_szHostName
+
"
:@
"
;
m_ShuttingDown
=
true
;
}
else
{
s
=
m_szHostName
+
"
:
"
+
s;
}
buffer
=
new
Byte[s.Length
+
1
];
//
//
将数据发送给远程对方主机
//
int
len
=
ASCII.GetBytes( s.ToCharArray(),
0
, s.Length, buffer,
0
);
int
ecode
=
m_Client.Send(buffer, len, m_RemoteEP);
if
(ecode
<=
0
)
{
Console.WriteLine(
"
发送时出错:
"
+
ecode);
}
}
t.Abort();
t.Join();
Console.WriteLine(
"
正在关闭连接
"
);
Terminate();
}
//
Main
public
static
void
Terminate()
{
m_Client.DropMulticastGroup(m_GroupAddress);
}
public
static
void
Initialize()
{
//
//
实例化 UdpCLient
//
m_Client
=
new
UdpClient(LocalPort);
//
//
创建多路广播组对象
//
m_GroupAddress
=
IPAddress.Parse(
"
224.0.0.1
"
);
//
//
联接组
//
try
{
m_Client.JoinMulticastGroup(m_GroupAddress,
100
);
}
catch
(Exception)
{
Console.WriteLine(
"
无法联接多路广播组
"
);
}
//
//
创建对方主机的终结点
//
m_RemoteEP
=
new
IPEndPoint( m_GroupAddress, RemotePort );
}
public
static
void
Listener()
{
//
//
侦听器等待数据到来
//
并用缓冲区保存它。
Thread.Sleep(
2000
);
//
确保 client2 正在接收
Encoding ASCII
=
Encoding.ASCII;
while
(
!
m_Done)
{
IPEndPoint endpoint
=
null
;
Byte[] data
=
m_Client.Receive(
ref
endpoint);
String strData
=
ASCII.GetString(data);
if
( strData.IndexOf(
"
:@
"
)
>
0
)
{
//
//
我们接收到一个终止指示,
//
现在我们必须确定它是来
//
自我们的主线程的关闭,
//
还是来自其他地方
//
Char [] separators
=
{
'
:
'
}
;
String [] vars
=
strData.Split(separators);
if
( vars[
0
]
==
m_szHostName )
{
//
//
这是来自我们自己的线程,因此
//
立即结束
//
Console.WriteLine(
"
正在关闭侦听器线程
"
);
//
//
此过程应已由主线程完成了,但为
//
安全起见,我们再执行一次
//
m_Done
=
true
;
}
else
{
//
//
这是来自其他地方的
//
Console.WriteLine(
"
{0} 已离开对话
"
, vars[
0
]);
}
}
else
{
//
//
这是从其他地方以及我们自己
//
处接收到的正常数据
//
在输出前,查看它是否来自我
//
们自己
//
if
(strData.IndexOf(
"
:
"
)
>
0
)
{
Char [] separators
=
{
'
:
'
}
;
String [] vars
=
strData.Split(separators);
if
( vars[
0
]
!=
m_szHostName )
{
Console.WriteLine(strData);
}
}
}
}
Console.WriteLine(
"
侦听器线程已完成
"
);
return
;
}
}
/************************************************/
本博客内容如果是原著都会在标题后加上(原著)字样,未加者多数为转载.
/************************************************/
查看全文
相关阅读:
CentOS 出错处理
g13 root
修复误删系统文件
c++ list sort方法
批量修改outlook联系人头像,并同步手机
IT大牛们 学术搜索
oracle 表空间操作
CentOS 5.5 安装MPICH2\MRNet\Launchmon时遇到的问题
自我反省
积累航程
原文地址:https://www.cnblogs.com/ghfsusan/p/1525794.html
最新文章
django框架进阶form组件长期维护
python后端面试第二部分:网络编程和并发编程长期维护
python后端面试第一部分:python基础长期维护
django框架进阶使用缓存长期维护
11python预备知识计算机基础知识
crm项目权限组件
23python语法基础基础运算符
django框架基础django模板语言长期维护
21python语法基础基础python语法,变量和数据类型
JSP+SQL2000开发环境安装配置
热门文章
vs2003入门一些问题搜集解决办法整理20090220
C# 两个textBox控件调用同一个monthCalendar输入日期
replaceAll的使用方法搜集整理
AccessHelper到SqlHelper的转换
JSP中使用PreparedStatement操作数据库
C# 从Excel表中导入数据函数到DataSet
JSP开发环境搭配20081215
JSP开发环境搭配20080627
JSP禁止缓存代码
【教程】win7系统笔记本做无线路由器
Copyright © 2011-2022 走看看