u3d udp服务器 - c_dragon - 博客园 http://www.cnblogs.com/dragon2012/p/4244066.html
using
UnityEngine;
using
System.Collections;
using
System.Net;
using
System.Net.Sockets;
using
System.Text;
using
System;
using
System.Threading;
public
class
udpServer :MonoBehaviour
{
private
Socket newsock;
//定义一个socket变量
IPEndPoint ip;
//定义一个IP地址和端口号
int
recv;
//定义一个接受值的变量
byte
[] data =
new
byte
[1024];
//定义一个二进制的数组用来获取客户端发过来的数据包
string
mydata;
void
Start()
{
//得到本机IP,设置TCP端口号
ip =
new
IPEndPoint(IPAddress.Any, 12345);
//设置自身的IP和端口号,在这里IPAddress.Any是自动获取本机IP
newsock =
new
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//实例化socket对象设置寻址方案为internetwork(IP版本的4存放),设置Soket的类型,为Dgram(支持数据报形式的数据),设置协议的类型,为UDP
//绑定网络地址
newsock.Bind(ip);
//绑定IP
Debug.Log(
"This is a Server,host name is "
+ Dns.GetHostName());
//输出本地的名字
Debug.Log(
"Waiting for a client"
);
//BeginReceives();
Thread test =
new
Thread(BeginListening);
//定义一个子线程
test.Start();
//子线程开始
}
void
BeginListening()
{
IPEndPoint sender =
new
IPEndPoint(IPAddress.Any, 0);
//实例化一个网络端点,设置为IPAddress.Any为自动获取跟我通讯的IP,0代表所有的地址都可以
EndPoint Remote = (EndPoint)(sender);
//实例化一个地址结束点来标识网络路径
// Debug.Log(Encoding.ASCII.GetString(data, 0, recv));//输出二进制转换为string类型用来测试
while
(
true
)
{
data =
new
byte
[1024];
//实例化data
recv = newsock.ReceiveFrom(data,
ref
Remote);
//将数据包接收到的数据放入缓存点,并存储终节点
//Debug.Log(Encoding.ASCII.GetString(data, 0, recv));
mydata = Encoding.ASCII.GetString(data, 0, recv);
Debug.Log(mydata);
// newsock.SendTo(Encoding.ASCII.GetBytes(mydata),mydata.Length,SocketFlags.None,Remote);
}
}
string
input =
""
;
void
SendMessage(
string
message)
{
byte
[] data =
new
byte
[1024];
Debug.Log(
"This is a client,host name is"
+ Dns.GetHostName());
//IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//实例化一个网络端点,设置为IPAddress.Any为自动获取跟我通讯的IP,0代表所有的地址都可以
EndPoint Remote = (EndPoint)(ip);
//实例化一个地址结束点来标识网络路径
Socket server =
new
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//string welcome = "你好";
//data = Encoding.ASCII.GetBytes(welcome);
ip =
new
IPEndPoint(IPAddress.Parse(
"192.168.1.120"
), 12346);
// server.SendTo(data, data.Length, SocketFlags.None, ip);
// data = new byte[1024];
server.SendTo(Encoding.ASCII.GetBytes(message), ip);
// data = new byte[1024];
Debug.Log(
"Stopping Client."
);
server.Close();
}
void
OnGUI()
{
//input = GUILayout.TextField(input);
input = GUI.TextField(
new
Rect(100, 50, 60, 30), input);
if
(GUI.Button(
new
Rect(100, 90, 60, 30),
"Send"
))
{
SendMessage(input);
}
}
void
OnApplicationQuit()
{
newsock.Close();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
using
System;
using
UnityEngine;
using
System.Collections.Generic;
using
System.Linq;
using
System.Net;
using
System.Net.Sockets;
using
System.Text;
using
System.Threading;
public
struct
mystructs
{
public
int
Age;
//获取结构里的
public
string
name;
public
float
Height;
public
mystructs(
int
myage,
string
myname,
float
myheight)
{
Age = myage;
name = myname;
Height = myheight;
}
}
public
class
udpMystruct : MonoBehaviour
{
int
Age;
string
Name;
//获取
float
Height;
private
Socket newsock;
//定义一个socket变量
IPEndPoint ip;
//定义一个IP地址和端口号
int
recv;
//定义一个接受值的变量
byte
[] data =
new
byte
[1024];
//定义一个二进制的数组用来获取客户端发过来的数据包
byte
[] bytedate =
new
byte
[1024];
string
mydata;
void
Start()
{
mystructs my;
//将结构初始化 付给另一个
Age = my.Age = 17;
Name = my.name =
" haha "
;
Height = my.Height = 180.50f;
Debug.Log(Age + Name + Height);
byte
[] agebyte =
new
byte
[1024];
//定义二进制数组
byte
[] namebyte =
new
byte
[1024];
byte
[] heightbyte =
new
byte
[1024];
agebyte = Encoding.ASCII.GetBytes(Age.ToString());
//转换成二进制的
namebyte = Encoding.ASCII.GetBytes(Name);
heightbyte = Encoding.ASCII.GetBytes(Height.ToString());
bytedate =
new
byte
[agebyte.Length + namebyte.Length + heightbyte.Length];
//byte
agebyte.CopyTo(bytedate, 0);
//把值 拷贝 给bytedate 索引
namebyte.CopyTo(bytedate, agebyte.Length);
//agebyte索引开始
heightbyte.CopyTo(bytedate, namebyte.Length);
//string sss = Encoding.ASCII.GetString(data);
// Debug.Log(sss);
//得到本机IP,设置TCP端口号
ip =
new
IPEndPoint(IPAddress.Parse(
"192.168.1.120"
), 12346);
//设置自身的IP和端口号,在这里IPAddress.Any是自动获取本机IP
newsock =
new
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//实例化socket对象设置寻址方案为internetwork(IP版本的4存放),设置Soket的类型,为Dgram(支持数据报形式的数据),设置协议的类型,为UDP
//绑定网络地址
newsock.Bind(ip);
//绑定IP
Debug.Log(
"This is a Server,host name is "
+ Dns.GetHostName());
//输出本地的名字
Debug.Log(
"Waiting for a client"
);
Thread test =
new
Thread(BeginListening);
//定义一个子线程
test.Start();
//子线程开始
}
void
BeginListening()
{
// IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//实例化一个网络端点,设置为IPAddress.Any为自动获取跟我通讯的IP,0代表所有的地址都可以
EndPoint Remote = (EndPoint)(ip);
//实例化一个地址结束点来标识网络路径
Debug.Log(Encoding.ASCII.GetString(data, 0, recv));
//输出二进制转换为string类型用来测试
while
(
true
)
{
data =
new
byte
[1024];
//实例化data
recv = newsock.ReceiveFrom(data,
ref
Remote);
//将数据包接收到的数据放入缓存点,并存储终节点
//Debug.Log(Encoding.ASCII.GetString(data, 0, recv));
mydata = Encoding.ASCII.GetString(data, 0, recv);
Debug.Log(mydata);
// newsock.SendTo(Encoding.ASCII.GetBytes(mydata),mydata.Length,SocketFlags.None,Remote);
}
}
string
input =
""
;
void
SendMessage(
string
message)
{
byte
[] data =
new
byte
[1024];
byte
[] messbyte =
new
byte
[1024];
Debug.Log(
"This is a client,host name is "
+ Dns.GetHostName());
ip =
new
IPEndPoint(IPAddress.Parse(
"192.168.1.120"
), 12345);
Socket server =
new
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
EndPoint ep = (EndPoint)ip;
//string welcome = "你好";
//data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ep);
messbyte = Encoding.ASCII.GetBytes(message);
data =
new
byte
[bytedate.Length + messbyte.Length];
bytedate.CopyTo(data, 0);
messbyte.CopyTo(data, bytedate.Length);
server.SendTo(data, ep);
data =
new
byte
[1024];
Debug.Log(
"Stopping Client."
);
server.Close();
}
void
OnGUI()
{
input = GUILayout.TextField(input);
if
(GUILayout.Button(
"发送"
))
{
SendMessage(input);
}
}
void
OnApplicationQuit()
{
newsock.Close();
}
|