TCP 传递信息
什么是socket?
Socket就是套接字。客户端与服务器之间通信用的。
Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发
TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。
以下是试验代码:
(vs2005/xp试验通过)
一个服务器端与客户端交互,实现客户端与服务器端的传递信息。
一个服务器端与两个客户端交互,实现客户端与服务器端的传递信息。
两个服务器端与一个客户端交互,实现客户端与服务器端的传递信息。(第二个服务器报错)
第三个失败主要是在本机上,没有试验是否在多台机子上是否成功。
客户端代码
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Net.Sockets;
5 using System.IO;
6 //从字节数组中获取字符串时使用该命名空间中的类
7 namespace ConsoleApplication3
8 {
9 //客户端
10 class Program
11 {
12 //const 关键字用于修改字段或局部变量的声明。
13 //它指定字段或局部变量的值是常数,不能被修改
14 private const int portNum = 13;//服务器端口,可以随意修改
15 private const string hostName = "127.0.0.1";//服务器地址,127.0.0.1指本机
16
17 //由于很多COM在.NET环境下如果使用多线程的话,会导致引用的COM不能正常运行,
18 //而如果不声明程序为STAThread的话,.NET就会自动使用多线程来提高效率,
19 //这样就会导致不可预知的后果。
20 [STAThread]
21 static void Main(string[] args)
22 {
23 try
24 {
25 Console.Write("我是客户端,我试着去连接主机 " + hostName + "端口号是:" + portNum.ToString() + "\r\n");
26 //创建一个客户端
27 TcpClient client = new TcpClient(hostName, portNum);//客户端程序类的实现
28
29 NetworkStream ns = client.GetStream();//获取数据流
30
31 //
32 byte[] byteTime1 = Encoding.UTF32.GetBytes("我是客户器端");
33
34 ns.Write(byteTime1,0, byteTime1.Length);
35 //
36
37 //注意,当使用主机名和端口号初始化TcpClient类的实例时,直到跟服务器建立了连接,
38 //个实例才算真正建立,程序才能往下执行。如果因为网络不通,服务器不存在,
39 //服务器端口未开放等等原因而不能连接,程序将抛出异常并且中断执行。
40
41 //建立数据流之后,我们可以使用NetworkStream类的Read()方法从流中读取数据,
42 //使用Write()方法向流中写入数据。读取数据时,首先应该建立一个缓冲区,
43 //具体的说,就是建立一个byte型的数组用来存放从流中读取的数据。Read()方法的原型描述如下:
44
45 //读取流里面的数据
46 byte[] bytes = new byte[1024];
47 int bytesRead = ns.Read(bytes,0, bytes.Length);
48
49 Console.WriteLine(Encoding.UTF32.GetString(bytes, 0, bytesRead).ToString());
50 Console.WriteLine("获取数据流成功。。。");
51 client.Close();
52 Console.ReadLine();//由于是控制台程序,故为了清楚的看到结果,可以加上这句
53
54
55 }
56 catch (Exception e)
57 {
58 Console.WriteLine(e.ToString());
59 }
60 }
61
62
63
64 }
65
66 }
67
2 using System.Collections.Generic;
3 using System.Text;
4 using System.Net.Sockets;
5 using System.IO;
6 //从字节数组中获取字符串时使用该命名空间中的类
7 namespace ConsoleApplication3
8 {
9 //客户端
10 class Program
11 {
12 //const 关键字用于修改字段或局部变量的声明。
13 //它指定字段或局部变量的值是常数,不能被修改
14 private const int portNum = 13;//服务器端口,可以随意修改
15 private const string hostName = "127.0.0.1";//服务器地址,127.0.0.1指本机
16
17 //由于很多COM在.NET环境下如果使用多线程的话,会导致引用的COM不能正常运行,
18 //而如果不声明程序为STAThread的话,.NET就会自动使用多线程来提高效率,
19 //这样就会导致不可预知的后果。
20 [STAThread]
21 static void Main(string[] args)
22 {
23 try
24 {
25 Console.Write("我是客户端,我试着去连接主机 " + hostName + "端口号是:" + portNum.ToString() + "\r\n");
26 //创建一个客户端
27 TcpClient client = new TcpClient(hostName, portNum);//客户端程序类的实现
28
29 NetworkStream ns = client.GetStream();//获取数据流
30
31 //
32 byte[] byteTime1 = Encoding.UTF32.GetBytes("我是客户器端");
33
34 ns.Write(byteTime1,0, byteTime1.Length);
35 //
36
37 //注意,当使用主机名和端口号初始化TcpClient类的实例时,直到跟服务器建立了连接,
38 //个实例才算真正建立,程序才能往下执行。如果因为网络不通,服务器不存在,
39 //服务器端口未开放等等原因而不能连接,程序将抛出异常并且中断执行。
40
41 //建立数据流之后,我们可以使用NetworkStream类的Read()方法从流中读取数据,
42 //使用Write()方法向流中写入数据。读取数据时,首先应该建立一个缓冲区,
43 //具体的说,就是建立一个byte型的数组用来存放从流中读取的数据。Read()方法的原型描述如下:
44
45 //读取流里面的数据
46 byte[] bytes = new byte[1024];
47 int bytesRead = ns.Read(bytes,0, bytes.Length);
48
49 Console.WriteLine(Encoding.UTF32.GetString(bytes, 0, bytesRead).ToString());
50 Console.WriteLine("获取数据流成功。。。");
51 client.Close();
52 Console.ReadLine();//由于是控制台程序,故为了清楚的看到结果,可以加上这句
53
54
55 }
56 catch (Exception e)
57 {
58 Console.WriteLine(e.ToString());
59 }
60 }
61
62
63
64 }
65
66 }
67
//服务器端
1 using System;
2 using System.Net.Sockets;
3 using System.Text;
4 using System.Net;
5 using System.IO;
6
7 //服务器端
8 namespace ConsoleApplication4
9 {
10 class Program
11 {
12 private const int portNum = 13;//端口号
13
14 [STAThread]
15 static void Main(string[] args)
16 {
17 bool done = false;
18 // 首先我们使用端口初始化一个TcpListener实例,并且开始在13端口监听:
19 TcpListener listener = new TcpListener(portNum);//监听客户端
20 listener.Start();
21 while (!done)//循环监听客户端
22 {
23 //如果有未处理的连接请求,使用AcceptTcpClient方法进行处理,并且获取数据流:
24 Console.Write("我是服务器端,我在等待连接...");
25 TcpClient client = listener.AcceptTcpClient();
26
27 // 然后,获取本机时间,并保存在字节数组中,使用NetworkStream.Write()方法写入数据流,
28 //然后客户端就可以通过Read()方法从数据流中获取这段信息:
29 Console.WriteLine("连接成功.");
30 NetworkStream ns = client.GetStream();
31
32 //获取客户端的数据
33 byte[] bytes = new byte[1024];
34 int bytesRead = ns.Read(bytes, 0, bytes.Length);
35
36 Console.WriteLine(Encoding.UTF32.GetString(bytes, 0, bytesRead).ToString());
37 Console.WriteLine("获取数据流成功。。。");
38
39 //
40
41 byte[] byteTime1 = Encoding.UTF32.GetBytes("我是服务器端");
42 try
43 {
44 ns.Write(byteTime1,0, byteTime1.Length);//服务器端通过Write写到数据流里面
45 //------
46 //这时候客户端就可以从数据流里面读数据流
47 //----
48 //关闭流
49 ns.Close();
50 //当
51
52 client.Close();
53 }
54 catch (Exception e)
55 {
56 Console.WriteLine(e.ToString());
57 }
58 }
59
60 listener.Stop();
61 }
62
63
64
65 }
66 }
67
2 using System.Net.Sockets;
3 using System.Text;
4 using System.Net;
5 using System.IO;
6
7 //服务器端
8 namespace ConsoleApplication4
9 {
10 class Program
11 {
12 private const int portNum = 13;//端口号
13
14 [STAThread]
15 static void Main(string[] args)
16 {
17 bool done = false;
18 // 首先我们使用端口初始化一个TcpListener实例,并且开始在13端口监听:
19 TcpListener listener = new TcpListener(portNum);//监听客户端
20 listener.Start();
21 while (!done)//循环监听客户端
22 {
23 //如果有未处理的连接请求,使用AcceptTcpClient方法进行处理,并且获取数据流:
24 Console.Write("我是服务器端,我在等待连接...");
25 TcpClient client = listener.AcceptTcpClient();
26
27 // 然后,获取本机时间,并保存在字节数组中,使用NetworkStream.Write()方法写入数据流,
28 //然后客户端就可以通过Read()方法从数据流中获取这段信息:
29 Console.WriteLine("连接成功.");
30 NetworkStream ns = client.GetStream();
31
32 //获取客户端的数据
33 byte[] bytes = new byte[1024];
34 int bytesRead = ns.Read(bytes, 0, bytes.Length);
35
36 Console.WriteLine(Encoding.UTF32.GetString(bytes, 0, bytesRead).ToString());
37 Console.WriteLine("获取数据流成功。。。");
38
39 //
40
41 byte[] byteTime1 = Encoding.UTF32.GetBytes("我是服务器端");
42 try
43 {
44 ns.Write(byteTime1,0, byteTime1.Length);//服务器端通过Write写到数据流里面
45 //------
46 //这时候客户端就可以从数据流里面读数据流
47 //----
48 //关闭流
49 ns.Close();
50 //当
51
52 client.Close();
53 }
54 catch (Exception e)
55 {
56 Console.WriteLine(e.ToString());
57 }
58 }
59
60 listener.Stop();
61 }
62
63
64
65 }
66 }
67