Gửi và nhận DataTable qua Socket trong C

37
Gửi và nhận DataTable qua Socket trong C# Phương thức này dùng để Serialize một đối tượng bất kỳ thành mảng byte 1 public byte[] SerializeData(Object o) 2{ 3 MemoryStream ms = new MemoryStream(); 4 BinaryFormatter bf1 = new BinaryFormatter(); 5 bf1.Serialize(ms, o); 6 return ms.ToArray(); 7} Phương thức này dùng để DeSerialize một mảng byte thành đối tượng bất kỳ 1 public object DeserializeData(byte[] theByteArray) 2{ 3 MemoryStream ms = new MemoryStream(theByteArray); 4 BinaryFormatter bf1 = new BinaryFormatter(); 5 ms.Position = 0; 6 return bf1.Deserialize(ms); 7}

Transcript of Gửi và nhận DataTable qua Socket trong C

Page 1: Gửi và nhận DataTable qua Socket trong C

Gửi và nhận DataTable qua Socket trong C#

Phương thức này dùng để Serialize một đối tượng bất kỳ thành mảng byte

1 public byte[] SerializeData(Object o)

2 {

3 MemoryStream ms = new MemoryStream();

4 BinaryFormatter bf1 = new BinaryFormatter();

5 bf1.Serialize(ms, o);

6 return ms.ToArray();

7 }

Phương thức này dùng để DeSerialize một mảng byte thành đối tượng bất kỳ

1 public object DeserializeData(byte[] theByteArray)

2 {

3 MemoryStream ms = new MemoryStream(theByteArray);

4 BinaryFormatter bf1 = new BinaryFormatter();

5 ms.Position = 0;

6 return bf1.Deserialize(ms);7 }

Tạo SolutionBạn tạo 1 solution có tên chẳng hạn là SocketInCSharp.

1. Đầu tiên là ở server: Add 1project, đặt tên là SocketServer, thêm 1 form và trên form thêm 1

nút có tên Start. Kết quả như sau:

Source code như sau:

Page 2: Gửi và nhận DataTable qua Socket trong C

01 using System;

02 using System.Collections.Generic;

03 using System.ComponentModel;

04 using System.Data;

05 using System.Drawing;

06 using System.Text;

07 using System.Windows.Forms;

08 using System.Net;

09 using System.Net.Sockets;

10 using System.Runtime.Serialization;

11 using System.Runtime.Serialization.Formatters.Binary;

12 using System.IO;

13 namespace SocketServer

14 {

15 public partial class Form1 : Form

16 {

17 private Socket sock = null;

18 public Form1()

19 {

20 InitializeComponent();

21 }

22

23 private void startButton_Click(object sender, EventArgs e)

24 {

25 startButton.Text = "In process...";

26 Application.DoEvents();

27

28 IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5656);

29sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

30 sock.Bind(ipEnd);

Page 3: Gửi và nhận DataTable qua Socket trong C

31 sock.Listen(100);

32 Socket clientSock = sock.Accept();

33 DataTable table = getdata();

34 clientSock.Send(SerializeData(table));

35

36 sock.Close();

37 clientSock.Close();

38 startButton.Text = "&Start Server";

39 Application.DoEvents();

40 }

42 public byte[] SerializeData(Object o)

43 {

44 MemoryStream ms = new MemoryStream();

45 BinaryFormatter bf1 = new BinaryFormatter();

46 bf1.Serialize(ms, o);

47 return ms.ToArray();

48 }

50 /*Ở đây tôi tạo 1 bảng dữ liệu thử.

51 Bạn có thể kết nối csdl và load dữ liệu lên*/

52 private DataTable getdata()

53 {

54 DataTable dt = new DataTable();55 DataRow dr;

57 dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));

58 dt.Columns.Add(new DataColumn("StringValue", typeof(string)));

59 dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime)));

60 dt.Columns.Add(new DataColumn("BooleanValue", typeof(bool)));

62 for (int i = 1; i <= 1000; i++)

63 {

64 dr = dt.NewRow();

65 dr[0] = i;

66 dr[1] = "Item " + i.ToString();

Page 4: Gửi và nhận DataTable qua Socket trong C

67 dr[2] = DateTime.Now;

68 dr[3] = (i % 2 != 0) ? true : false;70 dt.Rows.Add(dr);

71 }

72 return dt;73 }

74 }

75 }

Biên dịch chương trình sau đó mở thư mục bin/Debug để chạy tập tin SocketServer.exe. Nhấn

nút Start Server để bắt đầu chạy server. Mỗi lần gửi xong phải nhấn nút start một lần. Bạn có thể

dùng Threading để cho nó chạy liên tục, tuy nhiên bạn sẽ phải xem đến phương thức SendAsync

của socket.

2. Ở phía Client: Bạn Thêm 1 project khác có tên SocketClient vào Solution. Thêm vào 1

textbox để nhập server address, một nút nhấn để nhận dữ liệu. Thiết kế như sau

Source code cho form này như sau:

01 using System;

02 using System.Collections.Generic;

03 using System.ComponentModel;

04 using System.Data;

05 using System.Drawing;

06 using System.Text;

07 using System.Windows.Forms;

08 using System.IO;

09 using System.Net;

10 using System.Net.Sockets;

Page 5: Gửi và nhận DataTable qua Socket trong C

11

12 using System.Runtime.Serialization;

13 using System.Runtime.Serialization.Formatters.Binary;

14

15 namespace SocketClient

16 {

17 public partial class Form1 : Form

18 {

19 public Form1()

20 {

21 InitializeComponent();

22 }

23

24 public object DeserializeData(byte[] theByteArray)

25 {

26 MemoryStream ms = new MemoryStream(theByteArray);

27 BinaryFormatter bf1 = new BinaryFormatter();

28 ms.Position = 0;

29 return bf1.Deserialize(ms);

30 }

31

32 private void receiveButton_Click(object sender, EventArgs e)

33 {

34 try

35 {

36 IPAddress[] ipAddress = Dns.GetHostAddresses(serverTextBox.Text);

37 IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse("127.0.0.1"),5656);

38Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);

39 clientSock.Connect(ipEnd);

40 byte[] data = new byte[1024 * 5000];

Page 6: Gửi và nhận DataTable qua Socket trong C

41 clientSock.Receive(data);

42 DataTable dt = (DataTable)DeserializeData(data);

43 dataGridView1.DataSource = dt;

44 clientSock.Close();

45 }

46 catch (Exception ex)

47 {

48 MessageBox.Show(ex.Message);

49 }

50 }

51 }

52 }

Kết quả sau khi nhấn nút nhận dữ liệu

Full Source Code: download here

Em áp dụng Threading cho Server để có thể kết nối với nhiều Server và không làm cho

lớp giao diện bị treo.

Nhưng vì về kĩ thuật Threading em chưa nắm rõ lắm, nói chung là còn rất kém. Khi em

nhấn nút Start thì nó sẽ sinh ra Thread chờ yêu cầu của Client. Vì Thread này em muốn

dùng để kết nối với nhiều Client nên em để trong vòng lặp while(true), cụ thể như sau:

public partial class StartServer : Form

{

.....................................................

private void btstart_Click(object sender, EventArgs e)

{

Page 7: Gửi và nhận DataTable qua Socket trong C

new Thread(new ThreadStart(Listening)).Start();

}

private void Listening()

{

IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2011);

TcpListener server = new TcpListener(ip);

server.Start();

while (true)

{

TcpClient client = server.AcceptTcpClient();

new SocketServer(client);

}

}

}

class SocketServer

{

private TcpClient client;

public SocketServer(TcpClient client)

{

this.client = client;

new Thread(new ThreadStart(Processing)).Start();

}

private void Processing()

{

//

// Xử lý trao đổi dữ liệu với Client

//

}

}

01 using System;

02 using System.Threading;

03

04 public class Worker

05 {

06 // This method will be called when the thread is started.

07 public void DoWork()

08 {

09 while (!_shouldStop)

10 {

Page 8: Gửi và nhận DataTable qua Socket trong C

11 Console.WriteLine("worker thread: working...");

12 }

13 Console.WriteLine("worker thread: terminating gracefully.");

14 }

15 public void RequestStop()

16 {

17 _shouldStop = true;

18 }

19 // Volatile is used as hint to the compiler that this data

20 // member will be accessed by multiple threads.

21 private volatile bool _shouldStop;

22 }

23

24 public class WorkerThreadExample

25 {

26 static void Main()

27 {

28 // Create the thread object. This does not start the thread.

29 Worker workerObject = new Worker();

30 Thread workerThread = new Thread(workerObject.DoWork);

31

32 // Start the worker thread.

33 workerThread.Start();

34 Console.WriteLine("main thread: Starting worker thread...");

35

36 // Loop until worker thread activates.

37 while (!workerThread.IsAlive);

38

39 // Put the main thread to sleep for 1 millisecond to

40 // allow the worker thread to do some work:

41 Thread.Sleep(1);

Page 9: Gửi và nhận DataTable qua Socket trong C

42

43 // Request that the worker thread stop itself:

44 workerObject.RequestStop();

45

46 // Use the Join method to block the current thread

47 // until the object's thread terminates.

48 workerThread.Join();

49 Console.WriteLine("main thread: Worker thread has terminated.");

50 }

51 }

Thầy giúp dùm em,em làm bài tập chat giữa client,em thấy tài liệu nào cũng như code

trên,nhưng khi em chạy và nhấn button listen thì báo ở dòng newsock.Bind(iep

001 public class RationalNumber

002 {

003 private int numerator, denominator;

004

005 //-----------------------------------------------------------------

006 // Constructor: Sets up the rational number by ensuring a nonzero

007 // denominator and making only the numerator signed.

008 //-----------------------------------------------------------------

009 public RationalNumber(int numer, int denom)

010 {

011 if (denom == 0)

012 denom = 1;

013

014 // Make the numerator "store" the sign

015 if (denom < 0)

016 {

017 numer = numer * -1;

018 denom = denom * -1;

019 }

Page 10: Gửi và nhận DataTable qua Socket trong C

020

021 numerator = numer;

022 denominator = denom;

023

024 reduce();

025 }

026

027 //-----------------------------------------------------------------

028 // Returns the numerator of this rational number.

029 //-----------------------------------------------------------------

030 public int Numerator

031 {

032 get

033 {

034 return numerator;035 }

036 }

037

038 //-----------------------------------------------------------------

039 // Returns the denominator of this rational number.

040 //-----------------------------------------------------------------

041 public int Denominator

042 {

043 get

044 {

045 return denominator;

046 }

047 }

048

049 //-----------------------------------------------------------------

Page 11: Gửi và nhận DataTable qua Socket trong C

050 // Returns the reciprocal of this rational number.

051 //-----------------------------------------------------------------

052 public RationalNumber reciprocal()

053 {

054 return new RationalNumber(denominator, numerator);055 }

056

057 //-----------------------------------------------------------------

058 // Adds this rational number to the one passed as a parameter.

059 // A common denominator is found by multiplying the individual

060 // denominators.

061 //-----------------------------------------------------------------

062 public RationalNumber add(RationalNumber op2)

063 {

064 int commonDenominator = denominator * op2.Denominator;

065 int numerator1 = numerator * op2.Denominator;

066 int numerator2 = op2.Numerator * denominator;

067 int sum = numerator1 + numerator2;

068

069 return new RationalNumber(sum, commonDenominator);

070 }

071

072 //-----------------------------------------------------------------

073 // Subtracts the rational number passed as a parameter from this

074 // rational number.

075 //-----------------------------------------------------------------

076 public RationalNumber subtract(RationalNumber op2)

077 {

078 int commonDenominator = denominator * op2.Denominator;

079 int numerator1 = numerator * op2.Denominator;

080 int numerator2 = op2.Numerator * denominator;

081 int difference = numerator1 - numerator2;

Page 12: Gửi và nhận DataTable qua Socket trong C

082

083 return new RationalNumber(difference, commonDenominator);

084 }

085

086 //-----------------------------------------------------------------

087 // Multiplies this rational number by the one passed as a

088 // parameter.

089 //-----------------------------------------------------------------

090 public RationalNumber multiply(RationalNumber op2)

091 {

092 int numer = numerator * op2.Numerator;

093 int denom = denominator * op2.Denominator;

094

095 return new RationalNumber(numer, denom);

096 }

097

098 //-----------------------------------------------------------------

099 // Divides this rational number by the one passed as a parameter

100 // by multiplying by the reciprocal of the second rational.

101 //-----------------------------------------------------------------

102 public RationalNumber divide(RationalNumber op2)

103 {

104 return multiply(op2.reciprocal());105 }

106

107 //-----------------------------------------------------------------

108 // Determines if this rational number is equal to the one passed

109 // as a parameter. Assumes they are both reduced.

110 //-----------------------------------------------------------------

111 public override bool Equals(object obj)

112 {

Page 13: Gửi và nhận DataTable qua Socket trong C

113 RationalNumber op2 = (RationalNumber)obj;

114 return (numerator == op2.Numerator &&

115 denominator == op2.Denominator);

116 }

117

118 //-----------------------------------------------------------------

119 // Returns this rational number as a string.

120 //-----------------------------------------------------------------

121 public String toString()

122 {

123 String result;

124

125 if (numerator == 0)

126 result = "0";

127 else

128 if (denominator == 1)129 result = numerator + "";

130 else

131 result = numerator + "/" + denominator;

132

133 return result;

134 }

135

136 //-----------------------------------------------------------------

137 // Reduces this rational number by dividing both the numerator

138 // and the denominator by their greatest common divisor.

139 //-----------------------------------------------------------------

140 private void reduce()

141 {

142 if (numerator != 0)

143 {

Page 14: Gửi và nhận DataTable qua Socket trong C

144 int common = gcd(Math.Abs(numerator), denominator);

145

146 numerator = numerator / common;

147 denominator = denominator / common;

148 }

149 }

150

151 //-----------------------------------------------------------------

152 // Computes and returns the greatest common divisor of the two

153 // positive parameters. Uses Euclid's algorithm.

154 //-----------------------------------------------------------------

155 private int gcd(int num1, int num2)

156 {

157 while (num1 != num2)

158 if (num1 > num2)

159 num1 = num1 - num2;

160 else

161 num2 = num2 - num1;

162

163 return num1;

164 }

165 }

thầy cho em hỏi: em làm game cờ vua chơi qua mạng client bằng wpf, em tạo mạng

client chat được với nhau.nhưng khi ấn new game thì nó bị nỗ doi hàm Case không nhận

ra câu lệnh mà . em gắn giá tri khi ấn “new game” =sendPacket(“N”). thầy có thể sửa cho

em được khôg ah

private void SendData(IAsyncResult iar)

{

Socket remote = (Socket)iar.AsyncState;

int sent = remote.EndSend(iar);

}

public void sendPacket(string packet)

Page 15: Gửi và nhận DataTable qua Socket trong C

{

try

{

byte[] Sent = Encoding.ASCII.GetBytes(packet);

socket.BeginSend(Sent, 0, Sent.Length, 0, new AsyncCallback(SendData), socket);

}

catch (SocketException e)

{

state = StateConnection.Breaken;

}

}

private void ReceiveData()

{

int recv;

string packData = “”;

try

{

while (true)

{

recv = socket.Receive(data);

packData = Encoding.ASCII.GetString(data, 0, recv);

if (packData.ToString().Equals(“”))

return;

if (packData.StartsWith(“@”))

{

AddChatMessage(packData.ToString());

}

else

{

switch (packData.ToString())

{

case “N”:

{

SetStatusMessage1(“Người chơi đã sẵn sàng…!”);

batdau();

} break;

Page 16: Gửi và nhận DataTable qua Socket trong C

case “X”:

{

SetStatusMessage1(“Người chơi đã thoát game…!”);

//oat();

state = StateConnection.Breaken;

} break;

}

}

}

}

catch (Exception ex)

{

SetStatusMessage(“ReceiveData ” + ex.Message.ToString());

}

}

Page 17: Gửi và nhận DataTable qua Socket trong C

C# – Lập trình Socket giao tiếp TCP client/serverThứ Tư, Tháng Sáu 22, 2011 — Yin Yang

3 Votes

Trong lập trình, Socket là một API (Application Programming Interface)

cung cấp các phương thức để giao tiếp thông qua mạng. Trước khi bắt đầu tìm hiểu và viết một ví dụ

đơn giản về socket, bạn có thể tham khảo bài viết “Networking – Một số khái niệm cơ bản“ để có cái

nhìn sơ lược về những khái niệm cơ bản trong lập trình mạng.

Các lớp .Net cơ bản trong lập trình mạngCác lớp này được cung cấp trong hai namespace System.Net và System.Net.Sockets. Hai namespace

này chứa rất nhiều lớp dùng trong lập trình mạng, nhưng trong phạm vi bài viết ta chỉ quan tâm đến các

lớp sau::

Class Namespace Desciption

IPAddress System.Net Provides an Internet Protocol (IP) address.

IPEndPoint System.Net Represents a network endpoint as an IP address and a port

number.

TcpListener System.Net.Sockets Listens for connections from TCP network clients.

Socket System.Net.Sockets Implements the Berkeley sockets interface.

TcpClient System.Net.Sockets Provides client connections for TCP network services.

NetworkStream System.Net.Sockets Provides the underlying stream of data for network access.

Kết nối Server-Client với TCP/IPKhi được chạy, server cần được xác định rõ địa chỉ IP và sẽ “lắng nghe” trên một port cụ thể. Server sẽ

nằm trong trạng thái này cho đến khi client gửi đến một yêu cầu kết nối. Sau khi được server chấp

nhận, một connection sẽ hình thành cho phép server và client giao tiếp với nhau.

Cụ thể hơn, các bước tiến hành trên server và client mà ta cần thực hiện sử dụng giao thức TCP/IP

trong C# (có thể chạy server và client trên cùng một máy):

Server:

1. Tạo một đối tượng System.Net.Sockets.TcpListener để bắt đầu “lắng nghe” trên một cổng cục

bộ.

2. Đợi và chấp nhận kết nối từ client với phương thức AccepSocket(). Phương thức này trả về một

đối tượng System.Net.Sockets.Socket dùng để gửi và nhận dữ liệu.

3. Thực hiện giao tiếp với client.

4. Đóng Socket.

Thông thường quy trình này sẽ được đặt trong một vòng lặp (lặp lại bước 2) để chấp nhận nhiều kết nối

cùng lúc (sử dụng Thread) hoặc các kết nối lần lượt.

Client:

1. Tạo một đối tượng System.Net.Sockets.TcpClient

2. Kết nối đến server với địa chỉ và port xác định với phương thức TcpClient.Connect()

Page 18: Gửi và nhận DataTable qua Socket trong C

3. Lấy luồng (stream) giao tiếp bằng phương thức TcpClient.GetStream().

4. Thực hiện giao tiếp với server.

5. Đóng luồng và socket.

Quy trình này có thể được minh họa theo mô hình sau:

Example v1: Gửi nhận dữ liệu dạng byte[]Lớp NetworkStream và Socket cung cấp các phương thức gửi và nhận dữ liệu dạng mảng byte. Vì vậy

bạn cần phải thực hiện các bước chuyển đổi dữ liệu sang dạng byte và ngược lại. Trong ví dụ sau tôi sử

dụng dữ liệu dạng văn bản ASCII trong console, và dùng các lớp trong namespace System.Text để

chuyển đổi. Có hai cách bạn có thể áp dụng:

- Dùng các static property của lớp abstract System.Text.Encoding với các phương thức GetString() và

GetBytes().

- Tạo đối tượng có kiểu XXXEncoding (thừa kế từ System.Text.Encoding). Ví dụ: UTF8Encoding,

ASCIIEncoding,…

Một ví dụ gửi nhận dữ liệu đơn giản nhất sử dụng TCPListener, Socket (phía server) và TCPClient,

NetworkStream (phía client) dạng mảng byte với địa chỉ loop-back 127.0.0.1 trên cùng một máy.

Tạo hai dự án console là Y2Server và Y2Client với nội dung sau:

Y2Server.cs (v1):

Page 19: Gửi và nhận DataTable qua Socket trong C

view source

print?

01 using System;

02 using System.Text;

03 using System.Net;

04 using System.Net.Sockets;

05

06 public class Y2Server {

07

08 private const int BUFFER_SIZE=1024;

09 private const int PORT_NUMBER=9999;

10

11 static ASCIIEncoding encoding=new ASCIIEncoding();

12

13 public static void Main() {

14 try {

15 IPAddress address = IPAddress.Parse("127.0.0.1");

16

17 TcpListener listener=new TcpListener(address,PORT_NUMBER);

18

19 // 1. listen

20 listener.Start();

21

22 Console.WriteLine("Server started on "+listener.LocalEndpoint);

23 Console.WriteLine("Waiting for a connection...");

24

25 Socket socket=listener.AcceptSocket();

26 Console.WriteLine("Connection received from " + socket.RemoteEndPoint);

27

28 // 2. receive

29 byte[] data=new byte[BUFFER_SIZE];

Page 20: Gửi và nhận DataTable qua Socket trong C

30 socket.Receive(data);

31

32 string str=encoding.GetString(data);

33

34 // 3. send

35 socket.Send(encoding.GetBytes("Hello "+str));

36

37 // 4. close

38 socket.Close();

39 listener.Stop();

40

41 }

42 catch (Exception ex) {

43 Console.WriteLine("Error: " + ex);

44 }

45 Console.Read();

46 }

47 }

Y2Client.cs (v1):

view source

print?

01 using System;

02 using System.IO;

03 using System.Net;

04 using System.Text;

05 using System.Net.Sockets;

06

07 public class Y2Client{

08

09 private const int BUFFER_SIZE=1024;

10 private const int PORT_NUMBER=9999;

11

Page 21: Gửi và nhận DataTable qua Socket trong C

12 static ASCIIEncoding encoding= new ASCIIEncoding();

13

14 public static void Main() {

15

16 try {

17 TcpClient client = new TcpClient();

18

19 // 1. connect

20 client.Connect("127.0.0.1",PORT_NUMBER);

21 Stream stream = client.GetStream();

22

23 Console.WriteLine("Connected to Y2Server.");

24 Console.Write("Enter your name: ");

25

26 string str = Console.ReadLine();

27

28 // 2. send

29 byte[] data=encoding.GetBytes(str);

30

31 stream.Write(data,0,data.Length);

32

33 // 3. receive

34 data =new byte[BUFFER_SIZE];

35 stream.Read(data,0,BUFFER_SIZE);

36

37 Console.WriteLine(encoding.GetString(data));

38

39 // 4. Close

40 stream.Close();

41 client.Close();

42 }

Page 22: Gửi và nhận DataTable qua Socket trong C

43

44 catch (Exception ex) {

45 Console.WriteLine("Error: " + ex);

46 }

47

48 Console.Read();

49 }

50 }

Để kiểm tra ví dụ, bạn chạy server trước, cửa sổ console của server sẽ hiển thị:

Server started on 127.0.0.1:9999

Waiting for a connection…

Tiếp đến cho chạy client, nếu kết nối thành công, server sẽ hiển thị thêm dòng thông báo tương tự như

sau:

Connection received from 127.0.0.1:2578

Chuyển qua cửa sổ console của client và nhập tên của bạn vào, nếu nhận được dữ liệu, server sẽ gửi

trả lại dòng thông điệp “Hello [Your Name]”

Connected to Y2Server.

Enter your name: Yin Yang

Hello Yin Yang

Ngay sau bước này, cả server và client đều thực hiện đóng kết nối.

Example v2: Sử dụng StreamReader và StreamWriterSẽ tiện lợi hơn nếu ta sử dụng StreamReader và StreamWriter để gửi nhận dữ liệu mà không cần bước

chuyển đổi qua lại mảng byte. Các đối tượng StreamReader và StreamWriter có thể được khởi tạo trực

tiếp từ NetworkStream. Thuộc tính AutoFlush của StreamWriter thường được đặt là true để tự động gửi

dữ liệu mà không cần đợi bộ đệm đầy hoặc bạn phải gọi thủ công phương thức Flush().

Ví dụ sau sử dụng vòng lặp để thực hiện gửi nhận dữ liệu liên tục giữa server/client cho đến khi client

nhập vào chuỗi “exit”:

Y2Server.cs (v2):

01 using System;

02 using System.IO;

03 using System.Net;

04 using System.Net.Sockets;

05 using System.Text;

06

07 public class Y2Server {

08

09 private const int BUFFER_SIZE=1024;

10 private const int PORT_NUMBER=9999;

Page 23: Gửi và nhận DataTable qua Socket trong C

11

12 static ASCIIEncoding encoding=new ASCIIEncoding();

13

14 public static void Main() {

15 try {

16 IPAddress address = IPAddress.Parse("127.0.0.1");

17

18 TcpListener listener=new TcpListener(address,PORT_NUMBER);

19

20 // 1. listen

21 listener.Start();

22

23 Console.WriteLine("Server started on "+listener.LocalEndpoint);

24 Console.WriteLine("Waiting for a connection...");

25

26 Socket socket=listener.AcceptSocket();

27 Console.WriteLine("Connection received from " + socket.RemoteEndPoint);

28

29 var stream = new NetworkStream(socket);

30 var reader=new StreamReader(stream);

31 var writer=new StreamWriter(stream);

32 writer.AutoFlush=true;

33

34 while(true)

35 {

36 // 2. receive

37 string str=reader.ReadLine();

38 if(str.ToUpper()=="EXIT")

39 {

40 writer.WriteLine("bye");

41 break;

Page 24: Gửi và nhận DataTable qua Socket trong C

42 }

43 // 3. send

44 writer.WriteLine("Hello "+str);

45 }

46 // 4. close

47 stream.Close();

48 socket.Close();

49 listener.Stop();

50 }

51 catch (Exception ex) {

52 Console.WriteLine("Error: " + ex);

53 }

54 Console.Read();

55 }

56 }

Y2Client.cs (v2):

01 using System;

02 using System.IO;

03 using System.Net;

04 using System.Text;

05 using System.Net.Sockets;

06

07 public class Y2Client{

08

09 private const int BUFFER_SIZE=1024;

10 private const int PORT_NUMBER=9999;

11

12 static ASCIIEncoding encoding= new ASCIIEncoding();

13

14 public static void Main() {

15

16 try {

17 TcpClient client = new TcpClient();

Page 25: Gửi và nhận DataTable qua Socket trong C

18

19 // 1. connect

20 client.Connect("127.0.0.1",PORT_NUMBER);

21 Stream stream = client.GetStream();

22

23 Console.WriteLine("Connected to Y2Server.");

24 while(true)

25 {

26 Console.Write("Enter your name: ");

27

28 string str = Console.ReadLine();

29 var reader=new StreamReader(stream);

30 var writer=new StreamWriter(stream);

31 writer.AutoFlush=true;

32

33 // 2. send

34 writer.WriteLine(str);

35

36 // 3. receive

37 str=reader.ReadLine();

38 Console.WriteLine(str);

39 if(str.ToUpper()=="BYE")

40 break;

41 }

42 // 4. close

43 stream.Close();

44 client.Close();

45 }

46

47 catch (Exception ex) {

48 Console.WriteLine("Error: " + ex);

49 }

Page 26: Gửi và nhận DataTable qua Socket trong C

50

51 Console.Read();

52 }

53 }

Bạn chạy ví dụ này giống như ví dụ đầu tiên và gõ ‘exit’ vào client để thoát ứng dụng

SocketTCP - Chat qua lại giữa Client và Server.

Chạy trên cùng một máy nhé. Nếu 2 mấy tình chỉnh IPEnpoint lại.

Trên client gõ date để server trả về ngày tháng năm.

Gõ byby để thoát server và client

Server:

Code:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.Net.Sockets;

namespace SocketServer

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("------------------------

Server-----------------------------");

Console.WriteLine(" Chuong trinh chat 2 may voi nhau

");

Console.WriteLine(" Luu y: 1 ben goi va ben kia phai tra loi moi goi tiep

duoc");

Console.WriteLine("-----------------------------------------------------------");

Console.WriteLine("---------------------Sunboy--

2mit.org----------------------");

//tao soc ket

IPEndPoint ipserver = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5302);

Socket server = new

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

//bind

server.Bind(ipserver);

//listen

server.Listen(10);

Console.WriteLine("Chuan bi ket noi!");

Socket client = server.Accept();

Page 27: Gửi và nhận DataTable qua Socket trong C

Console.WriteLine("Chap nhan ket noi tu:

{0}",client.RemoteEndPoint.ToString());

// string s;

byte[] data = new byte[1024];

string s = "Ket noi thanh cong den Server. Bat dau chat";

//Chuyen chuoi s thanh mang byte

//byte[] data = new byte[1024];

data = Encoding.ASCII.GetBytes(s);

client.Send(data,data.Length,SocketFlags.None);

string input;

while (true)

{

data = new byte[1024];

int nhan = client.Receive(data);

s = Encoding.ASCII.GetString(data,0,nhan);

if (s.Equals("byby"))

break;

Console.WriteLine("Client: {0}",s);

input = Console.ReadLine();

data = new byte[1024];

data = Encoding.ASCII.GetBytes(input);

client.Send(data, data.Length, SocketFlags.None);

}

client.Shutdown(SocketShutdown.Both);

client.Close();

server.Close();

}

}

}

Client:

Code:

using System;

using System.Collections.Generic;

using System.Text;

using System.Net;

using System.Net.Sockets;

namespace SocketClient

{

class Program

{

static void Main(string[] args)

{

Page 28: Gửi và nhận DataTable qua Socket trong C

Console.WriteLine("-------------------------

Client------------------------");

Console.WriteLine(" Chuong trinh chat 2 may voi nhau

");

Console.WriteLine(" Luu y: 1 ben goi va ben kia phai tra loi moi goi tiep

duoc");

Console.WriteLine("-----------------------------------------------------------");

Console.WriteLine("---------------------Sunboy--

2mit.org----------------------");

//int a;

//int p;

IPEndPoint ipenpointclient = new

IPEndPoint(IPAddress.Parse("127.0.0.1"),5302);

//IPEndPoint ipenpointclient = new IPEndPoint(a, 5302);

//Console.WriteLine("Moi nhap ip server: ");

//Console.ReadLine(IPAddress.Parse(a));

Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,

ProtocolType.Tcp);

client.Connect(ipenpointclient);

byte[] data = new byte[1024];

int nhan = client.Receive(data);

// data = "Chao client";

string s = Encoding.ASCII.GetString(data,0,nhan);

Console.WriteLine(s);

string input;

string ngay;

while (true)

{

input = Console.ReadLine();

data = new byte[1024];

data = Encoding.ASCII.GetBytes(input);

client.Send(data,data.Length,SocketFlags.None);

data = new byte[1024];

nhan = client.Receive(data);

s = Encoding.ASCII.GetString(data, 0, nhan);

if (s.Equals("getdate"))

{

input = DateTime.Now.ToString("dd/MM/yyyy");

data = new byte[1024];

data = Encoding.ASCII.GetBytes(input);

client.Send(data, data.Length, SocketFlags.None);

} if (s.Equals("byby") || input.Equals("byby"))

break;

Console.WriteLine("Server: {0}",s);

Page 29: Gửi và nhận DataTable qua Socket trong C

}

client.Disconnect(true);

client.Close();

}

}

}