Gửi và nhận DataTable qua Socket trong C
-
Upload
kien-luongcong -
Category
Documents
-
view
315 -
download
10
Transcript of 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:
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);
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();
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;
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];
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)
{
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 {
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);
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 }
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 //-----------------------------------------------------------------
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;
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 {
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 {
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)
{
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;
case “X”:
{
SetStatusMessage1(“Người chơi đã thoát game…!”);
//oat();
state = StateConnection.Breaken;
} break;
}
}
}
}
catch (Exception ex)
{
SetStatusMessage(“ReceiveData ” + ex.Message.ToString());
}
}
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()
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):
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];
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
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 }
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;
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;
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();
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 }
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();
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)
{
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);
}
client.Disconnect(true);
client.Close();
}
}
}